Android LitePal第三方库使用详解

   日期:2020-05-24     浏览:82    评论:0    
核心提示:Android LitePal第三方库使用详解引入LitePal库依赖配置litepal.xml文件dbname 数据库名称version 数据库版本号list 列表标签统一管理映射的实体类mapping 实体类映射全路径storage 数据库存储位置配置LitePalApplication开始演示创建表升级表数据存档修改数据删除数据查询数据异步操作多个数据库监听数据库创建或升级代码混淆结语LitePal的Github项目地址引入LitePal库依赖implementation org.lite数据库

Android LitePal第三方库使用详解

  • 引入LitePal库依赖
  • 配置litepal.xml文件
    • dbname 数据库名称
    • version 数据库版本号
    • list 列表标签统一管理映射的实体类
    • mapping 实体类映射全路径
    • storage 数据库存储位置
  • 配置LitePalApplication
  • 开始演示
    • 创建表
    • 升级表
    • 数据存档
    • 修改数据
    • 删除数据
    • 查询数据
    • 异步操作
    • 多个数据库
    • 监听数据库创建或升级
    • 代码混淆
  • 结语

LitePal的Github项目地址

引入LitePal库依赖

implementation 'org.litepal.android:java:3.0.0'

配置litepal.xml文件

在项目的assets文件夹中创建一个文件,并将其命名为litepal.xml。然后将以下代码复制到其中。

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="demo" />
    <version value="1" />
    <list>
    		<mapping class="com.test.model.Reader" />
    		<mapping class="com.test.model.Magazine" />
    <list>
    <!-- <storage value="external" /> -->
</litepal>

dbname 数据库名称

定义应用程序的数据库名称。
默认情况下,每个数据库名称都应该以.db结尾。
如果你没有将你的数据库命名为.db,例如:
<dbname value="demo" />
LitePal会自动为你加上后缀。(指数据库文件)
<dbname value="demo.db" />(效果一样)

version 数据库版本号

定义数据库的版本。
每一次你想要升级数据库,version版本标记会有帮助。
修改您在mapping标记中定义的模型。
使version版本值加1,数据库升级将被自动处理。

list 列表标签统一管理映射的实体类

使用mapping映射标签在列表中定义您的模型,LitePal会这样做:
为每个映射类创建表的支持字段
在模型中定义的将被映射到列(字段)中。

通俗来讲,list标签相当于数据库容器,里面可以有一张表或多张表

mapping 实体类映射全路径

配置映射的实体类。
该实体类需继承LitePalSupport。

storage 数据库存储位置

定义.db文件的位置。
“internal”指的是.db文件将存储在数据库文件夹(databases)的内部存储。
那里没有人可以访问,需要root权限才行。
“external”表示.db文件将存储在到主外部存储设备上的目录的路径。
应用程序将放置任何人都可以操作的数据库文件。
storage标签可省略,“internal”将作为默认值。

配置LitePalApplication

您不希望总是传递上下文参数。为了简化api,只需在AndroidManifest.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 Application {

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

确保尽早调用此方法。在应用程序的onCreate()方法中是可以的。
并始终记住将应用程序上下文用作参数。
不要将Activity或Service的任何实例用作参数,否则可能会发生内存泄漏。

开始演示

配置完成后,您就可以体验这些强大的功能了。

创建表

首先定义模型。例如,您有两个模型,Album和Song。模型定义如下:

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

    // 生成的getter和setter。
    ...
}
public class Song extends LitePalSupport {
	
    @Column(nullable = false)
    private String name;
	
    private int duration;
	
    @Column(ignore = true)
    private String uselessField;
	
    private Album album;

    // 生成的getter和setter。
    ...
}

然后将这些模型添加到litepal.xml的映射列表中:

<list>
    <mapping class="org.litepal.litepalsample.model.Album" />
    <mapping class="org.litepal.litepalsample.model.Song" />
</list>

好的!这些表将在下次操作数据库时生成。例如,获取带有以下代码的SQLiteDatabase:

SQLiteDatabase db = LitePal.getDatabase();

现在表将自动生成的SQLs语句像这样的:

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

升级表

在LitePal中升级表是非常容易的。只要修改您的模型,只要您想:

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

    // 生成的getter和setter。
    ...
}

添加了releaseDate字段,并将price字段注释为忽略。然后在litepal.xml中增加版本号:

<!-- <version value="1" /> -->
<version value="2" />

这些表将在下次操作数据库时更新。releaseDate列将被添加到 album表中,而原来的price列将被删除。除了删除的列之外,album表中的所有数据都将保留。

但有一些升级条件LitePal无法处理,升级表中的所有数据将被清理:

  • 添加一个注释为unique = true的字段。
  • 将字段的注释更改为unique = true。
  • 将字段的注释更改为nullable = false。

请注意以上可能导致数据丢失的情况。

这是因为unique约束不能为空,nullable = false也不能为空,添加了该字段无法一一赋值,所以会清空表。

数据存档

保存API是面向对象的。从LitePalSupport继承的每个模型都可以免费使用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和song2到数据库相关联的表。

修改数据

最简单的方法是使用save()方法来更新由find()找到的记录。

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

从LitePalSupport继承的每个模型还具有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");

删除数据

您可以使用LitePal中的静态delete()方法删除单个记录。

LitePal.delete(Song.class, id);

或者使用LitePal中的静态deleteAll()方法删除多个记录。

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

查询数据

从指定id的song表中查找单个记录。

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

从song表中查找所有记录。

List<Song> allSongs = LitePal.findAll(Song.class);

用流畅查询构造复杂查询。

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

当然也可以使用SQL语句来查询:

Cursor cursor = LitePal.findBySQL("select * from song");

异步操作

默认情况下,每个数据库操作都在主线程上。如果您的操作可能花费了很长的时间,例如保存或查询大量的记录。您可能需要使用异步操作。

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

只需使用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()。它将相册保存到后台的数据库中,保存的结果是回调到onFinish()方法。

多个数据库

如果你的应用需要多个数据库,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配置(litepal.xml)相同的新数据库。您可以用:

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

你可以随时切换回默认数据库,如:

LitePal.useDefault();

并且可以通过指定的数据库名称删除任何数据库,如:

LitePal.deleteDatabase("newdb");

监听数据库创建或升级

如果你需要监听数据库创建或升级事件,并在回调中填充一些初始数据,你可以这样做:

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 {
    *;
}

结语

以上是我翻译的LitePal教程,如有错误请留言指出,对您有帮助麻烦点个赞呗,谢谢!

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服