在Android开发过程中,涉及到数据库方面的我们一般会使用内置的SQLite轻量级数据库。(Android 数据库存储SQLite总结)
为了进一步让我们优雅的使用,又提供了SQLiteOpenHelper(Android SQLiteOpenHelper的使用)帮助我们大大减少使用难度与工作量,对于SQlite你只需要掌握最基本的数据库知识,就能很方便使用。
但是对于今天要讲的LitePal数据库框架来说,即使你完全不懂数据库,也能操作自如。相信你看完这篇文章就再也不会去使用SQLite了。
相信绝大部分读者跟博主一样,使用数据库操作语句过程中最大的痛苦莫过于:没有快捷代码与错误提示。如果出现错误需要一句句查看代码才能找出错误,很头痛。
目前最流行的数据库框架莫过于GreenDAO( Android数据库框架GreenDAO的使用&Demo)与Litepal了,都使用的是映射+注解的方式完成数据库操作。
数据库的SQL语言晦涩难懂,就算你很精通它,恐怕也不喜欢经常在代码中去写它吧?而对象关系映射模式则很好地解决了这个问题,它允许我们使用面向对象的方式来操作数据库,从而可以从晦涩难懂的SQL语言中解脱出来。
那相比于GreenDao,Litepal有什么优势呢?
有兴趣的读者可以阅读官方文档:LitePal官方文档
Android studio直接在项目Gradle文件中添加:
dependencies {
.....
compile 'org.litepal.android:core:1.5.1'
.....
}
在项目src——main目录下新建assets文件夹,然后在assets文件夹下新建litepal.xml文件。
必须是assets命名的文件夹,与litepal命名的xml文件。
编辑litepal.xml内容,如下面内容。
<litepal>
<dbname value="xxxx"/>
<version value="1"/>
<list>
list>
litepal>
由于操作数据库时需要用到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 allAlbum = DataSupport.findAll(Album.class);
获取条件数据:
List 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 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) {
}
});
看完本文,再回想之前写的SQLite语句是不是觉得很累?
反正我是有了LitePal再也不用其他的了。
本文基本参考官方文档,如有不明,请移步:https://github.com/LitePalFramework/LitePal#latest-downloads
也可参考《第一行代码(第二版)》229页使用LitePal操作数据库的内容。