Android框架(1)| LitePal

本節(jié)目錄

LitePal簡(jiǎn)介

LitePal是一款開源的Android數(shù)據(jù)庫(kù)框架盾戴,采用了對(duì)象關(guān)系映射(ORM)的模式尖啡,將平時(shí)開發(fā)時(shí)最常用的一些數(shù)據(jù)庫(kù)功能進(jìn)行了封裝可婶,使得開發(fā)者不用編寫一行SQL語(yǔ)句就可以完成各種建表援雇、増刪改查的操作惫搏。并且LitePal很“輕”具温,jar包大小不到100k,而且近乎零配置筐赔。

框架地址:https://github.com/LitePalFramework/LitePal

配置LitePal

如果要使用到LitePal框架铣猩,首先就是要添加依賴了,打開app目錄中的的build.gradle茴丰,然后在dependencies閉包中添加:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'org.litepal.android:java:3.0.0'  //添加依賴
}

接著就是需要配置litepal.xml文件了达皿,我們右鍵點(diǎn)擊main—New—Direction,創(chuàng)建一個(gè)assets目錄贿肩,然后在該目錄下新建一個(gè)litepal.xml的文件峦椰,然后修改該文件中的內(nèi)容:

<?xml version="1.0" encoding="utf-8" ?>
<litepal>
    <dbname value="BookStore"></dbname>
    <version value="1"></version>
    
    <list>
    </list>
</litepal>

這里面的屬性來(lái)具體介紹一下汰规,首先是<dbname>汤功,它是指我們要?jiǎng)?chuàng)建的數(shù)據(jù)庫(kù)的名字;<version>則是指我們數(shù)據(jù)庫(kù)的版本號(hào)溜哮;<list>則是我們要指定的映射模型滔金。

最后就是在AndroidManifest.xml中的<application>中配置一下LitaPalApplication了:

 <application
        android:name="org.litepal.LitePalApplication"
......

到這里配置就結(jié)束了,下面我們就來(lái)看一下它的具體用法吧茂嗓!

使用LitePal創(chuàng)建和升級(jí)數(shù)據(jù)庫(kù)

1.創(chuàng)建數(shù)據(jù)庫(kù)

因?yàn)長(zhǎng)itePal采用了對(duì)象關(guān)系映射(ORM)的模式餐茵,因此簡(jiǎn)單來(lái)說(shuō)就是可以讓我們按照面向?qū)ο缶幊痰乃季S來(lái)完成數(shù)據(jù)庫(kù)的操作。所以我們就直接先創(chuàng)建一個(gè)Book類述吸,并在其中添加一些有關(guān)書籍的信息:

package com.example.yzbkaka.litepaltest;


public class Book {
    int id;
    String bookName;
    String author;
    double price;
    int pages;
    
    public int getId(){
        return id;
    }
    
    public String getBookName(){
        return bookName;
    }
    
    public String getAuthor(){
        return author;
    }
    
    public double getPrice(){
        return price;
    }
    
    public int getPages(){
        return pages;
    }
    
    
    public void setId(int id){
        this.id = id;
    }
    
    public void setBookName(String bookName){
        this.bookName = bookName;
    }
    
    public void setAuthor(String author){
        this.author = author;
    }
    
    public void setPrice(double price){
        this.price = price;
    }
    
    public void setPages(int pages){
        this.pages = pages;
    }
}

接著我們來(lái)將Book類添加到litepal.xml當(dāng)中:

 <list>
   <mapping class="package com.example.yzbkaka.litepaltest.Book"></mapping>
  </list>

我們?cè)?lt;list>標(biāo)簽中將我們的Book類的完整路徑給添加進(jìn)去就可以了钟病。

最后我們來(lái)修改主代碼:

package com.example.yzbkaka.litepaltest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import org.litepal.LitePal;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button create = (Button)findViewById(R.id.create);
        create.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LitePal.getDatabase();  //創(chuàng)建數(shù)據(jù)庫(kù)
            }
        });
    }
}

我們先在布局中添加了一個(gè)按鈕,然后為該按鈕添加相應(yīng)的點(diǎn)擊事件刚梭,我們這里是點(diǎn)擊按鈕之后會(huì)創(chuàng)建出我們的“BookStore.dp”數(shù)據(jù)庫(kù)肠阱。這里我們使用的是對(duì)LitePal使用getDatabase()方法來(lái)進(jìn)行創(chuàng)建的。

之后點(diǎn)擊按鈕朴读,即可創(chuàng)建數(shù)據(jù)庫(kù)成功屹徘。同樣我們也可以使用adb shell來(lái)進(jìn)行查看。

2.升級(jí)數(shù)據(jù)庫(kù)

使用LitePal升級(jí)數(shù)據(jù)庫(kù)也是很簡(jiǎn)單的衅金,我們需要在我們創(chuàng)建的類中添加我們想要部分噪伊,然后在litepal.xml中將版本號(hào)加1即可簿煌。

