【Android】18.0 SQLite數(shù)據(jù)庫——LitePal的使用及SQLite數(shù)據(jù)庫怎么查看

1.0 隨著android編程的版本和工具的不斷更新备恤,一些學(xué)習(xí)內(nèi)容出現(xiàn)失效编整、棄用現(xiàn)象。寫這個同時也是給自己做筆記元镀。
2.0 Android系統(tǒng)內(nèi)置數(shù)據(jù)庫绍填,SQLite輕量級的關(guān)系型數(shù)據(jù)庫,當(dāng)然栖疑,使用起來其實很麻煩讨永,還需要熟練使用SQL語句。
3.0 開源讓Android開發(fā)者收益良多遇革,導(dǎo)致GitHub上有成百上千的優(yōu)秀Android開源項目卿闹,當(dāng)我們使用開源庫LitePal時揭糕,將會特別感受到SQLite數(shù)據(jù)庫使用的容易性。
4.0 LitePal項目主頁當(dāng)然有詳細(xì)的使用文檔锻霎,地址是:GitHub - LitePalFramework/LitePal: 一個Android庫著角,使開發(fā)人員非常容易使用sqlite數(shù)據(jù)庫
5.0 配置LitePal。

編輯app/build.gradle文件旋恼,在dependencies閉包中添加如下內(nèi)容:

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

添加這行代碼中吏口,“org.litepal.android:java:”是固定的,后面的版本號可以去 LitePal項目主頁上查看蚌铜。

6.0 新建一個項目锨侯,我的目錄結(jié)構(gòu)如下:
2019-02-18_212302.png

當(dāng)然這里也不要忘了,更新下編程環(huán)境冬殃,點這個:


2019-02-18_212628.png
7.0 litepal.xml內(nèi)容如下:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="BookStore"></dbname>
    <version value="2"></version>

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

dbname 標(biāo)簽用于指定數(shù)據(jù)庫名
version 標(biāo)簽用于指定數(shù)據(jù)庫版本號囚痴,這里我因為已經(jīng)玩了幾輪了,已經(jīng)更新到2审葬。
mapping 標(biāo)簽里面都是全路徑名稱下的具體的表深滚。

8.0 最后還需要配置下LitePalApplication,修改AndroidManifest.xml中的代碼涣觉,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.litepaltest">

    <application
        android:name="org.litepal.LitePalApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

主要是application標(biāo)簽下增加android:name="org.litepal.LitePalApplication"痴荐,其他都是自動生成的。
這樣LitePal的所有功能都能正常工作了官册,LitePal配置工作完全結(jié)束生兆。

9.0 LitePal最大的好處,就在于她是相當(dāng)于面向?qū)ο蟮南ツ瑖?yán)謹(jǐn)?shù)卣f鸦难,叫做采用的是對象關(guān)系映射(ORM)的模式。

這樣可以用面向?qū)ο蟮乃季S來操作數(shù)據(jù)庫员淫,而不用再和SQL語句打交道合蔽,并且可以直接指定好了數(shù)據(jù)的數(shù)據(jù)類型。

例如在這個項目中介返,再定義一個Book類拴事,代碼如下:

package com.example.litepaltest;


import org.litepal.crud.LitePalSupport;

public class Book extends LitePalSupport {
    private int id;
    private String author;
    private double price;
    private int pages;
    private String name;


    private String press;

    public String getPress() {
        return press;
    }

    public void setPress(String press) {
        this.press = press;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getPages() {
        return pages;
    }

    public void setPages(int pages) {
        this.pages = pages;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


}

可見這是一個典型的Java bean。相當(dāng)于對應(yīng)數(shù)據(jù)庫中的Book表圣蝎。

10.0 由于前面已經(jīng)描述了litepal.xml中的代碼刃宵,事實上,坐好Book類徘公,還需要在這個文件中用mapping標(biāo)簽來聲明要配置的映射模型類组去。這里就不再貼代碼了。
11.0修改MainActivity.java中的代碼步淹,創(chuàng)建數(shù)據(jù)庫:
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button createDatebase = (Button) findViewById(R.id.create_database);
        createDatebase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LitePal.getDatabase();
            }
        });

這里用了LitePal.getDatabase();創(chuàng)建數(shù)據(jù)庫从隆,運行,可以點擊那個Button控件(最后一次性貼activity_main.xml的代碼缭裆,里面到時候會配置4個按鈕控件)键闺,數(shù)據(jù)庫創(chuàng)建成功。

12.0 怎么可以查看數(shù)據(jù)庫是否真的創(chuàng)建好了澈驼,在我的參考書里面是通過adb.exe辛燥,在命令窗口,通過命令行查看缝其,但是Android6.0以后的版本的模擬器挎塌,這個方法根本進(jìn)不去數(shù)據(jù)庫。

