05-轻松玩转Android数据库框架

现在有的项目开发中,不可避免的使用到数据库框架,不用自己手写SQL语句,可以直接将对象映射到SQLite数据库中。本文介绍的greenDao、LitePal就是轻量且快速的ORM解决方案,大大提升了我们的开发效率,滴滴滴,开车。

一、greenDao使用指南

greenDAO的github地址:
https://github.com/greenrobot/greenDAO

1、需要在AS中配置一下,才能进行使用
首先gradle引入

dependencies {
    compile 'org.greenrobot:greendao:3.2.2' // add library
}

接着在项目root的build.gradle加入

buildscript {
    repositories {
        jcenter()
        mavenCentral() // add repository
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

最后在app的build.gradle加入:

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin


greendao {
       // 当前数据库结构的版本
        schemaVersion 1  
       //生成的DAO,DaoMaster和DaoSession的包名。默认是实体的包名
        daoPackage 'com.greendao.gen' 
       //生成源文件的路径。默认源文件目录是在build目录中的(build/generated/source/greendao) 
        targetGenDir 'src/main/java'  
}
 
dependencies {
    compile 'org.greenrobot:greendao:3.2.2' // add library
   // This is only needed if you want to use encrypted databases
   //需要加密的时候才引用
    compile 'net.zetetic:android-database-sqlcipher:3.5.6'
}
配置完成后,在AS->build->Make Project后,框架会在targetGenDir 的路径下自动生成使用到的文件。

2、配置完成户即可进行开发工作
新建一个实体类:

@Entity
public class Message {
    @Id
    private Long id;

    private String msg;

    public Long getId() {
        return id;
    }

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

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

新建的实体类,框架会帮我们自动生成MessageDao类

那么接下来我们该如何使用这个MessageDao类呢?

我们可以再全局类中定义一个DaoSession实体,通过这个DaoSession对象去拿各个实体Dao的实例,从而进行相应的操作,具体看代码:

public class App extends Application {
    /** A flag to show how easily you can switch from standard SQLite to the encrypted SQLCipher. */
    public static final boolean ENCRYPTED = true;
    private DaoSession daoSession;
    @Override
    public void onCreate() {
        super.onCreate();
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, ENCRYPTED ? "notes-db-encrypted" : "notes-db");
        Database db = ENCRYPTED ? helper.getEncryptedWritableDb("super-secret") : helper.getWritableDb();
        daoSession = new DaoMaster(db).newSession();
    }
    public DaoSession getDaoSession() {
        return daoSession;
    }
}

接着在需要使用的地方拿到Dao实例

 MessageDao  mDao = ((App) getApplication()).getDaoSession().getMessageDao();
添加
mDao.insert(Message)
查找
查询全部数据
List<Message> msgList = mDao.loadAll();    
查询一条数据
Message msg= mDao.queryBuilder().where(UserDao.Properties.id.eq(888)).unique();
删除
根据条件删除 举例:比如删除id小于或等于6的数据,删除首先得查找
List<Message> msgList = (List<Message>) mDao.queryBuilder().where(MessageDao.Properties.Id.le(6)).build().list();  
        for (Message msg: msgList) {  
               mDao.delete(msg);  
        }  

根据主键删除
mDao.deleteByKey(id);
删除所有数据
mDao.deleteAll();
修改
mDao.update(Message)
数据库升级
修改schemaVersion 2  
重新make project下就行

3、介绍greenDao中的一些注解,方便开发
实体注解:

@Entity(
        // 如果项目中有超过一个的数据库结构,可以通过这个字段来区分
        // 该实体属于哪个数据库结构
        //一般一个用对就对应一个
        schema = "curschema",

        //  实体是否激活的标志,激活的实体有更新,删除和刷新的方法
        active = true,

        // 确定数据库中表的名称
        // 表名称默认是实体类的名称
        nameInDb = "table_message",

        // Define indexes spanning multiple columns here.
        indexes = {
                @Index(value = "name DESC", unique = true)
        },

        // DAO是否应该创建数据库表的标志(默认为true)
        // 如果你有多对一的表,将这个字段设置为false
        // 或者你已经在GreenDAO之外创建了表,也将其置为false
        createInDb = false
)

基础属性注解

@Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
@Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb="name")
@NotNull:设置数据库表当前列不能为空
@Transient :添加次标记之后不会生成数据库表的列

索引注解

@Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
@Unique:向数据库列添加了一个唯一的约束

关系注解

@ToOne:定义与另一个实体(一个实体对象)的关系
@ToMany:定义与多个实体对象的关系

好了,关于greenDao先介绍到这里,这个库针对android系统进行了优化,内存开销小,API也易于使用,大家自行去研究使用吧。

一、LitePal使用指南

LitePal的github地址:
https://github.com/LitePalFramework/LitePal

1、gradle引入,最新版本,到github上自行查看

dependencies {
    compile 'org.litepal.android:core:1.5.1'
}

2、在assets 文件夹中新建并且配置litepal.xml文件

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <!--
        Define the database name of your application. 
        By default each database name should be end with .db. 
        If you didn't name your database end with .db, 
        LitePal would plus the suffix automatically for you.
        For example:    
        <dbname value="demo" />
    -->
    <dbname value="demo" />

    <!--
        Define the version of your database. Each time you want 
        to upgrade your database, the version tag would helps.
        Modify the models you defined in the mapping tag, and just 
        make the version value plus one, the upgrade of database
        will be processed automatically without concern.
            For example:    
        <version value="1" />
    -->
    <version value="1" />

    <!--
        Define your models in the list with mapping tag, LitePal will
        create tables for each mapping class. The supported fields
        defined in models will be mapped into columns.
        For example:    
        <list>
            <mapping class="com.test.model.Reader" />
            <mapping class="com.test.model.Magazine" />
        </list>
    -->
    <list>
    </list>
    
    <!--
        Define where the .db file should be. "internal" means the .db file
        will be stored in the database folder of internal storage which no
        one can access. "external" means the .db file will be stored in the
        path to the directory on the primary external storage device where
        the application can place persistent files it owns which everyone
        can access. "internal" will act as default.
        For example:
        <storage value="external" />
    -->
    
</litepal>

3、配置LitePalApplication,可以继承LitePalApplication

public class MyApplication extends LitePalApplication{

    @Override
    public void onCreate() {
        super.onCreate();
        LitePal.initialize(this);
    }
    ...
}

配置完成后,即可开始开发工作了,滴滴滴。

1、创建实体类,对应数据库中的表,必须继承DataSupport

public class Album extends DataSupport {
    
    @Column(unique = true, defaultValue = "unknown")
    private String name;
    
    private float price;
    
    private byte[] cover;
    
    private List<Song> songs = new ArrayList<Song>();

    // generated getters and setters.
    ...
}
public class Song extends DataSupport {
    
    @Column(nullable = false)
    private String name;
    
    private int duration;
    
    @Column(ignore = true)
    private String uselessField;
    
    private Album album;

    // generated getters and setters.
    ...
}

实体类需要在litepal.xml中配置

<list>
    <mapping class="org.litepal.litepalsample.model.Album" />
    <mapping class="org.litepal.litepalsample.model.Song" />
</list>

2、数据库操作

添加
Album album = new Album();
album.setName("album");
album.setPrice(10.99f);
album.setCover(getCoverImageBytes());
album.save();
查找
根据id查找
Song song = DataSupport.find(Song.class, id);
查找所有
List<Song> allSongs = DataSupport.findAll(Song.class);
条件查找
List<Song> songs = DataSupport.where("name like ?", "song%").order("duration").find(Song.class);
删除
根据id删除
DataSupport.delete(Song.class, id);
根据条件删除
DataSupport.deleteAll(Song.class, "duration > ?" , "350");
修改
查找后修改
Album albumToUpdate = DataSupport.find(Album.class, 1);
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.save();
根据id直接修改
Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.update(id);
根据条件修改
Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.updateAll("name = ?", "album");
数据库异步操作

findAllAsync异步查找数据库,结果在onFinish中返回

DataSupport.findAllAsync(Song.class).listen(new FindMultiCallback() {
    @Override
    public <T> void onFinish(List<T> t) {
        List<Song> allSongs = (List<Song>) t;
    }
});

异步存储数据

Album album = new Album();
album.setName("album");
album.setPrice(10.99f);
album.setCover(getCoverImageBytes());
album.saveAsync().listen(new SaveCallback() {
    @Override
    public void onFinish(boolean success) {

    }
});

litePal是郭霖郭神写的开源框架,大家有兴趣可以看源码进行学习学习。

总结

除了这两个框架,还有其它框架比如ormLite,Realm等,个人认为这两个框架比较好用,老司机们可以搞起了。框架只是方便开发,提升效率,要想提升能力,不能一味的使用框架,需要自己去了解实现原理,当然数据库知识也是基础,也不能不懂吧。不过作为一名砖家,赶紧完成搬砖要紧,后面有时间有兴趣,再去了解!

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,035评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,649评论 18 139
  • 这段时间进行了时间管理的学习,包括主题阅读,参加Angie老师的时间管理训练营。上帝给到每个人的待遇是每天24小时...
    一如减法整理阅读 409评论 0 0
  • 我到今天才开始由衷的对她服心。 从小就是一个嘴上说服,心不服气的孩子。 到今天我是真的服了。 MY Queen,y...
    凌雪懿阅读 538评论 0 1
  • 第12天·21天告别拖延 #玩卡不卡·每日一抽# 每一位都可以通过这张卡片觉察自己: 1、直觉他叫什么名字?赟 2...
    柳谊阅读 223评论 0 0