LitePal 数据库3.0使用方法

2020-02-22  本文已影响0人  MaybeSix

简介

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>

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

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 {
    *;
}
上一篇 下一篇

猜你喜欢

热点阅读