LitePal
Android开源数据库框架
资料
Github
设置
导入
- 配置模组的 build.gradle
compile 'org.litepal.android:core:1.5.0'
配置
- assets 目录创建 litepal.xml
- dbname 定义数据库名。默认以 .db 结尾,如未以此结尾,则自动添加。
- version 定义数据库版本。辅助升级数据库。
- list 根据标签 mapping 对应的类创建表,成员变量对应字段。
- storage 定义数据库文件存储的地方,可选 internal 和 external, 默认为 internal
初始化
- 在自定义的Application中初始化
LitePal.initialize(this);
- 或者使用LitePal库的Application
...
基本用法
建表
- 定义 Bean,继承 DataSupport
- id字段可写可不写,默认自动产生
public class Album extends DataSupport {
@Column(unique = true, defaultValue = "unknown") // 唯一,默认值
private String name;
private float price;
private byte[] cover;
private List songs = new ArrayList(); // 关系:对多
// getters/setters
}
public class Song extends DataSupport {
@Column(nullable = false) // 非空
private String name;
private int duration;
@Column(ignore = true) // 忽略
private String uselessField;
private Album album; // 关系:对一
// getters/setters
}
- 修改 litepal.xml
- 获取数据库
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
);
关系
- 定义Bean时定义成员变量,即在建表时自动创建外键
- 对一,成员变量为另一个Bean
- 对多,成员变量为另一个Bean的集合
- 多对多,两个Bean互相定义成员变量为另一Bean的集合
- 数据表删除操作时,自动按外键进行删除
升级
- 修改 Bean
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 songs = new ArrayList();
// getters/setters
}
- 修改 litepal.xml
版本号增加,数据自动保存
- 丢失数据状况
- 注解成员变量
unique = true
- 改变注解
unique = true
- 改变注解
nullable = false
- 注解成员变量
增加
- DataSupport:
saveAll
- Bean:
save
/saveThrows
/saveOrUpdate
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();
修改
- DataSupport:
update
/updateAll
- Bean:
update
/updateAll
/setToDefault
/assignBaseObjId
Album albumToUpdate = DataSupport.find(Album.class, 1); //查找
albumToUpdate.setPrice(20.99f);
albumToUpdate.save(); // 保存
Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f);
albumToUpdate.update(id); // 更新
Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f);
albumToUpdate.updateAll("name = ?", "album"); // 更新所有
Album albumToUpdate = new Album();
albumToUpdate.setToDefault("name"); // 更新为默认值
albumToUpdate.updateAll();
删除
- DataSupport:
delete
/deleteAll
/markAsDeleted
- Bean:
delete
/clearSavedState
- Bean必须是已持久化的对象,否则无效
DataSupport.delete(Song.class, id); // 删除
DataSupport.delete(Song.class); // 删除所有数据
DataSupport.deleteAll(Song.class, "duration > ?" , "350"); // 条件删除
查询
- DataSupport:
find
/findFirst
/findLast
/findAll
/findBySQL
/isExist
- DataSupport:
select
/where
/order
/limit
/offset
查询条件 - Bean:
isSaved
Song song = DataSupport.find(Song.class, id);
Song song = DataSupport.findFirst(Song.class); // 查询第一条
Song song = DataSupport.findLast(Song.class); // 查询最后一条
List allSongs = DataSupport.findAll(Song.class);
List songs = DataSupport.where("name like ?", "song%").order("duration").find(Song.class);
List songs = DataSupport.where("name like ?", "song%").order("duration").limit(3).offset(1).find(Song.class); // 分页查询
// 联合查询,可以查询关联表
Album album = DataSupport.find(Album.class, id, true);
List songs = album.getSongs();
异步
- 大部分方法都有对应的异步方法
// 查询
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) {
}
});
聚合函数
count
/average
/max
/min
/sum
int result = DataSupport.count(Song.class);
int result = DataSupport.where("name like ?", "song%").count(Song.class);
double result = DataSupport.sum(Album.class, "price", double.class);
多库
LitePalDB litePalDB = new LitePalDB("demo2", 1);
litePalDB.addClassName(Singer.class.getName());
litePalDB.addClassName(Album.class.getName());
litePalDB.addClassName(Song.class.getName());
LitePal.use(litePalDB); // 建库
LitePalDB litePalDB = LitePalDB.fromDefault("newdb");
LitePal.use(litePalDB); // 使用 litepal.xml 创建一个新库
LitePal.useDefault(); // 返回默认库
LitePal.deleteDatabase("newdb"); // 删库