之前的项目使用数据库时,是自己手动写的,性能,代码编写程度上都比较不理想。后来发现有第三方的开源数据库,查询了一番,主流的有GreenDao、Ormlite、Realm,看网上教程对比发现都说GreenDao性能上比较优异,所以就选择了GreenDao。
废话不多说,直接开干,先放下github地址,直接动手。
等下还是先别干,还是先简单说一下greendao的使用,数据库表的创建是根据我们编写的实体类进行创建的,如果你新建一个User类,
然后通过各种注解,设置表名,字段名,主键等,然后greendao会自动帮我们创建数据库表,生成数据库操作类。
好了 现在可以开干了
先是集成项目,在工程的主project的build.gradle目录的dependencies下添加如下代码
//GreenDao3
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
在repositories下添加maven依赖
mavenCentral() // add repository
具体样式如下图
然后在app的build.gradle下的顶部添加plugin
apply plugin: 'org.greenrobot.greendao' // apply plugin
在dependencies中引入greendao
implementation 'org.greenrobot:greendao:3.2.2' // add library
如下图位置
对greendao的配置文件进行配置
greendao {
schemaVersion 1 //版本
daoPackage '修改成你的包名.db'// 设置DaoMaster、DaoSession、Dao 包名
targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录
}
其中 schemaVersion是数据库版本,起始版本是1,如果后期数据库升级,在表中添加字段等,需修改版本号。
daoPackage是数据库操作类存放的地址,一般是包名+db,这个地址是用处是greendao会自动帮你创建数据库生成类xxxDao,数据库操作类xxxMaster,和xxxSession,这三个类的存放地址,比如我的是
daoPackage 'com.lee.greendao.db'
就会在我的包名com.lee.greendao下的db包下存放这三个类,具体如下图
当添加这个配置文件的时候是不会创建这个包的,也不会出现这三个类,因为我们的实体类还没有创建,greendao还不知道我们创建的数据库名,表名,字段啥的,下一步我们就创建实体类,让greendao帮我们生成数据库表。
创建实体类 PrintStatusEntity
@Entity(nameInDb = "PrintStatusEntity")
public class PrintStatusEntity {
@Id(autoincrement = true)
private Long id;//id自增长
@Unique
@NotNull
private String orderNum;//订单号
private String printData;//打印数据
private long addTime;//添加时间
private long updateTime;//最后操作时间
private int errorType;//异常类型
private int currentStatus;//当前任务打印状态
private int uploadCount; //上传服务器次数
private long lastUploadTime;//最新上传时间
private int operateTimes;//该串码失败后重复操作次数
}
先不看注解 就是一个正常的实体bean类
然后我们看下注解
@Entity 声明实体类,表示它将映射为数据表,也就是加上这个注解后这个类就会被创建成数据库表,后
面(nameInDb = "PrintStatusEntity")声明的是表的名称可以随意些,
我的表名就是PrintStatusEntity,如果不声明的话默认就是实体类的名称
@Id 声明id,表的主键,使用Long类型,(autoincrement = true)表示自增长。
@Unique 表示该属性在数据库中只能有唯一值
@NotNull 表示该值不能为空
@Transient 该属性不会被存入数据库中
其他一些常用的注解
@Transient 该属性不会被存入数据库中
@Property 可以自定义字段名,注意外键不能使用该属性
@index 定义索引,可以跨越多个列
@ToOne 表示一对一关系
@OrderBy 更加某一字段排序 ,例如:@OrderBy(“date ASC”)
@ToMany 定义一对多个实体对象的关系
然后makeproject,greendao就会自动帮我们生成数据库操作的三个类。
此时就能在db包下看到三个类了。
接着我们就要初始化数据库了,greendao的官方文档里建议让我们的初始化操作放在application里操作
那我们就放在application里初始化好了
public class MApplication extends Application {
//数据库名称
private String DATABASE_NAME = "bgsc_android_client.db";
public DaoSession daoWritableSession;
@Override
public void onCreate() {
super.onCreate();
//加载数据库
initGreenDao();
}
private void initGreenDao() {
DaoMaster.OpenHelper openHelper = new DaoMaster.DevOpenHelper(getApplicationContext(), DATABASE_NAME);
DaoMaster daoMaster = new DaoMaster(openHelper.getWritableDb());
daoWritableSession = daoMaster.newSession();
}
//获取PrintStatus表的dao
public PrintStatusEntityDao getPrintStatus() {
if (daoWritableSession == null)
return null;
return daoWritableSession.getPrintStatusEntityDao();
}
}
此时就会在 bgsc_android_client.db 这个数据库下创建一个表名为PrintStatusEntity的表
然后我们就可以操作数据库了
插入数据
private void inster() {
//获取dao
MApplication mApplication = (MApplication) getApplication();
PrintStatusEntityDao dao = mApplication.getPrintStatus();
//模拟 插入的数据
PrintStatusEntity entity = new PrintStatusEntity();
entity.setOrderNum("orderNum111");
entity.setAddTime(System.currentTimeMillis());
entity.setPrintData("printData");
entity.setCurrentStatus("打印中...");
//插入数据表
dao.insert(entity);
//插入数据库表中
// dao.insertOrReplace(entity);
// //插入数据表中
// dao.save(entity);
}
我们看到插入有三种方法insert,insertOrReplace,save。当然其实还有很多insertInTx通过事务插入,我们这说的是这三种大的区别
insert:就是插入数据,当插入重复数据时会抛出异常,即重复的id和重复的被@Unique唯一性注解的字段时会抛出异常。
save:也是插入,但是当插入重复数据的时候,不会报错而是更新当前数据库的内容,但是这个仅限于同一个PrintStatusEntity对象,如果插入新new的PrintStatusEntity对象时也会报错。
insertOrReplace: 从字面立即就是插入或者替换,如果数据库中没有该数据增加该条数据,有的话会替换该数据。
查询数据: 查询表中全部数据,通过id查询指定数据
private void query() {
//获取dao
MApplication mApplication = (MApplication) getApplication();
PrintStatusEntityDao dao = mApplication.getPrintStatus();
//查询全部
List<PrintStatusEntity> printStatusEntities = dao.loadAll();
for (int i = 0; i < printStatusEntities.size(); i++) {
}
//通过id查询
// PrintStatusEntity load = dao.load(id);
}
删除数据
private void delete() {
//获取dao
MApplication mApplication = (MApplication) getApplication();
PrintStatusEntityDao dao = mApplication.getPrintStatus();
//删除所有数据
dao.deleteAll();
// //通过id删除
// Long id = 12L;
// dao.deleteByKey(id);
}
更新数据:
private void revise() {
//获取dao
MApplication mApplication = (MApplication) getApplication();
PrintStatusEntityDao dao = mApplication.getPrintStatus();
PrintStatusEntity entity = new PrintStatusEntity();
entity.setOrderNum("num2");
entity.setId(1L);
entity.setCurrentStatus("打印完成");
dao.update(entity);
}
ojbk
基本操作就是这些了。