......
   int year;
    
    public int getYear(){
        return year;
    }
    
    public void setYear(int year){
        this.year = year;
    }
......

我們?cè)贐ook類中添加了一個(gè)year常量。接著我們?cè)賮?lái)修改版本號(hào):

<?xml version="1.0" encoding="utf-8" ?>
<litepal>
    <dbname value="BookStore"></dbname>
    <version value="2"></version>

    <list>
        <mapping class="package com.example.yzbkaka.litepaltest.Book"></mapping>
    </list>
</litepal>

我們?cè)谶@里將版本號(hào)增加了1鉴吹,之后我們?cè)俅芜\(yùn)行程序姨伟,點(diǎn)擊按鈕便會(huì)發(fā)現(xiàn)我們的“BookStore”中已經(jīng)有了year這一項(xiàng)了。

LitePal的CRUD操作

LitePal中進(jìn)行CRUD操作的前提是要讓我們的表類繼承自LitePalSupport豆励,所以我們?cè)陂_始先修改我們的Book類代碼:

import org.litepal.crud.LitePalSupport;

public class Book extends LitePalSupport {
    int id;
    String bookName;
    String author;
    double price;
    int pages;
    int year;

    public Book(String errorMessage) {
        super(errorMessage);
    }
......

接著在布局文件中再添加四個(gè)按鈕來(lái)分別表示之后要進(jìn)行的CRUD操作夺荒。

......
 <Button
        android:id="@+id/add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:text="添加數(shù)據(jù)"/>
    <Button
        android:id="@+id/update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:text="更新數(shù)據(jù)"/>
    <Button
        android:id="@+id/delete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:text="刪除數(shù)據(jù)"/>
    <Button
        android:id="@+id/query"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:text="查詢數(shù)據(jù)"/>
......

下面我們就來(lái)對(duì)我們的數(shù)據(jù)庫(kù)進(jìn)行操作吧!

1.添加數(shù)據(jù)

添加數(shù)據(jù)主要是使用Book類繼承而來(lái)的save()方法良蒸。我們直接修改主代碼:

......
 Button add = (Button)findViewById(R.id.add);
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book1 = new Book();
                book1.setBookName("the book 1");
                book1.setAuthor("author 1");
                book1.setPages(200);
                book1.setPrice(16.8);
                book1.setYear(2016);
                book1.save();
                
                Book book2 = new Book();
                book2.setBookName("the book 2");
                book2.setAuthor("author 2");
                book2.setPages(180);
                book2.setPrice(10.8);
                book2.setYear(2017);
                book2.save();
            }
        });
......

我們?cè)谶@里是創(chuàng)建了兩行數(shù)據(jù):book1和book2技扼。我們創(chuàng)建的方法就是按照面向?qū)ο蟮乃季S來(lái)進(jìn)行創(chuàng)建的,即構(gòu)造相應(yīng)的對(duì)象然后調(diào)用其內(nèi)部的方法嫩痰。最后我們就對(duì)每一個(gè)對(duì)象使用save()方法即可添加數(shù)據(jù)成功剿吻。

2.更新數(shù)據(jù)

更新數(shù)據(jù)同樣使用的是繼承而來(lái)的updateAll()方法來(lái)進(jìn)行。我們修改主代碼:

......
 Button update = (Button)findViewById(R.id.update);
        update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book = new Book();
                book.setPrice(18.8);
                book.setYear(2018);
                book.updateAll("bookName = ?","the book 1");
            }
        });
......

我們直接看到updateAll()方法中的參數(shù)串纺,這里使用的參數(shù)和sql語(yǔ)句中的很像丽旅,同樣也是在前面使用占位符?纺棺,然后在后面進(jìn)行具體的限制榄笙。這里我們更新數(shù)據(jù)的具體含義是將bookName為the book 1的書的price改為18.8,year改為2018五辽。

在更新數(shù)據(jù)時(shí)有一個(gè)地方是需要我們特別注意的办斑,就是當(dāng)我們想要把表中的某一列更新為該類型的默認(rèn)值時(shí),是不可以使用上面的set...()方法的杆逗。例如我們想要把year(為int型)改為0乡翅,則我們不能使用book.setYear(0);,因?yàn)閕nt類型的數(shù)據(jù)的默認(rèn)值就是0罪郊。如果我們想要將數(shù)據(jù)更新為默認(rèn)值蠕蚜,我們可以使用setToDefault()方法,例如我們想要把year改成默認(rèn)值:

Book book = new Book();
book.setToDefault("year");
book.updateAll("bookName = ?","the book 1");

我們直接在setToDefault()方法中傳入我們想要修改的列名即可悔橄。

3.刪除數(shù)據(jù)

刪除數(shù)據(jù)需要我們使用LitePal中的靜態(tài)方法deleteAll()方法進(jìn)行操作靶累。我們修改主代碼:

......
Button delete = (Button)findViewById(R.id.delete);
        delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LitePal.deleteAll(Book.class,"price < ?","190");
            }
        });
......

