LitePal 使用說明

LitePal

Android開源數(shù)據(jù)庫框架

資料

Github

設(shè)置

導(dǎo)入

  • 配置模組的 build.gradle
compile 'org.litepal.android:core:1.5.0'

配置

  • assets 目錄創(chuàng)建 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 定義數(shù)據(jù)庫名瓢宦。默認以 .db 結(jié)尾掉房,如未以此結(jié)尾,則自動添加哩至。
  • version 定義數(shù)據(jù)庫版本惕耕。輔助升級數(shù)據(jù)庫纺裁。
  • list 根據(jù)標簽 mapping 對應(yīng)的類創(chuàng)建表,成員變量對應(yīng)字段。
  • storage 定義數(shù)據(jù)庫文件存儲的地方欺缘,可選 internal 和 external栋豫, 默認為 internal

初始化

  • 在自定義的Application中初始化
LitePal.initialize(this);
  • 或者使用LitePal庫的Application
<manifest>
    <application
        android:name="org.litepal.LitePalApplication"
        ...
    >
    ...
    </application>
</manifest>

基本用法

建表

  • 定義 Bean,繼承 DataSupport
  • id字段可寫可不寫谚殊,默認自動產(chǎn)生
public class Album extends DataSupport {

    @Column(unique = true, defaultValue = "unknown")  // 唯一笼才,默認值
    private String name;

    private float price;

    private byte[] cover;

    private List<Song> songs = new ArrayList<Song>(); // 關(guān)系:對多

    // getters/setters
}

public class Song extends DataSupport {

    @Column(nullable = false) // 非空
    private String name;

    private int duration;

    @Column(ignore = true)  // 忽略
    private String uselessField;

    private Album album; // 關(guān)系:對一

    // getters/setters
}
  • 修改 litepal.xml
<list>
    <mapping class="org.litepal.litepalsample.model.Album" />
    <mapping class="org.litepal.litepalsample.model.Song" />
</list>
  • 獲取數(shù)據(jù)庫
SQLiteDatabase db = LitePal.getDatabase();
  • 對應(yīng)的SQL語句
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
);

關(guān)系

  • 定義Bean時定義成員變量,即在建表時自動創(chuàng)建外鍵
  • 對一络凿,成員變量為另一個Bean
  • 對多骡送,成員變量為另一個Bean的集合
  • 多對多,兩個Bean互相定義成員變量為另一Bean的集合
  • 數(shù)據(jù)表刪除操作時絮记,自動按外鍵進行刪除

升級

  • 修改 Bean
public class Album extends DataSupport {

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

    // getters/setters
}
  • 修改 litepal.xml

版本號增加摔踱,數(shù)據(jù)自動保存

<version value="2" />
  • 丟失數(shù)據(jù)狀況
    • 注解成員變量unique = true
    • 改變注解unique = true
    • 改變注解nullable = false

增加

  • DataSupport:saveAll
  • Bean:save/saveThrows/saveOrUpdate
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); // 添加關(guān)系
song1.save();
Song song2 = new Song();
song2.setName("song2");
song2.setDuration(356);
song2.setAlbum(album); // 添加關(guān)系
song2.save();

修改

  • DataSupport:update/updateAll
  • Bean:update/updateAll/setToDefault/assignBaseObjId
Album albumToUpdate = DataSupport.find(Album.class, 1); //查找
albumToUpdate.setPrice(20.99f);
albumToUpdate.save(); // 保存

Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f);
albumToUpdate.update(id); // 更新

Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f);
albumToUpdate.updateAll("name = ?", "album"); // 更新所有

Album albumToUpdate = new Album();
albumToUpdate.setToDefault("name"); // 更新為默認值
albumToUpdate.updateAll();

刪除

  • DataSupport:delete/deleteAll/markAsDeleted
  • Bean:delete/clearSavedState
  • Bean必須是已持久化的對象,否則無效
DataSupport.delete(Song.class, id); // 刪除
DataSupport.delete(Song.class); // 刪除所有數(shù)據(jù)
DataSupport.deleteAll(Song.class, "duration > ?" , "350"); // 條件刪除

