导入GreenDAO
1. 引入依赖
- 按照 GitHub 上的说明引入依赖。
2. 设置路径
在build.gradle(Moudule: app)
中设置自定义路径:
android {
// ...
}
// 加入以下这些
greendao {
schemaVersion 1
daoPackage 'com.anye.greendao.gen'
targetGenDir 'src/main/java'
}
-
schemaVersion
: 指定数据库schema
版本号,迁移等操作会用到。 -
daoPackage
:dao
的包名,可以省略,省略时包名默认是@Entity
注解所在的包。 -
targetGenDir
: 生成数据库文件的目录。
简单使用
1. 定义数据类实体
@Entity
public class User {
@Id // @Id注解为SQL数据库左端的列,也是要用到的Key
private Long id;
private String name;
@Transient
private int tempUsageCount; // 非持续,不会存进数据库(非必要,只是用作示例,讲解@Transient)
}
2. 构建
-
Gradle 会生成
DaoMaster
类、DaoSession
类和UserDao
类。
3. 设置数据库
// 数据库的生命周期与要应用程序一致,所以要在Application内设置
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;
}
// 设置数据库
private void setDatabase() {
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该重写 DaoMaster.DevOpenHelper#onUpgrade(),来实现数据库的安全升级。
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-mDatabase", null);
mDatabase = helper.getWritableDatabase();
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
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("查询全部数据==>"+userName);
注解
@Entity
注解
@Entity(
// 如果你有超过一个的数据库结构,可以通过这个字段来区分
// 该实体属于哪个结构
schema = "myschema",
// 实体是否激活的标志,激活的实体有更新,删除和刷新的方法
active = true,
// 确定数据库中表的名称
// 默认情况下,表名称是实体类的名称
nameInDb = "AWESOME_USERS",
// Define indexes spanning multiple columns here.(排序?)
indexes = {
@Index(value = "name DESC", unique = true)
},
// DAO是否应该创建数据库表的标志(默认为true)
// 如果你有多对一的表,将这个字段设置为false
// 或者你已经在GreenDAO之外创建了表,也将其置为false
createInDb = false,
// 是否生成所有属性构造函数,默认构造函数总是会生成的。
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
类型作为数据库的主键,可以设置autoincrement
参数为true
来使得id值一直增长避免重复使用。 -
@Property
注解使你可以使用非默认的列名。否则默认情况下会使用大写加下划线的形式,如customName
会变成CUSTOM_NAME
。 -
@NotNull
注解可以使得某些列名为非Null
,通常是用来使得主键非Null
的。 -
@Transient
注解使得这个属性不会被记录进数据库。 -
@Index
注解是用来设置索引的:-
name
:如果你不喜欢默认生成的名字,可以通过设置参数name = "abc"
,来设置新的索引名。 -
unique
:可以通过设置参数unique = true
,使得此索引唯一。
-
-
@Unique
唯一约束 -
@ToMany
一对多 -
@OrderBy
排序 -
@ToOne
一对一 -
@generated
由 GreenDao 产生的构造函数或方法