安卓數(shù)據(jù)庫 greenDAO3 使用之一項(xiàng)目配置雁仲、增刪改查及升級

文/追風(fēng)917(簡書作者)原文鏈接:http://www.reibang.com/p/f13ba77ed126 著作權(quán)歸作者所有厨钻,再次感謝~

配置配置
喜訊:現(xiàn)在greenDAO升級到了3.0版本,不需要java項(xiàng)目了
強(qiáng)烈建議升級到3.0版本燃异,該版本采用注解的方式通過編譯生成Java數(shù)據(jù)對象和DAO對象携狭,配置更簡單
之前2.0版本的配置,參考這里:Android SQLite ORM框架greenDAO在Android Studio中的配置與使用

1 添加依賴
項(xiàng)目的gradle腳本:

buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.1' classpath 'org.greenrobot:greendao-gradle-plugin:3.1.0' }}

module的gradle:

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'android 
{ 
      compileSdkVersion 24 
      buildToolsVersion "24.0.3" 
      defaultConfig { 
            applicationId "com.inst.greendao3_demo" 
             minSdkVersion 14
             targetSdkVersion 24 
             versionCode 1
             versionName "1.0"
        } 
buildTypes {
     release { 
          minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
              } 
      }
}
//greendao配置
greendao { 
    schemaVersion 1 //版本號回俐,升級時(shí)可配置 daoPackage'com.inst.greendao3_demo.dao' //包名            
    targetGenDir'src/main/java' //生成目錄
}
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'org.greenrobot:greendao:3.1.1'}

可以看到逛腿,3.0多了個(gè)greendao插件稀并,直接在這里配置實(shí)體及DAO生成目錄,我的配置是:
greendao { schemaVersion 1 //版本號单默,升級時(shí)可配置 daoPackage'com.inst.greendao3_demo.dao' //包名 targetGenDir'src/main/java' //生成目錄}

這三個(gè)字段的意思是:
schemaVersion: 數(shù)據(jù)庫schema版本碘举,可在這里升級數(shù)據(jù)庫版本daoPackage:設(shè)置DaoMaster、DaoSession搁廓、Dao包名targetGenDir:設(shè)置DaoMaster引颈、DaoSession、Dao目錄

配置好后境蜕,同步下蝙场,然后編譯,就會生成 Dao粱年。
2 添加實(shí)體類
我這里的是Student實(shí)體類售滤,和普通的bean有個(gè)區(qū)別,添加@Entity
注解

@Entity
public class Student { 
@Id 
public Long id; 
public String name; 
public String age;
 public String number; 
public String score;
}

注意到逼泣,變量id
添加了 @Id 注解趴泌,這個(gè)就是主鍵了
生成DAO
上面配置好后,同步拉庶,編譯嗜憔,即可自動(dòng)生成DAO, 并自動(dòng)補(bǔ)全實(shí)體類 Student 的getter setter 等方法。
增刪改查
上面的操作就完成了數(shù)據(jù)庫的創(chuàng)建氏仗,下面開始對數(shù)據(jù)庫操作吉捶,常用的增刪改查。
這里對基本操作封裝下皆尔,參考這里:Android ORM系列之GreenDao最佳實(shí)踐
1 編寫一個(gè)核心輔助類DbCore, 用于獲取DaoMaster和DaoSession

public static DaoMaster getDaoMaster() { 
    if (daoMaster == null) {
         //此處不可用 DaoMaster.DevOpenHelper,那是開發(fā)輔助類呐舔,我們要自定義一個(gè),方便升級         
        DaoMaster.OpenHelper helper = new MyOpenHelper(mContext, DB_NAME); 
        daoMaster = new DaoMaster(helper.getWritableDatabase());
     } 
        return daoMaster;
}

這里需要注意的是 getDaoMaster 時(shí)的 helper 不可用 DaoMaster.DevOpenHelper慷蠕,我們需要自定義一個(gè):
因?yàn)樵擃愡@樣提示我們:
/** WARNING: Drops all table on Upgrade! Use only during development. */public static class DevOpenHelper extends OpenHelper

也就是開發(fā)中使用的助手珊拼,自定義也很簡單:

public class MyOpenHelper extends DaoMaster.OpenHelper { 
  public MyOpenHelper(Context context, String name) { 
      super(context, name); 
    }
}

