前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GreenDAO快速入门

GreenDAO快速入门

作者头像
g小志
发布2018-09-11 17:29:31
8170
发布2018-09-11 17:29:31
举报
文章被收录于专栏:Android常用基础Android常用基础
前言

之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的差异。只停留在会使用的阶段。说起来也是惭愧。本文的重点也是在于如何快速使用。不会进行较深的探究。


GreenDAO:

介绍:对象关系映射的数据库(ORM)

GreenDAO

官网地址

  • 优点
  1. 性能高,号称Android最快的关系型数据库
  2. 内存占用小
  3. 库文件小,编译时间短
  4. 支持数据库加密
  5. API简介易用

说了他的优点,那么我们来看下如何使用。


  • 导入 首先在Project下的build.gradle中添加如下:
代码语言:javascript
复制
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
    }
}

...

在App中的build.gradle添加如下:

代码语言:javascript
复制
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'

android {
  ...//省略
}

dependencies {

    ...//省略
    compile 'org.greenrobot:greendao:3.2.0'
}

  • 注解
实体@Entity注解
  1. schema:告知GreenDao当前实体属于哪个schema
  2. active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
  3. nameInDb:在数据中使用的别名,默认使用的是实体的类名
  4. indexes:定义索引,可以跨越多个列
  5. createInDb:标记创建数据库表
基础属性注解
  1. @Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
  2. @Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb="name")
  3. @NotNul:设置数据库表当前列不能为空
  4. @Transient :添加次标记之后不会生成数据库表的列
索引注解
  1. @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
  2. @Unique:向数据库列添加了一个唯一的约束
关系注解

@ToOne:定义与另一个实体(一个实体对象)的关系 @ToMany:定义与多个实体对象的关系 这里只是取出一些具有代表性的注解,想了解更多请查看上面官方文档地址


在了解了基本的注解后我们来看下如何具体使用:

  1. 首先创建的我们的实体类
代码语言:javascript
复制
@Entity
public class User {

    @Id
    private Long id;
    private String name;
    private int age;
    private String sex;
}

创建完成后需要Rebuild Project,之后User会变成:

代码语言:javascript
复制
@Entity
public class User {

    @Id
    private Long id;
    private String name;
    private int age;
    private String sex;

    public User(String name, int age, String sex) {//自己添加的构造方法,并非GreenDAO生成的
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Generated(hash = 689493095)
    public User(Long id, String name, int age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Generated(hash = 586692638)
    public User() {
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return this.sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

}

同时会生成3个类:

图片.png

UserDao:我们的增删改查都是通过他来完成的。 DaoSession:用来注册UserDao,提供创建UserDao的方法 DaoMaster:主要是用来创建DaoSession和一些更新,创建,删除表的一些炒作 里面的源码不多,有兴趣的可以看下。 剩下的我们就来具体看下我们和进行输出操作:

代码语言:javascript
复制
public class DBManager {
    public static DBManager instance;

    private DaoMaster.DevOpenHelper mOpenHelper = null;
    private static final String DB_NAME = "test_db";
    private Context context;

    private DBManager(Context context) {
        this.context = context;
    }

    public static DBManager getInstance(Context context) {
        if (instance == null) {
            synchronized (DBManager.class) {
                if (instance == null) {
                    instance = new DBManager(context);
                }
            }
        }
        return instance;
    }

    public SQLiteDatabase getReadableDatabase() {
        if (mOpenHelper == null) {
            mOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME);
        }
        return mOpenHelper.getReadableDatabase();
    }

    public SQLiteDatabase getWritableDatabase() {
        if (mOpenHelper == null) {
            mOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME);
        }
        return mOpenHelper.getWritableDatabase();
    }

    //保存一个User
    public void saveUser(User user) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        userDao.save(user);//与userDao.insert()大致相同区别在于如果不存在就插入,存在就Update修改

    }

    //保存User集合
    public void saveUserOrList(List<User> users) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        userDao.saveInTx(users);
    }

    //保存多个User
    public void saveUserOrUsers(User... users) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        userDao.saveInTx(users);
    }

    public void deleteUser(User user) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        userDao.delete(user);
    }

    public void deleteUserById(Long id) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        userDao.deleteByKey(id);
    }

    public void updateUser(User user) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        userDao.update(user);
    }

    public List<User> queryBySex(String sex) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        QueryBuilder<User> queryBuilder = userDao.queryBuilder();
        List<User> users = queryBuilder.where(UserDao.Properties.Sex.eq(sex)).list();
        return users;
    }
    public List<User> query() {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        List<User> users = userDao.queryBuilder().build().list();
        return users;
    }
    public List<User> queryByAge(int age) {
        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
        DaoSession session = daoMaster.newSession();
        UserDao userDao = session.getUserDao();
        QueryBuilder<User> queryBuilder = userDao.queryBuilder();
        List<User> users = queryBuilder.offset(1)
                .limit(3)
                .orderAsc(UserDao.Properties.Age)
                .where(UserDao.Properties.Age.eq(age))
                .build()
                .list();
        return users;
    }

    public void updateDatabase(int version) {
        mOpenHelper.onUpgrade(getWritableDatabase(), 1, version);
    }
}

需要注意的是在升级数据库的时候回将原来的数据删除,可能会造成丢失推荐学习文章

GreenDAO的大部分操作都有这里。对于更高级的用法还需要大家自己去学习和探索,毕竟本文的核心和题目一样,快速入门。 为了方便学习推荐一篇文章greenDAO 3.2 初探或者查阅官网地址

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.11.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • GreenDAO:
    • 实体@Entity注解
      • 基础属性注解
        • 索引注解
          • 关系注解
          相关产品与服务
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档