LitePal

LitePal

最新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=?", "王五")
    }
}

閱讀原文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,150評論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,616評論 19 139
  • 相信我,當(dāng)你用上 LitePal 之后,你將再也不想去碰 SQLiteDatabase 了。 LitePal是一款...
    七分小熊貓閱讀 3,279評論 1 6
  • 因?yàn)閺奈凑业揭粋€(gè)人比我還愛自己 也未找到一個(gè)人讓我比愛自己更愛他 故而 單身
    僅此一家的胡太太閱讀 305評論 0 1
  • 窗外天不亮 小鳥兒又開始 一如既往的聯(lián)歡演唱 嘰嘰喳喳 嘰嘰喳喳 你亂如麻的心事 因它們歡快地叫聲 被拋向九霄云外...
    云水禪心ZLM閱讀 207評論 4 4

友情鏈接更多精彩內(nèi)容