LitePal——Android数据库框架完整使用手册
LitePal for Android
LitePal是一个开源的Android库,使开发人员使用SQLite数据库非常简单。您无需编写任何SQL语句就可以完成大部分数据库操作,包括创建或升级表,增、删、改、查操作,合计函数等。LitePal的设置也很简单,您只许5分钟就可以将其集成到您的项目中。
现在就开始体验吧!
功能
- 使用对象关系映射(ORM)模式。
- 几乎零配置(仅有一个配置文件,属性值还非常少)。
- 自动维护所有数据表(例如,创建,更改或删除表)。
- 支持多数据库
- 封装了多种API,是开发者避免了编写SQL语句的烦恼。
- 超实用的查询API。
- 您仍可以通过编写SQL语句进行操作,但封装好的API会更加方便快捷。
- 更多功能,敬请期待。
最新版下载
- litepal-1.5.1.jar (库中包含 *.class 文件)
- litepal-1.5.1-src.jar (库中包含 *.class 文件和 *.java 文件)
快速配置
1. 导入库
使用 Eclipse
- 在上面的部分下载最新的jar。 或浏览所有版本,选择一个下载。
- 把jar文件放在您Android项目的libs目录下。
使用 Android Studio
编辑您的 build.gradle 文件,加入如下依赖:
- dependencies {
- compile 'org.litepal.android:core:1.5.1'
- }
2. 配置 litepal.xml
在您项目中创建“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>
这是唯一的配置文件,并且要配置的属性也非常简单。
- dbname 配置该项目数据库名称
- version 配置数据库版本号。每次您要更新库时,使其值加一。
- list 配置映射类。
- storage 配置数据库文件的存储位置。 值为“internal” 或 “external”。
3. 配置 LitePalApplication
你不详一直传递Context参数。 为了使API变得简单,只需在AnandManManestest.xml中配置LitePalApplication,如下所示:
- <manifest>
- <application
- android:name="org.litepal.LitePalApplication"
- ...
- >
- ...
- </application>
- </manifest>
当然,您可能已经在此配置好了您自己的应用程序,如:
- <manifest>
- <application
- android:name="com.example.MyOwnApplication"
- ...
- >
- ...
- </application>
- </manifest>
这没关系,LitePal也可以接受。 只要在您的程序中调用 LitePal.initialize(context) 即可:
- public class MyOwnApplication extends AnotherApplication {
- @Override
- public void onCreate() {
- super.onCreate();
- LitePal.initialize(this);
- }
- ...
- }
确保尽可能早的调用这个方法。 最好在 onCreate() 方法中调用。并始终记住使用应用程序上下文作为参数。 不要使用任何活动或服务实例作为参数,否则可能会发生内存泄漏。
开始使用
配置成功后,您就可以使用这些功能强大的方法了。
1. 创建数据表
首先建立一个模型。例如您要建立两个模型Album和Song。可以按如下方式定义:
- 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>
好的!数据表会在您下次操作数据库的时候自动创建。例如,使用以下代码获取SQLiteDatabase:
- SQLiteDatabase db = LitePal.getDatabase();
现在这些表会自动生成如下这样的SQL语句:
- CREATE TABLE album (
- id integer primary key autoincrement,
- name text unique default 'unknown',
- price real,
- cover blob
- );
- CREATE TABLE song (
- id integer primary key autoincrement,
- name text not null,
- duration integer,
- album_id integer
- );
2. 更新数据表
使用LitePal更新数据表也非常的简单,只需要吧实例模型修改成您想要的数据就可以:
- public class Album extends DataSupport {
- @Column(unique = true, defaultValue = "unknown")
- private String name;
- @Column(ignore = true)
- private float price;
- private byte[] cover;
- private Date releaseDate;
- private List<Song> songs = new ArrayList<Song>();
- // generated getters and setters.
- ...
- }
已添加releaseDate 字段,并注释了price 字段。 然后增加litepal.xml中的版本号:
- <!--
- 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>
- -->
- <version value="2" ></version>
数据表会在您下次操作数据库的时候自动更新。releasedate 列会被加入到 album 表中,并且 price 列将会被删除掉。album 表中除了被删除的列,其他的数据都依然存在。
但是,对于一些LitePal无法处理的升级条件,升级表中的所有数据将被清除:
- 添加一个注释为unique = true的字段。
- 将字段的注释更改为unique = true。
- 将字段的注释更改为nullable = false。
注意上述导致数据丢失的情况。
3. 保存数据
保存数据的API是面向对象的。从DataSupport继承的每个模型都可以使用save()方法来保存数据:
- Album album = new Album();
- album.setName("album");
- album.setPrice(10.99f);
- album.setCover(getCoverImageBytes());
- album.save();
- Song song1 = new Song();
- song1.setName("song1");
- song1.setDuration(320);
- song1.setAlbum(album);
- song1.save();
- Song song2 = new Song();
- song2.setName("song2");
- song2.setDuration(356);
- song2.setAlbum(album);
- song2.save();
以上操作会将 album, song1 and song2 插入到数据库中并进行关联。
4. 更新数据
最简单的办法,就是先通过find()方法找到待更新的记录,并使用save()方法更新数据:
- Album albumToUpdate = DataSupport.find(Album.class, 1);
- albumToUpdate.setPrice(20.99f); // raise the price
- albumToUpdate.save();
任何一个集成 DataSupport 类的模块都有 update() 和 updateAll() 两个方法。您可以使用指定的ID更新单个记录:
- Album albumToUpdate = new Album();
- albumToUpdate.setPrice(20.99f); // raise the price
- albumToUpdate.update(id);
或者您也可以通过where条件来更新多条记录:
- Album albumToUpdate = new Album();
- albumToUpdate.setPrice(20.99f); // raise the price
- albumToUpdate.updateAll("name = ?", "album");
5. 删除数据
您可以使用DataSupport类中delete()这个静态方法来删除单条记录:
- DataSupport.delete(Song.class, id);
或者使用 deleteAll() 删除多条记录:
- DataSupport.deleteAll(Song.class, "duration > ?" , "350");
6. 查询数据
通过指定ID查询单条记录:
- Song song = DataSupport.find(Song.class, id);
查询某一表中的所有记录:
- List<Song> allSongs = DataSupport.findAll(Song.class);
使用API构建复杂查询:
- List<Song> songs = DataSupport.where("name like ?", "song%").order("duration").find(Song.class);
7. 异步操作
默认情况下,每个数据库操作都在主线程上。如果您的操作可能花费很长时间,例如保存或查询大量记录。 您可能需要使用异步操作。
LitePal支持所有增、删、改、查方法的异步操作。如果要从后台线程的song表中查找所有记录,请使用如下代码:
- DataSupport.findAllAsync(Song.class).listen(new FindMultiCallback() {
- @Override
- public <T> void onFinish(List<T> t) {
- List<Song> allSongs = (List<Song>) t;
- }
- });
只需使用 findAllAsync() 代替 findAll(), 并附加一个listen()方法,操作一旦完成,查找结果将回调到onFinish()方法。
Abd异步保存是完全相同的:
- 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) {
- }
- });
只需使用saveAsync()替代save()。它会将Album异步保存到数据库中,保存结果将回调到onFinish()方法。
8. 多数据库
如果您的应用需要多个数据库,LitePal完全支持它。 您可以在运行时创建任意数量的数据库。 例如:
- LitePalDB litePalDB = new LitePalDB("demo2", 1);
- litePalDB.addClassName(Singer.class.getName());
- litePalDB.addClassName(Album.class.getName());
- litePalDB.addClassName(Song.class.getName());
- LitePal.use(litePalDB);
这将创建一个具有singer,album和song表的demo2数据库。
如果您只想创建一个与litepal.xml配置相同新的数据库,您可以使用以下命令:
- LitePalDB litePalDB = LitePalDB.fromDefault("newdb");
- LitePal.use(litePalDB);
您可以随时切换回默认数据库:
- LitePal.useDefault();
您可以通过指定的数据库名称删除任何数据库:
- LitePal.deleteDatabase("newdb");
LitePal——Android数据库框架完整使用手册的更多相关文章
- Android 数据库框架总结(转)
转自 http://blog.csdn.net/da_caoyuan/article/details/61414626 一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完 ...
- Android 数据库框架总结,总有一个适合你!
一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面.缺点:1.基于反射,效率较低(本人还没有觉得效率低):2.缺少中文翻译文档 jar包 地址:http: ...
- Android 数据库框架OrmLite的使用(一)
在这里记录下最基本的用法,官网上可了解相关的介绍. 1.下载OrmLite jar 在下载android的:ormlite-android-4.48.jar和ormlite-core-4.48.jar ...
- Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite
Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...
- Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包
Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...
- Android 数据库框架ormlite
Android 数据库框架ormlite 使用精要 前言 本篇博客记录一下笔者在实际开发中使用到的一个数据库框架,这个可以让我们快速实现数据库操作,避免频繁手写sql,提高我们的开发效率,减少出错的机 ...
- Android数据库框架-----ORMLite关联表的使用
上一篇已经对ORMLite框架做了简单的介绍:Android数据库框架-----ORMLite 的基本用法~~本篇将介绍项目可能会使用到的一些用法,也为我们的使用ORMLite框架总结出一个较合理的用 ...
- Android数据库框架-----ORMLite 的基本用法
ORMLite 是一款非要流行的Android平台上的数据库框架,性能优秀,代码简洁: 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面. 缺点:1.基于反射,效率较低(本 ...
- DBExecutor android 数据库框架
https://github.com/eltld/DBExecutor android 数据库框架,sqlite database
随机推荐
- mysql数据库表字段使用DESC等关键字报错及解决方法
<!-- desc是MySQL数据库的关键字,作为字段名直接使用会报错 --><sql id="Base_Column"> id,mol,ip,port,n ...
- 【转】nagios使用带url的check_http检测主机
前一段时间在Cu论坛发现一个提问,问题是nagios关于检测主机http服务的.原帖地址http://bbs.chinaunix.net /forum.php?mod=viewthread&t ...
- Lucene:基于Java的全文检索引擎简介
Lucene:基于Java的全文检索引擎简介 Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全文索引应用,而是是一个用J ...
- php之冒泡排序
<?php//冒泡排序function shell_sort($arr){for($i=0;$i<count($arr)-1;$i++){for($j=0; $j< count($a ...
- 使用mybatis从mysql里进行模糊查询的编码问题
关于这个问题,记录下我的解决方法,希望对有同样困惑的朋友,有所帮助. 问题描述: 我在做mybatis从mysql里模糊查询时,如果模糊的关键词是字母的话,可以查出来.如果模糊的关键词是汉字的话,查不 ...
- 初识Python装饰器
python中,一切皆对象.做为面向对象开发中非常重要的一个环节,函数有着无可替代的作用. 函数可以作为对象赋值给一个变量,可以作为元素添加到集合对象中,可以作为参数值传递给其它函数,还可以当做函数的 ...
- BZOJ 3512: DZY Loves Math IV [杜教筛]
3512: DZY Loves Math IV 题意:求\(\sum_{i=1}^n \sum_{j=1}^m \varphi(ij)\),\(n \le 10^5, m \le 10^9\) n较小 ...
- BZOJ 1854: [Scoi2010]游戏 [连通分量 | 并查集 | 二分图匹配]
题意: 有$n \le 10^6$中物品,每种两个权值$\le 10^4$只能选一个,使得选出的所有权值从1递增,最大递增到多少 一开始想了一个奇怪的规定流量网络流+二分答案做法...然而我还不知道怎 ...
- ES6,Array.includes()函数的用法
在ES5,Array已经提供了indexOf用来查找某个元素的位置,如果不存在就返回-1,但是这个函数在判断数组是否包含某个元素时有两个小不足,第一个是它会返回-1和元素的位置来表示是否包含,在定位方 ...
- asp.net core 中 sql server 2017 数据库连接测试
使用sql server 2017 进行连接: 配置appsettings.json文件 { "ConnectionStrings": { "DefaultConnect ...