LitePal 数据库3.0使用方法

简介

LitePal是郭霖大神写的。是一个使用起来非常方便的数据库框架。
项目源码地址:

https://github.com/LitePalFramework/LitePal

以下内容参照郭霖大神给的文档的翻译。

一、初始化

1.1导入依赖

如果你使用Java:

dependencies {
    implementation 'org.litepal.android:java:3.0.0'
}

如果你使用Kotlin:

dependencies {
    implementation 'org.litepal.android:kotlin:3.0.0'
}

1.2创建一个名字为 litepal.xml 的文件

在app/src/main下新建assets/litepal.xml(与java目录平级)
如图:


litepal.xml的位置

然后填写litepal的内容,内容如下

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <!--
        定义应用程序的数据库名称。默认情况下,每个数据库名称应以.db结束。如果你没有名字数据库以.db结束, LitePal将为您自动加上后缀。例如:    
        <dbname value="demo" />
    -->
    <dbname value="demo" />

    <!--
        定义数据库的版本。每一次当你想要数据库升级时,版本标记会有帮助。
        修改模型中定义的映射标签“version”,就使版本值+ 1,数据库的升级将自动处理而不会出现问题。例如:   
        <version value="1" />
    -->
    <version value="1" />

    <!--
        在映射标签列表中定义您的模型,LitePal将会为每个映射类创建表。支持类中字段被映射到列。例如:   
        <list>
            <mapping class="com.test.model.Reader" />
            <mapping class="com.test.model.Magazine" />
        </list>
    -->
    <list>

    </list>
    
    <!--
        定义.db文件的位置。
        “internal”表示.db文件将存储在内部存储的数据库文件夹中,无人可以访问。
        “external”表示.db文件将存储在主外部存储设备上目录的路径中,每个人都可以访问的永久文件。
        默认值为“内部 internal”。 例如:
        <storage value =“external”/>
    -->

    
</litepal>

所以配置文件拥有以下属性:

  • dbname:配置项目的数据库名称。
  • version:数据库的版本。如果你想要升级数据库,那就+1。
  • list:配置映射类,类和数据库中的表映射。
  • storage:配置数据库文件的存储方式,分为内部还是外部存储。内部和外部只能选择一个。

1.3对LitePal初始化

初始化的方式有两种。
第一种是直接在manifest.xml文件中设置application的name属性:

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

第二种是在自己的Application中初始化

<manifest>
    <application
        android:name="com.example.MyApplication"
        ...
    >
        ...
    </application>
</manifest>
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        LitePal.initialize(this);
    }
    ...
}

二、使用方法

2.1 创建表 Create tables

public class Album extends LitePalSupport {
    
    @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 LitePalSupport {
    
    @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>

2.2增加

Java:

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();

Kotlin:

val album = Album()
album.name = "album"
album.price = 10.99f
album.cover = getCoverImageBytes()
album.save()
val song1 = Song()
song1.name = "song1"
song1.duration = 320
song1.album = album
song1.save()
val song2 = Song()
song2.name = "song2"
song2.duration = 356
song2.album = album
song2.save()

2.3删除

若果要删除某一条数据,使用delete()方法:
Java:

LitePal.delete(Song.class, id);

Kotlin:

LitePal.delete<Song>(id)

如果要删除多条记录,使用deleteAll()方法:
Java:

LitePal.deleteAll(Song.class, "duration > ?" , "350");

Kotlin:

LitePal.deleteAll<Song>("duration > ?" , "350")

2.4查询

通过id查询某一条数据

Song song = LitePal.find(Song.class, id);

Kotlin:

val song = LitePal.find<Song>(id)

查询所有数据
Java:

Kotlin:

val allSongs = LitePal.findAll<Song>()

构建复杂查询:
Java:

List<Song> songs = LitePal.where("name like ? and duration < ?", "song%", "200").order("duration").find(Song.class);

Kotlin:

val songs = LitePal.where("name like ? and duration < ?", "song%", "200").order("duration").find<Song>()

2.5更改

最简单的方式就是用save()方法去更新find()方法找到的数据:
Java:

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

Kotlin:

val albumToUpdate = LitePal.find<Album>(1)
albumToUpdate.price = 20.99f // raise the price
albumToUpdate.save()

你也可以通过update()更新某一条数据
Java:

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

Kotlin:

val albumToUpdate = Album()
albumToUpdate.price = 20.99f // raise the price
albumToUpdate.update(id)

使用updateAll()方法更新多条数据
Java:

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

Kotlin:

val albumToUpdate = Album()
albumToUpdate.price = 20.99f // raise the price
albumToUpdate.updateAll("name = ?", "album")

2.6异步操作

数据库操作默认在主线程执行。同时LitePal对所有crud方法支持异步操作。假如想你想对歌曲表进行异步操作,可以这样做:

Java:

LitePal.findAllAsync(Song.class).listen(new FindMultiCallback<Song>() {
    @Override
    public void onFinish(List<Song> allSongs) {
    
    }
});

Kotlin:

LitePal.findAsync<Song>().listen { allSongs ->

}

异步只能使用 findAllAsync() 而不是 findAll()。然后追加 listen() 方法,当操作执行完毕,会被回调至 onFinish() 方法。

异步存储也是一样的操作方法。
Java:

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

    }
});

Kotlin:

val album = Album()
album.name = "album"
album.price = 10.99f
album.cover = getCoverImageBytes()
album.saveAsync().listen { success ->

}

异步只能使用 saveAsync() 而不是 save()。当操作执行完毕,存储结果会被回调至 onFinish() 方法。

三、多数据库支持

3.1多数据库使用

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

将会创建“demo2”数据库,并且创建singer, album 和song表。

如果你只是想创建一个和litepal.xml配置相同的数据库,你可以这样:

LitePalDB litePalDB = LitePalDB.fromDefault("newdb");
LitePal.use(litePalDB);

如果想切换到默认数据库,可以这样操作:

LitePal.useDefault();

可以通过数据库名称删除数据库:

LitePal.deleteDatabase("newdb");

3.2监听数据库的创建和更新

如果你需要监听数据库创建或升级事件,你可以这样做:

LitePal.registerDatabaseListener(new DatabaseListener() {
    @Override
    public void onCreate() {
        // fill some initial data
    }

    @Override
    public void onUpgrade(int oldVersion, int newVersion) {
        // upgrade data in db
    }
});

四、混淆

-keep class org.litepal.** {
    *;
}

-keep class * extends org.litepal.crud.DataSupport {
    *;
}

-keep class * extends org.litepal.crud.LitePalSupport {
    *;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342