第三方开源库:数据库:GreenDao

参考:
GreenDao3.0学习(一)
GreenDao3.0学习(二)
GreenDao3.0学习(三)
github : https://github.com/greenrobot/greenDAO

简介

GreenDao是一个用于Android开发的对象/关系映射(ORM)工具。它向SQLite数据库提供了一个对象导向的接口。主要是将对象映射到SQLite数据库中,GreenDao3.0是greendao的一个新的版本。

真机中没看到数据库文件,查了网上资料,可能是手机没有root就看不到我们创建的数据库。

步骤

  • 配置GreenDao
  • 创阿数据库管理类
  • 增删改查

Step1:配置GreenDao

步骤

  • 配置project的build.gradle
  • 配置module的build.gradle
  • 新建实体类
  • make project 点小锤子

Step1-1:配置project的build.gradle

也可以把这个配置代码放在module的build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
    }
}

Step1-2:配置module的build.gradle

GreenDao含义
schemaVersion数据库版本号
daoPackagedao所在的包名
targetGenDir自动生成的数据库文件的目录

如果上面不指定目录的话,数据库文件就会生成到build/generated/source/greendao下面,还需要拷贝到自己的目录中,所以这里还是指定生成目录为好。

apply plugin: 'org.greenrobot.greendao'


dependencies {
    compile 'org.greenrobot:greendao:3.2.0'
}

greendao{
    schemaVersion=1
    daoPackage 'com.cqc.greendao05.dao.gen'
    targetGenDir 'src/main/java'
}

Step1-3:新建实体类

这里写图片描述

Step1-4:小锤子

点击小锤子(make project)会生成3个数据库管理类:DaoMaster``DaoSession``PersonInfoDao,以及PersonInfogets and sets

这里写图片描述 或: 这里写图片描述

这里写图片描述

这里写图片描述

Step2:创阿数据库管理类

public class GreenDaoManager {

    private DaoMaster.DevOpenHelper helper;
    private DaoMaster daoMaster;
    private DaoSession daoSession;
    private static GreenDaoManager greenDaoManager;

    private GreenDaoManager() {
        helper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "GreenDao_DB");
        daoMaster = new DaoMaster(helper.getWritableDb());
        daoSession = daoMaster.newSession();
    }

    public static GreenDaoManager getInstance() {
        if (greenDaoManager == null) {
            greenDaoManager = new GreenDaoManager();
        }
        return greenDaoManager;
    }

    public DaoMaster.DevOpenHelper getDevOpenHelper() {
        return helper;
    }

    public DaoMaster getDaoMaster() {
        return daoMaster;
    }

    public DaoSession getDaoSession() {
        return daoSession;
    }

    public void closeDB() {
        if (helper != null) {
            helper.close();
        }
    }
}

并在Application中初始化,别忘了在AndroidManifest.xml中配置name

public class MyApplication extends Application {

    private static Context context ;
    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
        GreenDaoManager.getInstance();
    }

    public static Context getContext() {
        return context;
    }
}

Step3:增删改查

dao是增删改查的操作类

PersonInfoDao dao = GreenDaoManager.getDaoSession().getPersonInfoDao();

由于查询用的最多,这里想介绍查询,GreenDao采用了构造这模式
查询结果为集合 :

List<PersonInfo> usersList = dao.queryBuilder().build().list();

查询结果为实体类:where表示条件

PersonInfo info = dao.queryBuilder().where(PersonInfoDao.Properties.Id.eq(id)).build().unique();

增*

PersonInfo info = new PersonInfo(id, name, age);
dao.insert(info);

删除一个对象:

PersonInfo info = dao.queryBuilder().where(PersonInfoDao.Properties.Id.eq(id)).build().unique();
dao.delete(info);

删除多个对象

List<PersonInfo> userList = dao.queryBuilder().where(PersonInfoDao.Properties.Name.eq(name)).build().list();
for (PersonInfo info : userList) {
    dao.delete(info);
}

删除全部数据

dao.deleteAll()

先根据条件查询到数据,再进行修改

String id = et1.getText().toString().trim();
PersonInfo info = dao.queryBuilder().where(PersonInfoDao.Properties.Id.eq(id)).build().unique();

info.setName(info.getName() + "update");
dao.update(info);

注解

注解名称说明
schema使得GreenDao知道当前实体属于哪个schema
active标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
nameInDb在数据中使用的别名,默认使用的是实体的类名
indexes定义索引,可以跨越多个列
createInDb标记创建数据库表
@Entitygreendao的一个实体注解,因为有了它,我们的实体类才回被greendao识别并生成一个dao
@Id主键 Long型(默认是自增长的)也可以通过@Id(autoincrement = true)设置自增长
@NotNull@NotNull 标记后,表示这个属性在数据表中的这一列不能为空
@Transient添加这个标记之后,我们在实体类中的属性不会自动在数据表中生成这个属性表示的这一列
@Unique向数据库列添加了一个唯一的约束
schema使得GreenDao知道当前实体属于哪个schema
active标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
nameInDb在数据中使用的别名,默认使用的是实体的类名
indexes定义索引,可以跨越多个列
createInDb标记创建数据库表
@Property设置一个非默认关系映射所对应的列名,默认是的使用字段名 比如:@Property (nameInDb=”name”)
@Index使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
@ToOne定义与另一个实体(一个实体对象)的关系,即一对一
@ToMany定义与多个实体对象的关系 即一对多
@JoinEntity多对多
referencedJoinProperty指定目标实体中与源实体相对应的外键
joinProperty对于复杂一点的关系可以定义一组@JoinProperty注解。每个@JoinProperty注解都需要有源实体中的源属性和对应实体中的引用属性。

源码:https://git.oschina.net/libraryDemo/GreenDao05

问题

1(table PERSON_INFO has no column named SEX (code 1): …

开始没有sex属性,运行正确,再添加sex属性,点击这里写图片描述,结果报错。

报错截图:
这里写图片描述
报错的信息是:没有sex这一列,但是我已经添加了,无论是PersonInfo,还是PersonInfoDao,都有sex.
这里写图片描述

这里写图片描述

那么问题出在哪里呢。

解决方法:

卸载原app,在运行代码即可解决。所以我觉得是AS的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值