所以我用的第二種方法内边。
12.1 首先你得裝一個Navicat Premium榴都,數(shù)據(jù)庫可視化軟件。
我的是Navicat Premium 12漠其。

12.2 然后運行項目后嘴高,點擊按鈕,創(chuàng)建數(shù)據(jù)庫和屎。然后打開Android studio拴驮,在右下角可以看到Device File Explorer,接下來的操作如圖所示:


2019-02-19_152423.png
2019-02-19_152804.png
2019-02-19_153356.png

當(dāng)然,如果你找不到Device File Explorer,可以到View→Tool Windows→Device File Explorer:


2019-02-19_153021.png

如果這樣都沒有的話柴信,那就涼涼了……

12.3 接下來打開Navicat Premium 套啤,點擊SQLite,操作如圖:


2019-02-19_153637.png

選擇數(shù)據(jù)庫文件随常,


2019-02-19_153711.png

找到保存的目錄潜沦,選擇目錄文件,打開
2019-02-19_153844.png
2019-02-19_154119.png

這樣线罕,就可以查看到相關(guān)的內(nèi)容了(我的因為多寫了別的代碼止潮,導(dǎo)致里面有數(shù)據(jù))


2019-02-19_154310.png
13.0 常說的增刪查改。首先是想添加一個出版社钞楼,直接修改Book代碼喇闸,添加一個press字段即可,上面的代碼询件,已經(jīng)是添加完畢的燃乍。
14.0 如果還想再添加一張Category表,那么只需要添加一個Category類即可:

Category.java

package com.example.litepaltest;

public class Category {
    private int id;
    private String categoryName;
    private int categoryCode;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getCategoryName() {
        return categoryName;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }

    public int getCategoryCode() {
        return categoryCode;
    }

    public void setCategoryCode(int categoryCode) {
        this.categoryCode = categoryCode;
    }
}

但別忘了在litepal.xml中增加一個mapping(在上面貼的完整代碼中已添加好):

<mapping class="com.example.litepaltest.Category"></mapping>
15.0 添加數(shù)據(jù)宛琅,LitePal進(jìn)行表管理操作時不需要模型類有任何的繼承結(jié)構(gòu)刻蟹,但是進(jìn)行CRUD操作時就不行,必須繼承LitePalSupport類才行(之前是繼承DataSupport類嘿辟,現(xiàn)在已經(jīng)被棄用)

上面可以看到我們的Book類已經(jīng)被我加上了繼承結(jié)構(gòu)舆瘪,但在創(chuàng)建表時片效,可以不用該繼承。

添加數(shù)據(jù),將數(shù)據(jù)設(shè)置好英古,調(diào)用下save()方法即可淀衣,只需要修改下MainActivity.java中的代碼(當(dāng)然,這里又增加了一個Button按鈕):

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
       Button addData = (Button) findViewById(R.id.add_data);
              addData.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      Book book = new Book();
                      book.setName("中國古代歷史");
                      book.setAuthor("睡醒著");
                      book.setPages(454);
                      book.setPrice(16.96);
                      book.setPress("Unknow");
                     book.save();
                  }
              });
      }
}
16.0更新數(shù)據(jù)召调,如下:

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
      Button updateData = (Button) findViewById(R.id.update_data);
        updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    Book book = new Book();
                    book.setName("大亨小傳");
                    book.setAuthor("java著");
                    book.setPages(329);
                    book.setPrice(21.96);
                    book.setPress("Unknow");
                    book.save();
                    book.setPrice(51.96);
                    book.save();
                  }
              });
      }
}

當(dāng)然膨桥,還可以更加靈巧的更新數(shù)據(jù):

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
      Button updateData = (Button) findViewById(R.id.update_data);
        updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Book book = new Book();
                book.setPrice(33.96);
                book.setPress("Anchor");
                book.updateAll("name= ? and author = ?","中國古代歷史","睡醒著");
                  }
              });
      }
}

上面updateAll()方法的意思是匹配Book表中,所有名字叫“中國古代歷史“”唠叛,而且作者是“睡醒著”的所有數(shù)據(jù)只嚣,將他們的價格和出版社給改了。

還可以將某個數(shù)據(jù)恢復(fù)成系統(tǒng)默認(rèn)值:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
      Button updateData = (Button) findViewById(R.id.update_data);
        updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //                下面三句代碼的意思是:把所有書的頁數(shù)設(shè)置為默認(rèn)值0
                Book book = new Book();
                book.setToDefault("pages");
                book.updateAll();
                  }
              });
      }
}
17.0 刪除數(shù)據(jù)艺沼,如下:

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
      Button deleteData = (Button) findViewById(R.id.delete_data);
        deleteData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                這里之前的DataSupport被棄用册舞,取而代之的是LitePal
                LitePal.deleteAll(Book.class,"price < ?","23");
            }
        });
      }
}

