GreenDao 問(wèn)題集合

GreenDao 詳解

GreenDao 簡(jiǎn)介

GreenDAO 是一款開源的面向 Android 的輕便休弃、快捷的 ORM 框架奕枢,將 Java 對(duì)象映射到 SQLite 數(shù)據(jù)庫(kù)中得院,我們操作數(shù)據(jù)庫(kù)的時(shí)候票编,不在需要編寫復(fù)雜的 SQL語(yǔ)句蔫慧, 在性能方面滓走,GreenDAO 針對(duì) Android 進(jìn)行了高度優(yōu)化, 最小的內(nèi)存開銷 嗓化、依賴體積小 同時(shí)還是支持?jǐn)?shù)據(jù)庫(kù)加密棠涮。

GreenDAO 官網(wǎng)地址:http://greenrobot.org/greendao/

PS: 官網(wǎng)上,GreenDAO官方推薦最新的應(yīng)用使用最好使用新的數(shù)據(jù)庫(kù)框架 ObjectBox刺覆。

升級(jí)的問(wèn)題:

主鍵問(wèn)題:

默認(rèn)可以用@Id來(lái)設(shè)置主鍵严肪,但是如果需要復(fù)合主鍵的要怎么處理呢:

如果是sql可以這樣寫:


create table test 
( 
   name varchar(19), 
   id number, 
   value varchar(10), 
   primary key (name,id) 
) 

但是 GreenDao 需要使用 約束來(lái)實(shí)現(xiàn): 是個(gè)例子:

@Entity(nameInDb = "MoodBean", indexes = {@Index(value = "id,uid", unique = true)})
public class MoodBean {

    /**
     * 20180827 日期轉(zhuǎn)為數(shù)值
     */
    public long id = 0;
    /**
     * 用戶Id
     */
    public String uid = "";
    /**
     * 當(dāng)前日期字符串,:如2018-08-28
     */
    public String date = "";

    /**
     * 心情類型: 0:未選擇:
     */
    public int moodType = 0;

    }

主鍵最好是用基礎(chǔ)類型的包裝類谦屑,如果是基礎(chǔ)類型驳糯,GreenDao轉(zhuǎn)化為SQL的時(shí)候會(huì)要求自動(dòng)加上 not null 限制。
long 氢橙,int 等會(huì)對(duì)應(yīng)是數(shù)據(jù)庫(kù)的 INTEGER

"CREATE TABLE " + constraint + "\"RecordBean\" (" + //
                "\"ID\" INTEGER NOT NULL ," + // 0: id
                "\"UID\" TEXT," + // 1: uid

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

自動(dòng)生成的DAOMaster里面會(huì)生成默認(rèn)的數(shù)據(jù)庫(kù)升級(jí)類:

/** * WARNING: Drops all table on Upgrade! Use only during development. */
public static class DevOpenHelper extends OpenHelper {    
  public DevOpenHelper(Context context, String name, CursorFactory factory) {
             super(context, name, factory);    
  }    
  @Override    
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {            
        Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");        
        dropAllTables(db, true);        
        onCreate(db);    
  }
}

可以看到酝枢,數(shù)據(jù)庫(kù)默認(rèn)的行為是:刪掉所有數(shù)據(jù)庫(kù),在重新建數(shù)據(jù)庫(kù)悍手。

但是這樣會(huì) 導(dǎo)致已經(jīng)存在的數(shù)據(jù)都被清掉帘睦。因此我需要繼承OpenHelper來(lái)實(shí)現(xiàn)自己的數(shù)據(jù)庫(kù)升級(jí)方法:

public class CalendarDaoOpenHelper extends DaoMaster.OpenHelper {
    public CalendarDaoOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
        super(context, name, factory);
    }

    @Override
    public void onUpgrade(Database db, int oldVersion, int newVersion) {
        super.onUpgrade(db, oldVersion, newVersion);
        if (oldVersion == newVersion) {
            return;
        }
        LogUtil.d(String.format("版本升級(jí):oldVersion= %s,newVersion= %s ", oldVersion, newVersion));
        switch (oldVersion) {
            case 1:
            //todo
            break;
            case 2:
            //todo
            break;
            default:
                break;

        }
    }

}

或者使用GitHub上現(xiàn)成的庫(kù):

https://github.com/yuweiguocn/GreenDaoUpgradeHelper

通過(guò) MigrationHelper 在刪表重建的過(guò)程中袍患,使用臨時(shí)表保存數(shù)據(jù)并還原。

public class MySQLiteOpenHelper extends DaoMaster.OpenHelper {
    public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
        super(context, name, factory);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        MigrationHelper.migrate(db, TestDataDao.class, TestData2Dao.class, TestData3Dao.class);
    }
}

// 初始化
MigrationHelper.DEBUG = true; //如果你想查看日志信息官脓,請(qǐng)將 DEBUG 設(shè)置為 true
MySQLiteOpenHelper helper = new MySQLiteOpenHelper(this, "test.db", null);
DaoMaster daoMaster = new DaoMaster(helper.getWritableDatabase());

translate緩存問(wèn)題

對(duì)象字段用 @translate 標(biāo)識(shí)协怒,代表這個(gè)字段不會(huì)被保存到數(shù)據(jù)庫(kù)中。但是會(huì)被緩存到是內(nèi)存卑笨。
如果要 讓下次查詢的 對(duì)象字段還原孕暇,需要調(diào)用方法來(lái)強(qiáng)制清除緩存:

 com.babytree.apps.pregnancy.db.DaoSession#clear
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市赤兴,隨后出現(xiàn)的幾起案子妖滔,更是在濱河造成了極大的恐慌,老刑警劉巖桶良,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件座舍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡陨帆,警方通過(guò)查閱死者的電腦和手機(jī)曲秉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)疲牵,“玉大人承二,你說(shuō)我怎么就攤上這事「侔郑” “怎么了亥鸠?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)识啦。 經(jīng)常有香客問(wèn)我负蚊,道長(zhǎng),這世上最難降的妖魔是什么颓哮? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任家妆,我火速辦了婚禮,結(jié)果婚禮上题翻,老公的妹妹穿的比我還像新娘揩徊。我一直安慰自己,他們只是感情好嵌赠,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著熄赡,像睡著了一般姜挺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上彼硫,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天炊豪,我揣著相機(jī)與錄音凌箕,去河邊找鬼。 笑死词渤,一個(gè)胖子當(dāng)著我的面吹牛牵舱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缺虐,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼芜壁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了高氮?” 一聲冷哼從身側(cè)響起慧妄,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剪芍,沒(méi)想到半個(gè)月后塞淹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罪裹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年饱普,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片状共。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡套耕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出口芍,到底是詐尸還是另有隱情箍铲,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布鬓椭,位于F島的核電站颠猴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏小染。R本人自食惡果不足惜翘瓮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望裤翩。 院中可真熱鬧资盅,春花似錦、人聲如沸踊赠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)筐带。三九已至今穿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伦籍,已是汗流浹背蓝晒。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工腮出, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芝薇。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓胚嘲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親洛二。 傳聞我的和親對(duì)象是個(gè)殘疾皇子馋劈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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