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 msgList = mDao.loadAll();    
查询一条数据
Message msg= mDao.queryBuilder().where(UserDao.Properties.id.eq(888)).unique();
删除
根据条件删除 举例:比如删除id小于或等于6的数据,删除首先得查找
List msgList = (List) 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文件



    
    

    
    

    
    
    
    
    
    

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 songs = new ArrayList();

    // 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中配置


    
    

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 allSongs = DataSupport.findAll(Song.class);
条件查找
List 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  void onFinish(List t) {
        List allSongs = (List) 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等,个人认为这两个框架比较好用,老司机们可以搞起了。框架只是方便开发,提升效率,要想提升能力,不能一味的使用框架,需要自己去了解实现原理,当然数据库知识也是基础,也不能不懂吧。不过作为一名砖家,赶紧完成搬砖要紧,后面有时间有兴趣,再去了解!

你可能感兴趣的:(05-轻松玩转Android数据库框架)