上句話的意思是,刪除Book表中所有價格小于23的書的數(shù)據(jù)澳厢。

18.0 查詢數(shù)據(jù)环础,很簡單:

在Button控件監(jiān)控的基礎(chǔ)上,直接增加如下代碼:
18.1 查詢Book表中的所有數(shù)據(jù):

List<Book> book = LitePal.findAll(Book.class);

18.2 查詢Book表中的第一條數(shù)據(jù):

Book firstBook = LitePal.findFirst(Book.class);

18.3 查詢Book表中的最后一條數(shù)據(jù):

Book lastBook = LitePal.findLast(Book.class);

18.4 只查詢Book表中的name和author這兩列數(shù)據(jù)(對應(yīng)SQL中的select關(guān)鍵字):

List<Book> book = LitePal.select("name","author").find(Book.class);

18.5 只查詢Book表中的頁數(shù)大于400的數(shù)據(jù)(對應(yīng)SQL中的where關(guān)鍵字):

List<Book> book = LitePal.where("pages > ?","400").find(Book.class);

18.6 查詢Book表,將查詢結(jié)果按照書價從高到低排序(對應(yīng)SQL中的order by關(guān)鍵字):

List<Book> book = LitePal.order("price desc ").find(Book.class);

其中“desc”表示降序排序剩拢,不寫或者"asc"表示升序排序

18.7 查詢Book表中的前3條數(shù)據(jù):

List<Book> book = LitePal.limit(3).find(Book.class);

18.8 查詢Book表中的第2條线得、第3條、第4條數(shù)據(jù):

List<Book> book = LitePal.limit(3).offset(1).find(Book.class);

limit(3)查詢的是前3條數(shù)據(jù)(第1徐伐、2贯钩、3條),再加一個offset(1)進(jìn)行位置的偏移办素,意味著查詢第2角雷、3、4條數(shù)據(jù)了性穿,這兩個方法相結(jié)合對應(yīng)SQL語句中的limit關(guān)鍵字勺三。

18.9 劃重點的來了,可以把select()需曾、where()吗坚、order()、limit()呆万、offset()五個方法任意組合商源,以完成一個復(fù)雜的查詢操作,比如查詢Book表中第11-20條滿足頁數(shù)大于400這個條件的name谋减、author和pages這3列數(shù)據(jù)牡彻,并將查詢結(jié)果按照頁數(shù)的升序排列:

List<Book> book = LitePal.selcect("name","author","pages")
                                           .where("pages > ?","400")
                                           .order(pages)
                                           .limit(10)
                                           .offset(10)
                                           .find(Book.class);

18.10 最后,如果LitePal這都滿足不了你窮兇極惡的需求出爹,那么它仍然支持使用原生的SQL來查詢:

Cursor c = LitePal.findBySQL("select * from Book where pages > ? and price < ?","400","20");

當(dāng)然庄吼,這樣數(shù)據(jù)需要取出來的話缎除,就得通過Cursor的各種get方法了。

END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末总寻,一起剝皮案震驚了整個濱河市伴找,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌废菱,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抖誉,死亡現(xiàn)場離奇詭異殊轴,居然都是意外死亡,警方通過查閱死者的電腦和手機袒炉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門旁理,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人我磁,你說我怎么就攤上這事孽文。” “怎么了夺艰?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵芋哭,是天一觀的道長。 經(jīng)常有香客問我郁副,道長减牺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任存谎,我火速辦了婚禮拔疚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘既荚。我一直安慰自己稚失,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布恰聘。 她就那樣靜靜地躺著句各,像睡著了一般。 火紅的嫁衣襯著肌膚如雪憨琳。 梳的紋絲不亂的頭發(fā)上诫钓,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音篙螟,去河邊找鬼菌湃。 笑死,一個胖子當(dāng)著我的面吹牛遍略,可吹牛的內(nèi)容都是我干的惧所。 我是一名探鬼主播骤坐,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼下愈!你這毒婦竟也來了纽绍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤势似,失蹤者是張志新(化名)和其女友劉穎拌夏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體履因,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡障簿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了栅迄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片站故。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖毅舆,靈堂內(nèi)的尸體忽然破棺而出西篓,到底是詐尸還是另有隱情,我是刑警寧澤憋活,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布岂津,位于F島的核電站,受9級特大地震影響余掖,放射性物質(zhì)發(fā)生泄漏寸爆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一盐欺、第九天 我趴在偏房一處隱蔽的房頂上張望赁豆。 院中可真熱鬧,春花似錦冗美、人聲如沸魔种。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽节预。三九已至,卻和暖如春属韧,著一層夾襖步出監(jiān)牢的瞬間安拟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工宵喂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留糠赦,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像拙泽,于是被迫代替她去往敵國和親淌山。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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