在deleteAll()方法中我們第一個(gè)參數(shù)就是要指定是哪一張表。而后面的參數(shù)就是我們很熟悉的約束條件了癣疟。這里的含義是將Book表中price小于190的數(shù)據(jù)全部刪除挣柬。

4.查詢數(shù)據(jù)

查詢數(shù)據(jù)是使用LitePal中的findAll()方法來(lái)實(shí)現(xiàn)的。我們繼續(xù)修改主代碼:

......
  Button query = (Button)findViewById(R.id.query);
        query.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                List<Book> books = LitePal.findAll(Book.class);
            }
        });
......

findAll()方法需要傳入的參數(shù)就是我們指定要查詢的表睛挚,而它在調(diào)用完之后會(huì)返回一個(gè)Book類型的List邪蛔,這樣我們就成功的將數(shù)據(jù)轉(zhuǎn)移到我們的books列表中了,之后我們只需要調(diào)用get...()方法來(lái)取得數(shù)據(jù)即可扎狱。

除此以外侧到,LitePal中還有許多具體的查詢操作API:

  • findFirst()
    我們只需要傳入要查詢的表作為參數(shù)勃教,即可返回一個(gè)對(duì)象,該對(duì)象中有該表第一行的所有數(shù)據(jù)匠抗。
  • select()
    用于查詢哪幾列的數(shù)據(jù)故源,距離來(lái)說(shuō):
List<Book> books = LitePal.select("bookName","author").find(Book.class);

這段代碼的意思是指查詢Book表中bookName和author這兩列的數(shù)據(jù)。

  • where()
    和sql語(yǔ)句中的where所表示的意思是相同的汞贸,主要是用來(lái)進(jìn)行約束绳军。
List<Book> books = LitePal.select("pages > ?","175").find(Book.class);
  • order()
    用于指定結(jié)果的排列方式,一般傳入desc(降序排列)或者asc(升序排列)著蛙。
List<Book> books = LitePal.order("price desc").find(Book.class);

當(dāng)然還有更多的API删铃,如果想要了解可以去LitePal的官方文檔中查看耳贬。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末踏堡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子咒劲,更是在濱河造成了極大的恐慌顷蟆,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腐魂,死亡現(xiàn)場(chǎng)離奇詭異帐偎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蛔屹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門削樊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人兔毒,你說(shuō)我怎么就攤上這事漫贞。” “怎么了育叁?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵迅脐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我豪嗽,道長(zhǎng)谴蔑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任龟梦,我火速辦了婚禮隐锭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘计贰。我一直安慰自己钦睡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布蹦玫。 她就那樣靜靜地躺著赎婚,像睡著了一般刘绣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挣输,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天纬凤,我揣著相機(jī)與錄音,去河邊找鬼撩嚼。 笑死停士,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的完丽。 我是一名探鬼主播恋技,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逻族!你這毒婦竟也來(lái)了蜻底?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤聘鳞,失蹤者是張志新(化名)和其女友劉穎薄辅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抠璃,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡站楚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搏嗡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窿春。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖采盒,靈堂內(nèi)的尸體忽然破棺而出旧乞,到底是詐尸還是另有隱情,我是刑警寧澤纽甘,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布良蛮,位于F島的核電站,受9級(jí)特大地震影響悍赢,放射性物質(zhì)發(fā)生泄漏决瞳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一左权、第九天 我趴在偏房一處隱蔽的房頂上張望皮胡。 院中可真熱鬧,春花似錦赏迟、人聲如沸屡贺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)甩栈。三九已至泻仙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間量没,已是汗流浹背玉转。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留殴蹄,地道東北人究抓。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像袭灯,于是被迫代替她去往敵國(guó)和親刺下。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 本篇文章主要介紹以下幾個(gè)知識(shí)點(diǎn):SQLite 數(shù)據(jù)庫(kù)存儲(chǔ)稽荧;開源數(shù)據(jù)庫(kù)框架 LitePal橘茉。 6.3 SQLite ...
    開心wonderful閱讀 1,102評(píng)論 7 5
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,953評(píng)論 2 89
  • 持久化技術(shù)簡(jiǎn)介 數(shù)據(jù)持久化就是指將那些內(nèi)存中的瞬時(shí)數(shù)據(jù)保存在存儲(chǔ)設(shè)備中,保證即使在手機(jī)或電腦關(guān)機(jī)的情況下蛤克,這些數(shù)據(jù)...
    zda123000閱讀 1,776評(píng)論 0 1
  • 輕輕地 不敢吸一口氣 也不敢呼一口氣 怕這吹彈即破的暮帳 不小心破一個(gè)窟窿 那該有多么可惜 那該有多么不忍 我想要...
    靜秋飛燕閱讀 212評(píng)論 0 0
  • 老師构挤,我想對(duì)您說(shuō),您是那辛勤的園丁惕鼓,用汗水和心血澆灌我們筋现,您是那明亮的蠟燭, 照亮了我們卻犧牲了自己箱歧。 ...
    徐雨恒閱讀 911評(píng)論 3 3