最新dependencies
compile 'org.litepal.android:core:1.6.0'
配置litepal.xml
在main目錄下創(chuàng)建assets文件夾,在assets目錄下創(chuàng)建litepal.xml 內(nèi)容如下:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<!--定義數(shù)據(jù)庫名稱。當(dāng)你數(shù)據(jù)庫的名字不是.db結(jié)尾,LitePal會(huì)自動(dòng)加上后綴。-->
<dbname value="DbName" />
<!--數(shù)據(jù)庫版本。每當(dāng)對數(shù)據(jù)庫中的表有所改動(dòng)你就要升級你的數(shù)據(jù)庫,把版本值+1 -->
<version value="1" />
<!--Lite將為每個(gè)類創(chuàng)建表。類中的成員變量將被映射到表中的列 -->
<list>
<mapping class="com.db.app.bean.Student" />
</list>
<!--
Java是一種區(qū)分大小寫的語言,而數(shù)據(jù)庫是不區(qū)分大小寫。
定義的表和列的名稱的時(shí)候。Lite默認(rèn)會(huì)把所有類名和字段名變成小寫.開發(fā)人員可以改變這種默認(rèn)設(shè)置。
"keep" :將保持類中定義的。
"upper" :將把所有類名和字段名變成大寫。
"lower" :使用默認(rèn)值。
建議使用默認(rèn). -->
<cases value="keep" ></cases>
<!--
定義.db文件存儲(chǔ)的地方。
"internal" 是指.db文件將存儲(chǔ)在私有目錄數(shù)據(jù)庫文件夾下,沒有人可以訪問的內(nèi)部存儲(chǔ)。
"external" 是指.db文件將存在外部sd卡下/sdcard/Android/date/<package name>/files/databases,每個(gè)人都可以訪問不安全。
默認(rèn)值 "internal"。-->
<storage value="external" />
</litepal>
初始化
由于操作數(shù)據(jù)庫時(shí)需要用到Context,所以在自定義Application的oncreat()中初始化數(shù)據(jù)庫LitePal.initialize(this)
創(chuàng)建表
/**
* 存儲(chǔ)已讀未讀的id
*/
data class NoticeId(var numId: Int) : DataSupport()
LitePal會(huì)在每個(gè)表中自動(dòng)生成一個(gè)id列,畢竟每張表都一定要有主鍵的,所以當(dāng)存儲(chǔ)一些含有id的數(shù)據(jù),并且要存儲(chǔ)的id和自增的不一樣的時(shí)候要謹(jǐn)慎,要把id存到另外的列中,比如numId等,總之自己創(chuàng)建的表(bean對象)盡量不要含有id.
現(xiàn)在只要你對數(shù)據(jù)庫有任何的操作,NoticeId表就會(huì)被自動(dòng)創(chuàng)建出來。比如說LitePal提供了一個(gè)便捷的方法來獲取到SQLiteDatabase的實(shí)例,如下所示:
QLiteDatabase db = Connector.getDatabase();
為了方便可以在LitePal.initialize(this)后面加上Connector.getDatabase() 這樣就創(chuàng)建了數(shù)據(jù)庫中的表
class App : Application() {
override fun onCreate() {
super.onCreate()
LitePal.initialize(this)
Connector.getDatabase()
}
升級數(shù)據(jù)
有段時(shí)間項(xiàng)目用到數(shù)據(jù)庫存儲(chǔ)一些數(shù)據(jù),看了好多結(jié)果還是感覺郭神的LitePal最好用,下面是1.4.1版本的總結(jié)及用法
http://mp.weixin.qq.com/s/5FMsDWq7mj55iBxpLCNTwg
下面我將繼續(xù)書寫一下LitePal 1.5.0的一些更新的內(nèi)容
1.異步操作數(shù)據(jù)庫
Android官方是建議將所有的數(shù)據(jù)庫操作都放在子線程中進(jìn)行的。所以這一次支持異步操作數(shù)據(jù)庫是LitePal 1.5.0版本的核心功能.
- LitePal中所有的CRUD方法都加入了一個(gè)Async的副本方法。原來的有find()方法,現(xiàn)在多出一個(gè)findAsycn()方法,原來有save()方法,現(xiàn)在多出saveAsync()方法。如果想要進(jìn)行異步數(shù)據(jù)庫操作的時(shí)候,調(diào)用原API相對應(yīng)的Async副本方法就可以了。
- 由于是異步操作,那異步操作的結(jié)果就只能依靠回調(diào)來完成。所以,每一個(gè)Async副本方法的后面添加了一個(gè)listen()方法,專門用于監(jiān)聽異步操作的結(jié)果。
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) {
}
});
這里調(diào)用了findAll()方法的Async副本,也就是findAllAsyc()方法,并串接了一個(gè)listen()方法用于監(jiān)聽查詢結(jié)果。需要注意的是,查詢結(jié)果是使用泛型的方式回調(diào)到onFinish()方法中的,也就是說開發(fā)人員還需要自己做一次向下轉(zhuǎn)型操作才行。回調(diào)到onFinish()方法之后都會(huì)切回到主線程.
2.不存在就存儲(chǔ),已存在就更新
LitePal 1.5.0版本中新增了一個(gè)saveOrUpdate()方法,專門用來處理這種不存在就存儲(chǔ),已存在就更新的需求。
使用saveOrUpdate()方法存儲(chǔ),有就更新 沒有就存:
Person p = new Person();
p.setName("小明");
p.setAge(16);
p.saveOrUpdate("name=?", p.getName());
調(diào)用saveOrUpdate()方法后,LitePal內(nèi)部會(huì)自動(dòng)判斷,如果表中已經(jīng)存在小明這條記錄了,就會(huì)自動(dòng)更新,如果不存在的話,就會(huì)自動(dòng)插入。
當(dāng)然,這個(gè)新增的saveOrUpdate()方法也有它的Async副本。如果你想異步進(jìn)行saveOrUpdate操作,那么只需要這樣寫就可以了:
Person p = new Person();
p.setName("小明");
p.setAge(16);
p.saveOrUpdateAsync("name=?", p.getName())
.listen(new SaveCallback() {
@Override
public void onFinish(boolean success) {
}
});
好了,LitePal 1.5.0版本中最主要的兩大新功能就介紹的差不多了
3.如何升級
升級方式一如既往的簡單,如果你使用的是Android Studio,只需要在build.gradle中修改一下配置即可:
dependencies {
compile 'org.litepal.android:core:1.5.0'
}
1.5.0版本中的所有的功能都是向下兼容的,因此你的升級不用付出任何成本。
kotlin存儲(chǔ)對象
litepal.xml部分不變
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="HelloKotlin" />
<version value="1" />
<list>
<mapping class="lqx.haha.com.hellokotlin.bean.Student" />
</list>
<storage value="external" />
</litepal>
創(chuàng)建一個(gè)kotlin數(shù)據(jù)bean并繼承DataSupport,如果不想創(chuàng)建對象的時(shí)候都初始化一遍,直接在下面寫成:(var name: String = "",var age: Int = 0)即可
data class Student(var name: String,var age: Int) : DataSupport()
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
//普通存儲(chǔ)
Student("張三", 27).save()
val toJson = Gson().toJson(Student("王五", 78))
//saveOrUpdate:沒有就存儲(chǔ),有就直接覆蓋
Gson().fromJson(toJson, Student::class.java).saveOrUpdate("name=?", "王五")
}
}
