您的位置:首页 > 其它

GreenDao3.2的使用

2017-01-25 13:47 411 查看
1、在app的Gradle中配置:

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
publicvoid
onUpgrade(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

publicvoid
onUpgrade(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);里面的参数是全部的实体类,就是要生成的表。

要生成的表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: