★35.GreenDao

導(dǎo)入GreenDAO

1. 引入依賴

  • 按照 GitHub 上的說明引入依賴。

2. 設(shè)置路徑

build.gradle(Moudule: app)中設(shè)置自定義路徑:

android {
    // ...
}
// 加入以下這些
greendao {
    schemaVersion 1
    daoPackage 'com.anye.greendao.gen'
    targetGenDir 'src/main/java'
}
  • schemaVersion: 指定數(shù)據(jù)庫schema版本號,遷移等操作會用到。
  • daoPackage: dao的包名,可以省略,省略時(shí)包名默認(rèn)是@Entity注解所在的包。
  • targetGenDir: 生成數(shù)據(jù)庫文件的目錄。

簡單使用

1. 定義數(shù)據(jù)類實(shí)體

@Entity
public class User {
    @Id                         // @Id注解為SQL數(shù)據(jù)庫左端的列,也是要用到的Key
    private Long id;

    private String name;
    @Transient
    private int tempUsageCount; // 非持續(xù),不會存進(jìn)數(shù)據(jù)庫(非必要,只是用作示例,講解@Transient)
}

2. 構(gòu)建

  • Gradle 會生成DaoMaster類、DaoSession類和UserDao類。

3. 設(shè)置數(shù)據(jù)庫

// 數(shù)據(jù)庫的生命周期與要應(yīng)用程序一致,所以要在Application內(nèi)設(shè)置
public class MyApplication extends Application {
    private SQLiteDatabase mDatabase;
    private DaoSession mDaoSession;
    public static MyApplication instances;

    @Override
    public void onCreate() {
        super.onCreate();
        instances = this;
        setDatabase();
    }

    public static MyApplication getInstances() {
        return instances;
    }

    // 設(shè)置數(shù)據(jù)庫
    private void setDatabase() {
        // 通過 DaoMaster 的內(nèi)部類 DevOpenHelper,你可以得到一個便利的 SQLiteOpenHelper 對象。
        // 可能你已經(jīng)注意到了,你并不需要去編寫「CREATE TABLE」這樣的 SQL 語句,因?yàn)?greenDAO 已經(jīng)幫你做了。
        // 注意:默認(rèn)的 DaoMaster.DevOpenHelper 會在數(shù)據(jù)庫升級時(shí),刪除所有的表,意味著這將導(dǎo)致數(shù)據(jù)的丟失。
        // 所以,在正式的項(xiàng)目中,你還應(yīng)該重寫 DaoMaster.DevOpenHelper#onUpgrade(),來實(shí)現(xiàn)數(shù)據(jù)庫的安全升級。
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-mDatabase", null);
        mDatabase = helper.getWritableDatabase();
        // 注意:該數(shù)據(jù)庫連接屬于 DaoMaster,所以多個 Session 指的是相同的數(shù)據(jù)庫連接。
        DaoMaster daoMaster = new DaoMaster(mDatabase);
        mDaoSession = daoMaster.newSession();
    }

    public DaoSession getDaoSession() {
        return mDaoSession;
    }

    public SQLiteDatabase getDatabase() {
        return mDatabase;
    }
}

4. 使用

  • 獲?。?
    mUserDao = MyApplication.getInstances().getDaoSession().getUserDao();
    
  • 增:
    mUser = new User(null, "username1");
    mUserDao.insert(mUser); //添加一個
    
  • 刪:
    mUserDao.deleteByKey(id);
    
  • 改:
    mUser = new User(null, "username2");
    mUserDao.update(mUser);
    
  • 查:
    List<User> users = mUserDao.loadAll();
    String userName = "";
    for (int i = 0; i < users.size(); i++) {
        userName += users.get(i).getName()+",";
    }
    mContext.setText("查詢?nèi)繑?shù)據(jù)==>"+userName);
    

注解

@Entity注解

@Entity(
        // 如果你有超過一個的數(shù)據(jù)庫結(jié)構(gòu),可以通過這個字段來區(qū)分
        // 該實(shí)體屬于哪個結(jié)構(gòu)
        schema = "myschema",
        //  實(shí)體是否激活的標(biāo)志,激活的實(shí)體有更新,刪除和刷新的方法
        active = true,
        // 確定數(shù)據(jù)庫中表的名稱
        // 默認(rèn)情況下,表名稱是實(shí)體類的名稱
        nameInDb = "AWESOME_USERS",
        // Define indexes spanning multiple columns here.(排序?)
        indexes = {
                @Index(value = "name DESC", unique = true)
        },
        // DAO是否應(yīng)該創(chuàng)建數(shù)據(jù)庫表的標(biāo)志(默認(rèn)為true)
        // 如果你有多對一的表,將這個字段設(shè)置為false
        // 或者你已經(jīng)在GreenDAO之外創(chuàng)建了表,也將其置為false
        createInDb = false,
        // 是否生成所有屬性構(gòu)造函數(shù),默認(rèn)構(gòu)造函數(shù)總是會生成的。
        generateConstructors = true,
        // 是否生成getter和setter
        generateGettersSetters = true
)

用于屬性的注解

@Entity
public class User {
    @Id(autoincrement = true)
    private Long id;
    @Property(nameInDb = "USERNAME")
    private String name;
    @NotNull
    private int repos;
    @Transient
    private int tempUsageCount;
    // ...
}
  • @Id注解使用Long類型作為數(shù)據(jù)庫的主鍵,可以設(shè)置autoincrement參數(shù)為true來使得id值一直增長避免重復(fù)使用。
  • @Property注解使你可以使用非默認(rèn)的列名。否則默認(rèn)情況下會使用大寫加下劃線的形式,如customName會變成CUSTOM_NAME。
  • @NotNull注解可以使得某些列名為非Null,通常是用來使得主鍵非Null的。
  • @Transient注解使得這個屬性不會被記錄進(jìn)數(shù)據(jù)庫。
  • @Index注解是用來設(shè)置索引的:
    • name:如果你不喜歡默認(rèn)生成的名字,可以通過設(shè)置參數(shù)name = "abc",來設(shè)置新的索引名。
    • unique:可以通過設(shè)置參數(shù)unique = true,使得此索引唯一。
  • @Unique 唯一約束
  • @ToMany 一對多
  • @OrderBy 排序
  • @ToOne 一對一
  • @generatedGreenDao 產(chǎn)生的構(gòu)造函數(shù)或方法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容