查詢

  • DataSupport:find/findFirst/findLast/findAll/findBySQL/isExist
  • DataSupport:select/where/order/limit/offset 查詢條件
  • Bean:isSaved
Song song = DataSupport.find(Song.class, id);
Song song = DataSupport.findFirst(Song.class); // 查詢第一條
Song song = DataSupport.findLast(Song.class); // 查詢最后一條

List<Song> allSongs = DataSupport.findAll(Song.class);
List<Song> songs = DataSupport.where("name like ?", "song%").order("duration").find(Song.class);
List<Song> songs = DataSupport.where("name like ?", "song%").order("duration").limit(3).offset(1).find(Song.class); // 分頁查詢

 // 聯(lián)合查詢怨愤,可以查詢關(guān)聯(lián)表
Album album = DataSupport.find(Album.class, id, true);
List<Song> songs = album.getSongs();

異步

  • 大部分方法都有對應(yīng)的異步方法
// 查詢
DataSupport.findAllAsync(Song.class).listen(new FindMultiCallback() {
    @Override
    public <T> void onFinish(List<T> t) {
        List<Song> allSongs = (List<Song>) t;
    }
});

// 增加
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) {

    }
});

聚合函數(shù)

count/average/max/min/sum

int result = DataSupport.count(Song.class);
int result = DataSupport.where("name like ?", "song%").count(Song.class);

double result = DataSupport.sum(Album.class, "price", double.class);

多庫

LitePalDB litePalDB = new LitePalDB("demo2", 1);
litePalDB.addClassName(Singer.class.getName());
litePalDB.addClassName(Album.class.getName());
litePalDB.addClassName(Song.class.getName());
LitePal.use(litePalDB); // 建庫

LitePalDB litePalDB = LitePalDB.fromDefault("newdb");
LitePal.use(litePalDB); // 使用 litepal.xml 創(chuàng)建一個新庫

LitePal.useDefault(); // 返回默認庫

LitePal.deleteDatabase("newdb"); // 刪庫
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末派敷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子撰洗,更是在濱河造成了極大的恐慌篮愉,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件差导,死亡現(xiàn)場離奇詭異试躏,居然都是意外死亡,警方通過查閱死者的電腦和手機设褐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門颠蕴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人助析,你說我怎么就攤上這事犀被。” “怎么了外冀?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵寡键,是天一觀的道長。 經(jīng)常有香客問我雪隧,道長西轩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任膀跌,我火速辦了婚禮遭商,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捅伤。我一直安慰自己,他們只是感情好巫玻,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布丛忆。 她就那樣靜靜地躺著祠汇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熄诡。 梳的紋絲不亂的頭發(fā)上可很,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音凰浮,去河邊找鬼我抠。 笑死,一個胖子當(dāng)著我的面吹牛袜茧,可吹牛的內(nèi)容都是我干的菜拓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼笛厦,長吁一口氣:“原來是場噩夢啊……” “哼纳鼎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起裳凸,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贱鄙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后姨谷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逗宁,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年梦湘,在試婚紗的時候發(fā)現(xiàn)自己被綠了疙剑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡践叠,死狀恐怖言缤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情禁灼,我是刑警寧澤管挟,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站弄捕,受9級特大地震影響僻孝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜守谓,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一穿铆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斋荞,春花似錦荞雏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悦陋。三九已至,卻和暖如春筑辨,著一層夾襖步出監(jiān)牢的瞬間俺驶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工棍辕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留暮现,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓楚昭,卻偏偏與公主長得像栖袋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哪替,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理栋荸,服務(wù)發(fā)現(xiàn),斷路器凭舶,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,823評論 6 342
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,166評論 2 7
  • 這世上沒有巧合晌块,更多的是注定
    也子的歌閱讀 312評論 1 4
  • 作者/寧采兒 我是本著玩的心開始做的。以前連一般的豬皮凍都沒做過帅霜,做了彩色豬皮凍之后做了一次普通豬皮凍匆背。 當(dāng)時只是...
    寧采兒閱讀 435評論 4 7