开源Android数据库greendao使用

之前的项目使用数据库时,是自己手动写的,性能,代码编写程度上都比较不理想。后来发现有第三方的开源数据库,查询了一番,主流的有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

基本操作就是这些了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值