2 基礎(chǔ)的泛型 BaseDbHelper, 封裝基本增刪改查方法,具體看代碼吧
3 實(shí)現(xiàn)類流炕,有幾個(gè)實(shí)體類就有幾個(gè)實(shí)現(xiàn)類澎现,這里是 StudentHelper, 僅僅一個(gè)構(gòu)造方法即可
4 一個(gè)工具類 DbUtils 獲得 Helper
5 在 application 里初始化

public class DaoApplication extends Application { 
    @Override 
    public void onCreate() { 
      super.onCreate(); 
      //初始化數(shù)據(jù)庫 DbCore.init(this);
   }
}

6 測試
方法就很簡單了,獲取 helper每辟, 然后add
remove
update
query

StudentHelper mHelper = DbUtil.getDriverHelper();
//增加一個(gè)數(shù)據(jù)
mFastAdapter.add(stu);
//刪除一個(gè)數(shù)據(jù)
mFastAdapter.remove(stu);
//更新一個(gè)數(shù)據(jù)
mFastAdapter.update(stu);
//查找所有數(shù)據(jù)
mFastAdapter.queryAll();
//查找數(shù)據(jù)庫中age大于20的數(shù)據(jù)
Query<Student> query = mHelper.queryBuilder() .where(StudentDao.Properties.Age.ge("20")) .build();dbStudents = query.list();

運(yùn)行程序剑辫,添加幾個(gè)數(shù)據(jù),我們看下界面及數(shù)據(jù)庫內(nèi)容:


數(shù)據(jù)庫升級
前面渠欺,我們學(xué)會了greenDAO的使用妹蔽,下面來學(xué)習(xí)下升級。
今天研究了下升級,掌握方法了還是蠻簡單的胳岂,這里對數(shù)據(jù)庫的升級编整,僅僅是添加字段,添加表乳丰。對于刪除闹击,修改字段這里不多講,因?yàn)閟qlite數(shù)據(jù)庫不適合此操作:
SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column, or add or remove constraints from a table.


簡單講就是 SQlite 數(shù)據(jù)庫僅能重命名表及增加字段成艘,其他不支持,如果您一定要操作贺归,也是可以的淆两,來這里吧:
SQLite如何刪除,修改拂酣、重命名列
1 升級版本號
上面我們說到秋冰,在 gradle 里修改 schemaVersion 即可,現(xiàn)在我們設(shè)置為2婶熬,編譯下剑勾,我們可以看到 DaoMaster 里的schema變?yōu)?:
public static final int SCHEMA_VERSION = 2;

2 實(shí)體添加字段
比如我們的 Student 添加一個(gè) score 字段, 這個(gè)可以直接寫到 Student 里:
public String score;

編譯后即可生成完整的 Student 實(shí)體及 DAO
3重寫onUpgrade方法升級
這個(gè)就是重寫 MyOpenHelper 的 onUpgrade 方法赵颅,該方法只在 schema 升級時(shí)執(zhí)行一次.
在該方法里添加 score 字段即可

@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) { 
KLog.w("db version update from " + oldVersion + " to " + newVersion); 
switch (oldVersion) { 
case 1: //不能先刪除表虽另,否則數(shù)據(jù)都木了//
       StudentDao.dropTable(db, true); 
        StudentDao.createTable(db, true); // 加入新字段 score db.execSQL("ALTER TABLE 'STUDENT' ADD 'SCORE' TEXT;"); 
            break; }
}

4 測試
運(yùn)行代碼后,再添加三個(gè)數(shù)據(jù)饺谬,我們看下界面及數(shù)據(jù)庫內(nèi)容:
[圖片上傳中捂刺。。募寨。(3)]

喜訊:現(xiàn)在greenDAO升級到了3.0版本族展,不需要java項(xiàng)目了
強(qiáng)烈建議升級到3.0版本,該版本采用注解的方式通過編譯生成Java數(shù)據(jù)對象和DAO對象拔鹰,配置更簡單
之前2.0版本的配置也寫過仪缸,參考這里:Android SQLite ORM框架greenDAO在Android Studio中的配置與使用

1 添加依賴
項(xiàng)目的gradle腳本:

buildscript { 
    repositories {
       jcenter() 
    } 
    dependencies {
       classpath 'com.android.tools.build:gradle:2.2.1' 
       classpath 'org.greenrobot:greendao-gradle-plugin:3.1.0' 
    }
}

