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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,465评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • greenDAO greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。它...
    蕉下孤客阅读 16,080评论 18 104
  • 雨季,似乎不走了,房子浸在水里。想起你。 你的房间,我是见过的,一床一柜一桌一椅,抽屉打开,是打火机。 我们从椅从...
    zxjzqn阅读 277评论 0 0
  • 无言无语无落纱, 惊魂惊梦惊晚霞, 残阳残景残入画, 悲词悲句悲自话!
    车尾靠窗阅读 751评论 0 3