本文介绍安卓项目从0集成greenDao到使用增删改查的方法;
就是这么简洁精炼!!!
直接上步骤
一. 添加引用
- 1、app下的build.gradle 文件 ,在 dependencies{} 的最后 添加下面引用:
(请根据SDK编译版本选择使用compile 还是 api 还是 implementation)
implementation 'org.greenrobot:greendao:3.2.2'
- 2、app下的build.gradle 文件 ,在第一行下面,添加下面一行代码:
apply plugin: 'org.greenrobot.greendao'
- 3、app下的build.gradle 文件 ,在 android{} 的最后,添加greendao{} 代码快,配置greendao自动生成文件的路径:
// greendao自定义路径
greendao {
schemaVersion 1
daoPackage 'com.example.mypackage.db.greendao.gen'
targetGenDir 'src/main/java'
}
- 4、项目根目录下的build.gradle文件,在 dependencies{} 中添加如下classpath:
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
- 5、执行make project 或者按 Ctrl + F9,如果配置的正确,会在配置的greendao.gen目录下生成DaoMaster和DaoSession等文件,就算是成功引入了greendao。
下面贴一下gradle文件的截图,供参考一下:
【注释:】greendao自定义路径时,
schemaVersion代表当前数据库的版本,后续需要升级数据库时,修改schemaVersion就可以升级数据库。
daoPackage 是指定greendao自动生成文件的路径,一般放在包名下的 greendao.gen目录。我在项目中为了便于管理,把数据库的bean类和自动生成的文件都放在包名下的db文件夹。
二、通过GreenDao在本地创建数据库
- 1、首先创建一个类 DownloadEntity :
有 @Entity 这个标记的类,greendao才会把它当做字段表解析
@Entity
public class DownloadEntity {
Id是一个自增的索引,可以排序,可以查找,可以覆盖
@Id
Long id;
/**下载开始的位置*/
@Property(nameInDb = "startPos") 用@Property 标记的字段,会被插入数据表
Long startPos;
/**下载结束的位置*/
@Property(nameInDb = "endPos") nameInDb 和字段保持一致,也可以不一致
Long endPos;
/**是否已经完成*/
@Property(nameInDb = "hasFinished")
Boolean hasFinished;
/**下载链接*/
@Property(nameInDb = "downloadUrl")
String downloadUrl;
/**apk版本号*/
@Property(nameInDb = "apkVersion")
String apkVersion;
默认构造,各个字段取默认值或空值。
@Generated不需要加(hash = 一个Long型数值)会自动生成
@Generated
public DownloadEntity() {
}
带参数的构造,可以直接用具体值创建一个对象
@Generated
public DownloadEntity(String threadId, Long startPos, Long endPos, Long blockSize,
Long hasDownSize, Boolean hasFinished, String downloadUrl, String savePath,
String apkVersion) {
this.startPos = startPos;
this.endPos = endPos;
this.hasFinished = hasFinished;
this.downloadUrl = downloadUrl;
this.apkVersion = apkVersion;
}
... /// 此处省略get和set方法,还有toString方法,一般都写全最好。
}
上面类中:
有 @Entity 这个标记的类,greendao才会把它当做字段表解析:
@Entity
public class DownloadEntity {
有@Id 标记的是一个主键,可用于排序和查找替换:
@Id
Long id;
用@Property 标记的字段,会当作数据表的字段使用,字段取nameInDb的值:
@Property(nameInDb = "downloadUrl")
String downloadUrl;
DownloadEntity是被@Entity标记的,所以再次make project的时候,会在greendao.gen目录下新生成DownloadEntityDao文件,里面的 代码都是自动生成,我们不用修改。
- 2、新增GreenDao的管理工具类
为什么要新增管理类呢? 主要为了扩展功能。
GreenDao自动生成的类中,看一下它的升级功能:
如图,升级中只有这么一句话:dropAllTables,根据字义可知,就是把老表直接删除,然后创建新表,这么做是十分不可取的,数据直接就丢失了。所以自定义的Greendao管理类主要是解决这个问题。
/**
* 数据库帮助类
* 复写了数据库升级的方法,使用MigrationHelper代替本地的升级方法
*/
public class GreenDaoHelper extends DaoMaster.OpenHelper {
public GreenDaoHelper(Context context, String name) {
super(context, name);
}
@Override
public void onCreate(Database db) {
super.onCreate(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion > oldVersion) {
try {
/**
* 数据库升级操作,因为数据迁移后需要删除所有老表,所有这里要带上所有的Dao.class文件
* 如果缺少某个Dao,则该Dao数据会丢失
*/
MigrationHelper.migrate(db, DownloadEntityDao.class);
} catch (Exception e) {
Log.e("Exception:", e.getMessage());
}
}
}
}
MigrationHelper类是从别的地方借鉴的,用了很久了,通用性很强。照抄就行。
/**
* 数据库升级帮助类:
* 先建立临时数据表,保存所有数据。
* 然后清除老数据表,建立新数据表。
* 最后把数据从临时表中转移到新表。
* 完成数据库的升级操作。
*/
public final class MigrationHelper {
public static boolean DEBUG