導(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一對一 -
@generated由 GreenDao 產(chǎn)生的構(gòu)造函數(shù)或方法