module的gradle:

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'
android { 
compileSdkVersion 24
 buildToolsVersion "24.0.3"
     defaultConfig { 
        applicationId "com.inst.greendao3_demo"
        minSdkVersion 14 
        targetSdkVersion 24 
        versionCode 1
         versionName "1.0" 
} 
buildTypes { 
     release {
         minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } 
    }
}
    //greendao配置
    greendao { 
        schemaVersion 1 //版本號,升級時(shí)可配置 
        daoPackage'com.inst.greendao3_demo.dao' //包名 
        targetGenDir'src/main/java' //生成目錄
}
dependencies { 
compile fileTree(dir: 'libs', include: ['*.jar']) compile 'org.greenrobot:greendao:3.1.1'
}

可以看到列肢,3.0多了個(gè)greendao插件恰画,直接在這里配置實(shí)體及DAO生成目錄,我的配置是:

greendao {
     schemaVersion 1 //版本號例书,升級時(shí)可配置 
     daoPackage'com.inst.greendao3_demo.dao' //包名 
     targetGenDir'src/main/java' //生成目錄
}

這三個(gè)字段的意思是:
schemaVersion: 數(shù)據(jù)庫schema版本锣尉,可在這里升級數(shù)據(jù)庫版本daoPackage:設(shè)置DaoMaster、DaoSession决采、Dao包名targetGenDir:設(shè)置DaoMaster自沧、DaoSession、Dao目錄

配置好后,同步下拇厢,然后編譯爱谁,就會生成 Dao。
2 添加實(shí)體類
我這里的是Student實(shí)體類孝偎,和普通的bean有個(gè)區(qū)別访敌,添加@Entity
注解

@Entity
public class Student {
 @Id 
  public Long id; 
  public String name; 
  public String age;
  public String number; 
  public String score;
}

注意到,變量id
添加了 @Id 注解衣盾,這個(gè)就是主鍵了
生成DAO
上面配置好后寺旺,同步,編譯势决,即可自動(dòng)生成DAO, 并自動(dòng)補(bǔ)全實(shí)體類 Student 的getter setter 等方法阻塑。
增刪改查
上面的操作就完成了數(shù)據(jù)庫的創(chuàng)建,下面開始對數(shù)據(jù)庫操作果复,常用的增刪改查陈莽。
這里對基本操作封裝下,參考這里:Android ORM系列之GreenDao最佳實(shí)踐
1 編寫一個(gè)核心輔助類DbCore, 用于獲取DaoMaster和DaoSession

public static DaoMaster getDaoMaster() {
  if (daoMaster == null) {
    //此處不可用 DaoMaster.DevOpenHelper, 那是開發(fā)輔助類虽抄,我們要自定義一個(gè)走搁,方便升級 
     DaoMaster.OpenHelper helper = new MyOpenHelper(mContext, DB_NAME);
     daoMaster = new DaoMaster(helper.getWritableDatabase()); 
    } 
    return daoMaster;
}

這里需要注意的是 getDaoMaster 時(shí)的 helper 不可用 DaoMaster.DevOpenHelper,我們需要自定義一個(gè):
因?yàn)樵擃愡@樣提示我們:
/** WARNING: Drops all table on Upgrade! Use only during development. */public static class DevOpenHelper extends OpenHelper

也就是開發(fā)中使用的助手迈窟,自定義也很簡單:

public class MyOpenHelper extends DaoMaster.OpenHelper { 
    public MyOpenHelper(Context context, String name) { 
        super(context, name); 
    }
}

2 基礎(chǔ)的泛型 BaseDbHelper, 封裝基本增刪改查方法私植,具體看代碼吧
3 實(shí)現(xiàn)類,有幾個(gè)實(shí)體類就有幾個(gè)實(shí)現(xiàn)類车酣,這里是 StudentHelper, 僅僅一個(gè)構(gòu)造方法即可
4 一個(gè)工具類 DbUtils 獲得 Helper
5 在 application 里初始化

public class DaoApplication extends Application 
{ 
    @Override 
    public void onCreate() { 
        super.onCreate();
       //初始化數(shù)據(jù)庫 
        DbCore.init(this); 
    }
}

6 測試
方法就很簡單了兵琳,獲取 helper, 然后add
remove
update
query

