GreenDAO快速入门

前言

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


GreenDAO:

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

GreenDAO

官网地址

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

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


  • 导入 首先在Project下的build.gradle中添加如下:
// 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添加如下:

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. 首先创建的我们的实体类
@Entity
public class User {

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

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

@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和一些更新,创建,删除表的一些炒作 里面的源码不多,有兴趣的可以看下。 剩下的我们就来具体看下我们和进行输出操作:

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 初探或者查阅官网地址

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的酒和故事

Go实战--golang中使用RethinkDB(gorethink/gorethink.v3)

生命不止,继续go go go !!! 关于golang中操作数据库,曾经介绍了不少: Go实战–go语言操作sqlite数据库(The way to go) ...

5268
来自专栏Jed的技术阶梯

利用Sqoop实现Hive的数据与MySQL数据的互导

注意: 在sqoop-1.4.6以前,从MySQL中导出数据到hive表中,不能指定文件格式为parquet,只能先导入到HDFS,在从HDFS上load p...

8072
来自专栏【转载】DRF+Vue+Mysql_生鲜超市系统

五、商品列表页

在goods文件夹下面新建view_base.py,为了区分django和django rest framework的view

1960
来自专栏一“技”之长

使用iOS原生sqlite3框架对sqlite数据库进行操作

      sqlite数据库是一种小型数据库,由于其小巧与简洁,在移动开发领域应用深广,sqlite数据库有一套完备的sqlite语句进行管理操作,一些常用的...

801
来自专栏开发技术

spring-boot-2.0.3之quartz集成,不是你想的那样哦!

    晚上回家,爸妈正在吵架,见我回来就都不说话了,看见我妈坐在那里瞪着我爸,我就问老爸“你干什么了惹我妈生这么大气?”  我爸说“没有什么啊,倒是你,这么大...

1973
来自专栏老码农专栏

Actframework依赖注入 II - 注入对象类型

1093
来自专栏有趣的django

Django REST framework+Vue 打造生鲜超市(四)

五、商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为...

2K9
来自专栏Ryan Miao

MongoDB - basic

mongoDB basic from:http://www.tutorialspoint.com/mongodb prject:https://github....

3246
来自专栏玩转JavaEE

RestTemplate的逆袭之路,从发送请求到负载均衡

上篇文章我们详细的介绍了RestTemplate发送请求的问题,熟悉Spring的小伙伴可能会发现:RestTemplate不就是Spring提供的一个发送请求...

1.4K4
来自专栏bboysoul

渗透测试工具(KatanaFramework)

katana是一个用python写的渗透测试框架,基于一个简单而全面的架构,供任何人来使用,修改和分享。

1251

扫码关注云+社区

领取腾讯云代金券