Android LitePal数据库框架的使用详解

SQLite

在Android开发过程中,涉及到数据库方面的我们一般会使用内置的SQLite轻量级数据库。(Android 数据库存储SQLite总结)
为了进一步让我们优雅的使用,又提供了SQLiteOpenHelper(Android SQLiteOpenHelper的使用)帮助我们大大减少使用难度与工作量,对于SQlite你只需要掌握最基本的数据库知识,就能很方便使用。
但是对于今天要讲的LitePal数据库框架来说,即使你完全不懂数据库,也能操作自如。相信你看完这篇文章就再也不会去使用SQLite了。
相信绝大部分读者跟博主一样,使用数据库操作语句过程中最大的痛苦莫过于:没有快捷代码与错误提示。如果出现错误需要一句句查看代码才能找出错误,很头痛。

LitePal

目前最流行的数据库框架莫过于GreenDAO( Android数据库框架GreenDAO的使用&Demo)与Litepal了,都使用的是映射+注解的方式完成数据库操作。
数据库的SQL语言晦涩难懂,就算你很精通它,恐怕也不喜欢经常在代码中去写它吧?而对象关系映射模式则很好地解决了这个问题,它允许我们使用面向对象的方式来操作数据库,从而可以从晦涩难懂的SQL语言中解脱出来。
那相比于GreenDao,Litepal有什么优势呢?

  1. 配置极其简单,这点优势足以击败GreenDao,GreenDao的配置真的繁琐。(LitePal宣称是近乎零配置.)
  2. 极其轻量级,最新版的1.5.1的jar包只有169K。(亲测)
  3. 一劳永逸。配置好xml文件,后面修改,更新数据库极其简单。
  4. 根据官方文档说明可以存储JavaBean对象(可是楼主反复各种尝试,都报错为空,orz 0.0….)

有兴趣的读者可以阅读官方文档:LitePal官方文档

配置

1. 添加依赖

Android studio直接在项目Gradle文件中添加:

dependencies {
    .....
    compile 'org.litepal.android:core:1.5.1'
    .....
}
2. 创建xml文件

在项目src——main目录下新建assets文件夹,然后在assets文件夹下新建litepal.xml文件。
必须是assets命名的文件夹,与litepal命名的xml文件。
编辑litepal.xml内容,如下面内容。

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <!--xxxx数据库名-->
    <dbname value="xxxx"/>
    <!--数据库版本号,初始一般都为1-->
    <version value="1"/>
    <!--数据库表-->
    <list>
    </list>
</litepal>
3. 修改AndroidManifest.xml

由于操作数据库时需要用到Context,而我们显然不希望在每个接口中都去传一遍这个参数,那样操作数据库就显得太繁琐了。因此,LitePal使用了一个方法来简化掉Context这个参数,只需要在AndroidManifest.xml中配置一下LitePalApplication,所有的数据库操作就都不用再传Context了。如下:

<manifest>  
    <application  
        android:name="org.litepal.LitePalApplication"  
        ...  
    >  
    ...  
    </application>  
</manifest>  

有些程序可能会有自己的Application,只需要使自己的Application继承 LitePalApplication即可。
如下:

public class MyApplication extends LitePalApplication {  
    ...  
} 

然后:

<manifest>  
    <application  
        android:name="com.xxxx.MyApplication"  
        ...  
    >  
    ...  
    </application>  
</manifest> 
建表

如同新建JavaBean类,但是如果要操作该数据库必须继承DataSupport。
再一次强调坑爹的事,官方文档的示例是可以存储JavaBean对象的,但是博主各种尝试都GG。很气愤,如有读者看到,请留言指教,谢谢!

public class Album extends DataSupport {
    //默认的数据库主键id,即使没有也会被添加。但是需要getId方法才能获取。
    private int id; 
    //设置默认值。
     //@Column(defaultValue = "unknown")设置默认值。
    //@Column (unique = true) 主键
    //@Column (ignore = true) 忽略,创建数据库不会添加该键
    @Column(defaultValue = "unknown")
    private String name;
    private double price;

    //添加getter与setter构造方法
}

然后编辑litepal.xml文件,在list标签中添加:

....
    <list>
        <!--必须是完整的包名-->
        <mapping class="com.xxxx.Album"/>
    </list>
    ....
初始化

配置完毕,我们只需要在适当的地方添加如下语句。编译启动程序,就能完成数据库与数据表的创建。

  LitePal.initialize(this);

大家可以使用sqlite3工具进行查询。

增删查改

数据库最基本的操作便是增删查改了。

新建一个对象,设置对应的内容,调用save()方法即可。

 Album album = new Album();
  album.setName("Java");
  album.setPrice(111.12);
  album.save();

如果无法调用save方法,请确认是否继承DataSupport。
是不是刷新了你的三观?这么简单?答案是:yes.

删除数据表:

 DataSupport.deleteAll(Album.class);//指定表

删除默认主键id的数据,调用如下代码即可:

DataSupport.delete(Album.class, id);

删除条件数据,如下代码:


DataSupport.deleteAll(Album.class, "price > ?" , "350");

获取一条数据,知道对应id,如下代码:

Album album = DataSupport.find(Album.class, id);

获取全部数据:

List<Album> allAlbum = DataSupport.findAll(Album.class);

获取条件数据:

List<Album> album = DataSupport.where("name like ?", "song%").order("price").find(Album.class);
改(更新)

更改指定id的数据:

Album albumToUpdate = DataSupport.find(Album.class, 1);
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.save();

或者

Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99); // raise the price
albumToUpdate.update(id);

更改指定条件数据:

Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99); // raise the price
albumToUpdate.updateAll("name = ?", "album");

进阶

添加新表

新建JavaBean类,仍然继承DataSupport。
然后编辑litepal.xml文件,在list标签中添加:

....
    <list>
        <!--必须是完整的包名-->
        <mapping class="com.xxxx.Album"/>
        <mapping class="com.xxxx.xxxx"/>
    </list>
    ....
删除数据库
LitePal.deleteDatabase("xxxx");//数据库名
新建数据库

如果需要新建一个数据库。

LitePalDB litePalDB = new LitePalDB("demo2", 1);
litePalDB.addClassName(Singer.class.getName());
litePalDB.addClassName(Album.class.getName());
litePalDB.addClassName(Song.class.getName());
LitePal.use(litePalDB);//指定使用该数据库,litepal.xml里为默认使用的数据库

如果新建一个与litepal.xml中内容一样的数据库。

LitePalDB litePalDB = LitePalDB.fromDefault("newdb");
LitePal.use(litePalDB);//指定使用该数据库
使用默认数据库

如果我们使用了新建的库后,想重新使用默认库,则:

LitePal.useDefault();
异步

有点时候数据库内的数据过多,直接在主线程中操作会造成线程阻塞.
LitePal提供了异步操作的方法:

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) {

    }
});

结语

看完本文,再回想之前写的SQLite语句是不是觉得很累?
反正我是有了LitePal再也不用其他的了。
本文基本参考官方文档,如有不明,请移步:https://github.com/LitePalFramework/LitePal#latest-downloads
也可参考《第一行代码(第二版)》229页使用LitePal操作数据库的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值