GreenDao3.2的使用
2017-01-25 13:47
411 查看
1、在app的Gradle中配置:
}
2、在project的Gradle中配置:
3、在app的Gradle配置数据库版本等信息
daoPackage由GreenDao自动生成代码所在的包名,默认的是在项目包下面新建一个gen。
targetGenDir设置自动生成代码的目录
4、在项目中定义实体类
}
注解:
@Entity标识实体类,greenDAO会映射成sqlite的一个表,表名为实体类名的大写形式
@Id标识主键,该字段的类型为long或Long类型,autoincrement设置是否自动增长
@Property标识该属性在表中对应的列名称,nameInDb设置名称
@Transient标识该属性将不会映射到表中,也就是没有这列
@NotNull设置表中当前列的值不可为空
@Convert指定自定义类型(@linkPropertyConverter)
@GeneratedgreenDAO运行所产生的构造函数或者方法,被此标注的代码可以变更或者下次运行时清除
@Index使用@Index作为一个属性来创建一个索引;定义多列索引(@linkEntity#indexes())
@JoinEntity定义表连接关系
@JoinProperty定义名称和引用名称属性关系
@Keep注解的代码段在GreenDao下次运行时保持不变
1.注解实体类:默认禁止修改此类
2.注解其他代码段,默认禁止修改注解的代码段
@OrderBy指定排序
@ToMany定义与多个实体对象的关系
@ToOne定义与另一个实体(一个实体对象)的关系
@Unique向数据库列添加了一个唯一的约束
定义好了之后按ctrl+F9(或者工具栏build下面的MakeProject)对项目进行重新构建,再
daoPackage的目录下就会自动生成代码
5、新建一个类,实例化greenDAO所需要的几个关键对象,DaoMaster,DaoSession,代码如下:
然后在Application中初始化:
现在就可以操作数据库了。
6、数据库的增、删、改、查
首先获得UserDao的对象
增:
7、一对一、一对多关系
greenDAO目前只支持一对一和一对多关系,并不支持多对多关系
一对一:
使用@ToOne标记,joinProperty指定一个字段,如果没有定义,会自动生成一个字段,get方法时自动生成的,使用@Generated标记,代表自动生成的,无需动代码。
一对多(有三种映射形式):
referencedJoinProperty:指定目标实体中与源实体相对应的外键。
JoinProperty:对于复杂一点的关系可以定义一组@JoinProperty注解。每个@JoinProperty注解都需要有源实体中的源属性和对应实体中的引用属性。
@JoinEntity:在做NM多对多映射的时候使用
8、数据库的升级
数据库升级最麻烦的就是数据保存的问题,下面是数据库升级时执行的代码。
第一句注释的话已经告诉我们数据库升级时会删除所有的表,重新创建。所以我们可以自定义一个类继承OpenHelper,在升级时先生成临时表,删除旧表创建新表后,再把临时表的数据导入进去。有牛人已经做出这个项目来了,我就厚颜无耻选择直接用了。
在project的gradle添加
在app的gradle添加:
注意:要是使用的还是greenDAO3.0以前的版本,添加的是
新建一个类
publicclassMySQLiteOpenHelperextendsDaoMaster.OpenHelper{
publicMySQLiteOpenHelper(Contextcontext,Stringname){
super(context,name);
}
publicMySQLiteOpenHelper(Contextcontext,String
name,SQLiteDatabase.CursorFactoryfactory)
{
super(context,name,factory);
}
@Override
publicvoidonUpgrade(SQLiteDatabasedb,int
oldVersion,intnewVersion){
Log.d(“SQLite”,“数据库从”+oldVersion+“升级到”+newVersion);
MigrationHelper.migrate(db,UserDao.class,StudentDao.class);
}
}
在GreenDaoManager修改代码:
要生成的表。
applyplugin:'org.greenrobot.greendao'
dependencies{
compile'org.greenrobot:greendao:3.2.0'
}
2、在project的Gradle中配置:
buildscript{ repositories{ jcenter() mavenCentral() } dependencies{classpath'org.greenrobot:greendao-gradle-plugin:3.2.1' } }
3、在app的Gradle配置
greendao{ schemaVersion1
daoPackage'com.koma.greendao.gen' targetGenDir'src/main/java' }
schemaVersion对应当前数据库版本
daoPackage由GreenDao自动生成代码所在的包名,默认的是在项目包下面新建一个gen。
targetGenDir设置自动生成代码的目录
4、在项目中定义实体类
@Entity
publicclassUser{
@Id(autoincrement=true)
privateLongid;
@Property(nameInDb="USERNAME")
privateStringname;
privateintage;
}
注解:
@Entity标识实体类,greenDAO会映射成sqlite的一个表,表名为实体类名的大写形式
@Id标识主键,该字段的类型为long或Long类型,autoincrement设置是否自动增长
@Property标识该属性在表中对应的列名称,nameInDb设置名称
@Transient标识该属性将不会映射到表中,也就是没有这列
@NotNull设置表中当前列的值不可为空
@Convert指定自定义类型(@linkPropertyConverter)
@GeneratedgreenDAO运行所产生的构造函数或者方法,被此标注的代码可以变更或者下次运行时清除
@Index使用@Index作为一个属性来创建一个索引;定义多列索引(@linkEntity#indexes())
@JoinEntity定义表连接关系
@JoinProperty定义名称和引用名称属性关系
@Keep注解的代码段在GreenDao下次运行时保持不变
1.注解实体类:默认禁止修改此类
2.注解其他代码段,默认禁止修改注解的代码段
@OrderBy指定排序
@ToMany定义与多个实体对象的关系
@ToOne定义与另一个实体(一个实体对象)的关系
@Unique向数据库列添加了一个唯一的约束
定义好了之后按ctrl+F9(或者工具栏build下面的MakeProject)对项目进行重新构建,再
daoPackage的目录下就会自动生成代码
5、新建一个类,实例化greenDAO所需要的几个关键对象,DaoMaster,DaoSession,代码如下:
publicclassGreenDaoManager{
privateDaoMastermDaoMaster;
privateDaoSessionmDaoSession;
privatestaticvolatileGreenDaoManagermInstance=null;
privateGreenDaoManager(){
if(mInstance==null){
DaoMaster.DevOpenHelperdevOpenHelper=new
DaoMaster.DevOpenHelper(App.getContext(),"user.db");
mDaoMaster=newDaoMaster(devOpenHelper.getWritableDatabase());
mDaoSession=mDaoMaster.newSession();
}
}
publicstaticGreenDaoManagergetInstance(){
if(mInstance==null){
synchronized(GreenDaoManager.class){if(mInstance==null){
mInstance=newGreenDaoManager();
}
}
}
returnmInstance;
}
publicDaoMastergetMaster(){
returnmDaoMaster;
}
publicDaoSessiongetSession(){
returnmDaoSession;
}
publicDaoSessiongetNewSession(){
mDaoSession=mDaoMaster.newSession();
returnmDaoSession;
}
}
然后在Application中初始化:
GreenDaoManager.getInstance();
现在就可以操作数据库了。
6、数据库的增、删、改、查
首先获得UserDao的对象
UserDaouserDao=GreenDaoManager.getInstance().getNewSession().getUserDao();
增:
Useruser=newUser(null,name,age,studentId);
userDao.insert(user);
insert(Tentity)当指定主键在表中存在时会发生异常
insertOrReplace(Tentity)当指定主键在表中存在时会覆盖数据
insertInTx(Iterable<T>entities)批量插入数据
删:
Useruser=newUser(null,name,age,studentId);
userDao.delete(user)
delete(Tentity)删除数据
deleteByKey(Kkey)指定主键删除数据
deleteInTx(Iterable<T>entities)批量删除数据
deleteByKeyInTx(Iterable<K>keys)批量按数据删除数据
deleteAll()删除所有数据
改:
Useruser=newUser(id,name,age,studentId);
userDao.update(user);
update(Tentity)修改数据,主键需相同
updateInTx(Iterable<T>entities)批量更新数据
查:
userDao.load(id)
load(Kkey)根据id查找数据
loadByRowId(longrowId)根据行号查找数据
loadAll()查找全部数据
7、一对一、一对多关系
greenDAO目前只支持一对一和一对多关系,并不支持多对多关系
一对一:
privateLongstudentId;
@ToOne(joinProperty="studentId")
privateStudentstudent;
@Generated(hash=313494093)
publicStudentgetStudent(){
Long__key=this.studentId;
if(student__resolvedKey==null||!student__resolvedKey.equals(__key)){
finalDaoSessiondaoSession=this.daoSession;
if(daoSession==<
db2f
/span>null){
thrownewDaoException("EntityisdetachedfromDAOcontext");
}
StudentDaotargetDao=daoSession.getStudentDao();
StudentstudentNew=targetDao.load(__key);
synchronized(this){
student=studentNew;
student__resolvedKey=__key;
}
}
returnstudent;
}
使用@ToOne标记,joinProperty指定一个字段,如果没有定义,会自动生成一个字段,get方法时自动生成的,使用@Generated标记,代表自动生成的,无需动代码。
一对多(有三种映射形式):
@ToMany(referencedJoinProperty="teacherId")
privateList<Teacher>teacherList;
referencedJoinProperty:指定目标实体中与源实体相对应的外键。
@ToMany(joinProperties={
@JoinProperty(name="studentTag",referencedName="teacherTag")
})
privateList<Teacher>teacherList;
JoinProperty:对于复杂一点的关系可以定义一组@JoinProperty注解。每个@JoinProperty注解都需要有源实体中的源属性和对应实体中的引用属性。
@ToMany
@JoinEntity(
entity=Teacher.class,
sourceProperty="teacherId",
targetProperty="id"
)
privateList<Teacher>teacherList;
@JoinEntity:在做NM多对多映射的时候使用
8、数据库的升级
数据库升级最麻烦的就是数据保存的问题,下面是数据库升级时执行的代码。
/**WARNING:DropsalltableonUpgrade!Useonlyduringdevelopment.*/
publicstaticclassDevOpenHelperextendsOpenHelper{
publicDevOpenHelper(Contextcontext,Stringname){
super(context,name);
}
publicDevOpenHelper(Contextcontext,Stringname,CursorFactoryfactory){
super(context,name,factory);
}
@Override
publicvoidonUpgrade(Databasedb,intoldVersion,intnewVersion){
Log.i("greenDAO","Upgradingschemafromversion"+oldVersion+"to"+newVersion+"bydroppingalltables");
dropAllTables(db,true);
onCreate(db);
}
}
第一句注释的话已经告诉我们数据库升级时会删除所有的表,重新创建。所以我们可以自定义一个类继承OpenHelper,在升级时先生成临时表,删除旧表创建新表后,再把临时表的数据导入进去。有牛人已经做出这个项目来了,我就厚颜无耻选择直接用了。
在project的gradle添加
allprojects{
repositories{
jcenter()
maven{url"https://jitpack.io"}
}
}
在app的gradle添加:
compile'com.github.yuweiguocn:GreenDaoUpgradeHelper:v1.3.0'
注意:要是使用的还是greenDAO3.0以前的版本,添加的是
compile'com.github.yuweiguocn:GreenDaoUpgradeHelper:v1.0.1'
新建一个类
publicclassMySQLiteOpenHelperextendsDaoMaster.OpenHelper{
publicMySQLiteOpenHelper(Contextcontext,Stringname){
super(context,name);
}
publicMySQLiteOpenHelper(Contextcontext,String
name,SQLiteDatabase.CursorFactoryfactory)
{
super(context,name,factory);
}
@Override
publicvoidonUpgrade(SQLiteDatabasedb,int
oldVersion,intnewVersion){
Log.d(“SQLite”,“数据库从”+oldVersion+“升级到”+newVersion);
MigrationHelper.migrate(db,UserDao.class,StudentDao.class);
}
}
在GreenDaoManager修改代码:
publicclassGreenDaoManager{
privateDaoMastermDaoMaster;
privateDaoSessionmDaoSession;
privatestaticvolatileGreenDaoManagermInstance=null;
privateGreenDaoManager(){
if(mInstance==null){
//重写MySQLiteOpenHelper数据库升级,数据不丢失
//MyApplication.getContext()上下文表示了数据库存储路径为手机内存
//DEBUG表示是否打印debug
MigrationHelper.DEBUG=true;
MySQLiteOpenHelperhelper=new
MySQLiteOpenHelper(App.getContext(),"user.db",null);
mDaoMaster=newDaoMaster(helper.getWritableDatabase());
mDaoSession=mDaoMaster.newSession();
}
}
publicstaticGreenDaoManagergetInstance(){
if(mInstance==null){
synchronized(GreenDaoManager.class){if(mInstance==null){
mInstance=newGreenDaoManager();
}
}
}
returnmInstance;
}
publicDaoMastergetMaster(){
returnmDaoMaster;
}
publicDaoSessiongetSession(){
returnmDaoSession;
}
publicDaoSessiongetNewSession(){
mDaoSession=mDaoMaster.newSession();
returnmDaoSession;
}
}
注意:migrate(SQLiteDatabasedb,Class...daoClasses);里面的参数是全部的实体类,就是要生成的表。
要生成的表。
相关文章推荐
- greenDAO3.2的使用
- [置顶] 最详细GreenDao3.2的基本使用
- GreenDao3.2数据库使用教程
- 简单使用GreenDao3.2进行增删改查
- GreenDao3.2简单使用
- Android GreenDao3.2配置及使用详解
- GreenDao3.2的使用及使用心得
- GreenDao3.2在AndroidStudio中的配置和初步使用
- GreenDao3.2的基本使用
- GreenDao3.2的使用,让你本地数据库操作坐上了高铁
- Greendao3.2使用
- GreenDao3.2使用宝典
- Android GreenDao3.2配置及使用详解
- Android实战——GreenDao3.2的使用,爱不释手
- Android GreenDao3.2配置及使用详解
- Android实战——GreenDao3.2的使用,爱不释手
- GreenDao3.2使用
- greenDAO3.2的使用
- 用GreenDao3.2,使用数据库so easy!
- GreenDao3.2使用详解(增,删,改,查,升级)