StudentHelper mHelper = DbUtil.getDriverHelper();
//增加一個(gè)數(shù)據(jù)
mFastAdapter.add(stu);
//刪除一個(gè)數(shù)據(jù)
mFastAdapter.remove(stu);
//更新一個(gè)數(shù)據(jù)
mFastAdapter.update(stu);
//查找所有數(shù)據(jù)mFastAdapter.queryAll();
//查找數(shù)據(jù)庫中age大于20的數(shù)據(jù)
Query<Student> query = mHelper.queryBuilder() .where(StudentDao.Properties.Age.ge("20")) .build();dbStudents = query.list();

運(yùn)行程序骇径,添加幾個(gè)數(shù)據(jù)躯肌,我們看下界面及數(shù)據(jù)庫內(nèi)容:
[圖片上傳中。破衔。清女。(1)]

數(shù)據(jù)庫升級
前面,我們學(xué)會了greenDAO的使用晰筛,下面來學(xué)習(xí)下升級嫡丙。
今天研究了下升級,掌握方法了還是蠻簡單的读第,這里對數(shù)據(jù)庫的升級曙博,僅僅是添加字段,添加表怜瞒。對于刪除父泳,修改字段這里不多講般哼,因?yàn)閟qlite數(shù)據(jù)庫不適合此操作:
SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column, or add or remove constraints from a table.


簡單講就是 SQlite 數(shù)據(jù)庫僅能重命名表及增加字段,其他不支持惠窄,如果您一定要操作蒸眠,也是可以的,來這里吧:
SQLite如何刪除杆融,修改楞卡、重命名列
1 升級版本號
上面我們說到,在 gradle 里修改 schemaVersion 即可脾歇,現(xiàn)在我們設(shè)置為2蒋腮,編譯下,我們可以看到 DaoMaster 里的schema變?yōu)?:
public static final int SCHEMA_VERSION = 2;

2 實(shí)體添加字段
比如我們的 Student 添加一個(gè) score 字段藕各, 這個(gè)可以直接寫到 Student 里:
public String score;

編譯后即可生成完整的 Student 實(shí)體及 DAO
3重寫onUpgrade方法升級
這個(gè)就是重寫 MyOpenHelper 的 onUpgrade 方法徽惋,該方法只在 schema 升級時(shí)執(zhí)行一次.
在該方法里添加 score 字段即可

@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) { 
    KLog.w("db version update from " + oldVersion + " to " + newVersion); 
    switch (oldVersion) { case 1: 
        //不能先刪除表,否則數(shù)據(jù)都木了
        // StudentDao.dropTable(db, true);
       StudentDao.createTable(db, true); 
      // 加入新字段 
      score db.execSQL("ALTER TABLE 'STUDENT' ADD 'SCORE' TEXT;"); 
    break;
     }
}

4 測試
運(yùn)行代碼后座韵,再添加三個(gè)數(shù)據(jù),我們看下界面及數(shù)據(jù)庫內(nèi)容:
[圖片上傳中踢京。誉碴。。(3)]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓣距,一起剝皮案震驚了整個(gè)濱河市黔帕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蹈丸,老刑警劉巖成黄,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逻杖,居然都是意外死亡奋岁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門荸百,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闻伶,“玉大人,你說我怎么就攤上這事够话±逗玻” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵女嘲,是天一觀的道長畜份。 經(jīng)常有香客問我,道長欣尼,這世上最難降的妖魔是什么爆雹? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上顶别,老公的妹妹穿的比我還像新娘谷徙。我一直安慰自己,他們只是感情好驯绎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布完慧。 她就那樣靜靜地躺著,像睡著了一般剩失。 火紅的嫁衣襯著肌膚如雪屈尼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天拴孤,我揣著相機(jī)與錄音脾歧,去河邊找鬼。 笑死演熟,一個(gè)胖子當(dāng)著我的面吹牛鞭执,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芒粹,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兄纺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了化漆?” 一聲冷哼從身側(cè)響起估脆,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎座云,沒想到半個(gè)月后疙赠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朦拖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年圃阳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片璧帝。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡限佩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出裸弦,到底是詐尸還是另有隱情祟同,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布理疙,位于F島的核電站晕城,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏窖贤。R本人自食惡果不足惜砖顷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一贰锁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滤蝠,春花似錦豌熄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至览闰,卻和暖如春芯肤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背压鉴。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工崖咨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人油吭。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓击蹲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親婉宰。 傳聞我的和親對象是個(gè)殘疾皇子歌豺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

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