最近一段時(shí)間,由于項(xiàng)目需要進(jìn)行優(yōu)化宇姚,項(xiàng)目中的數(shù)據(jù)緩存可以說(shuō)是很混亂,有SqlLite,ActiviteAndroid,sp等,所以就打算把這些涉及到數(shù)據(jù)庫(kù)知識(shí)的信息給其統(tǒng)一到一個(gè)數(shù)據(jù)庫(kù)中空盼,以便后期升級(jí)維護(hù),從而增加程序的可擴(kuò)展性新荤,之所以選擇greendao,是因?yàn)槠渚邆浜芏鄡?yōu)點(diǎn):
GreenDao
官網(wǎng)中明確指明了其首要設(shè)計(jì)目標(biāo):
Maximum performance (probably the fastest ORM for Android):系能最大化
Easy to use APIs:便于使用
Highly optimized for Android:對(duì)于A(yíng)ndroid高度優(yōu)化
Minimal memory consumption:最小化內(nèi)存開(kāi)銷(xiāo)
Small library size, focus on the essentials:較小的文件體積揽趾,只集中在必要的部分上。
優(yōu)點(diǎn):
效率很高苛骨,插入和更新的速度是sqlite的2倍篱瞎,加載實(shí)體的速度是ormlite的4.5倍苟呐。官網(wǎng)測(cè)試結(jié)果:http://greendao-orm.com/features/
文件較小(<100K)俐筋,占用更少的內(nèi)存 牵素,但是需要create Dao,
操作實(shí)體靈活:支持get澄者,update笆呆,delete等操作
缺點(diǎn):
學(xué)習(xí)成本較高。其中使用了一個(gè)java工程根據(jù)一些屬性和規(guī)則去generate一些基礎(chǔ)代碼粱挡,類(lèi)似于javaBean但會(huì)有一些規(guī)則赠幕,另外還有QueryBuilder、Dao等API询筏,所以首先要明白整個(gè)過(guò)程榕堰,才能方便使用。沒(méi)有ORMLite那樣封裝的完整嫌套,不過(guò)greenDao的官網(wǎng)上也提到了這一點(diǎn)逆屡,正是基于generator而不是反射,才使得其效率高的多踱讨。
另外GreenDao支持Protocol buffers協(xié)議數(shù)據(jù)的直接存儲(chǔ) 康二,如果通過(guò)protobuf協(xié)議和服務(wù)器交互,不需要任何的映射勇蝙。
下面就來(lái)講解一下整合greendao中需要注意的知識(shí)點(diǎn)沫勿。
1 按照greendao的說(shuō)明文檔,添加一些依賴(lài)的庫(kù)到app下的gradle中
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
}
}
apply plugin: 'org.greenrobot.greendao'
greendao {
//數(shù)據(jù)庫(kù)的schema版本味混,也可以理解為數(shù)據(jù)庫(kù)版本號(hào)
schemaVersion 1
//設(shè)置DaoMaster产雹、DaoSession、Dao包名翁锡,也就是要放置這些類(lèi)的包的全路徑蔓挖。
daoPackage 'cn.hnshangyu.testgreendao.greendao'
//設(shè)置DaoMaster、DaoSession馆衔、Dao目錄
targetGenDir 'src/main/java'
}
dependencies {
compile 'org.greenrobot:greendao:3.2.0'
}
此時(shí)瘟判,讓人郁悶的是,編譯報(bào)錯(cuò)角溃,不對(duì)啊拷获,完全是按照官方文檔的要求來(lái)的啊,怎么還報(bào)錯(cuò)呢减细,具體報(bào)錯(cuò)信息如下:
Error:Execution failed for task ':app:greendao'.
org.eclipse.jdt.internal.compiler.impl.CompilerOptions.versionToJdkLevel(Ljava/lang/Object;)J
最后匆瓜,通過(guò)查看資料,后來(lái)把這些配置信息重新整合了一下:
在app下的build.grdle中,如下:
apply plugin: 'org.greenrobot.greendao'
greendao {
//數(shù)據(jù)庫(kù)的schema版本驮吱,也可以理解為數(shù)據(jù)庫(kù)版本號(hào)
schemaVersion 1
//設(shè)置DaoMaster茧妒、DaoSession、Dao包名左冬,也就是要放置這些類(lèi)的包的全路徑桐筏。
daoPackage 'cn.hnshangyu.testgreendao.greendao'
//設(shè)置DaoMaster、DaoSession拇砰、Dao目錄
targetGenDir 'src/main/java'
}
dependencies {
compile 'org.greenrobot:greendao:3.2.0'
}
在工程的build.grdle中梅忌,如下:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.1'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
然后重新編譯,編譯通過(guò)毕匀,問(wèn)題解決。編譯通過(guò)后癌别,系統(tǒng)會(huì)在你要求輸出的目錄中自動(dòng)生成DaoMaster皂岔、DaoSession等相關(guān)的數(shù)據(jù)庫(kù)工具類(lèi),如果這些文件生成展姐,那么你的配置成功了躁垛。
2 定義實(shí)體bean,以下是實(shí)體中常用到的注解含義
@Entity 表明這個(gè)實(shí)體類(lèi)會(huì)在數(shù)據(jù)庫(kù)中生成一個(gè)與之相對(duì)應(yīng)的表圾笨。
@Id 對(duì)應(yīng)數(shù)據(jù)表中的 Id 字段教馆,有了解數(shù)據(jù)庫(kù)的話(huà),是一條數(shù)據(jù)的唯一標(biāo)識(shí)擂达。
@Property(nameInDb = “STUDENTNUM”) 表名這個(gè)屬性對(duì)應(yīng)數(shù)據(jù)表中的 STUDENTNUM 字段土铺。
@Property 可以自定義字段名,注意外鍵不能使用該屬性
@NotNull 該屬性值不能為空
@Transient 該屬性不會(huì)被存入數(shù)據(jù)庫(kù)中
@Unique 表名該屬性在數(shù)據(jù)庫(kù)中只能有唯一值
很像Java web端對(duì)hibernater數(shù)據(jù)庫(kù)中的實(shí)體的定義板鬓。具體定義這里就不做過(guò)多的說(shuō)明悲敷。
4 數(shù)據(jù)庫(kù)的增、刪俭令、查后德、改,具體不細(xì)說(shuō)抄腔,但其中的關(guān)鍵字含義在這里介紹一下
eq equal ==
notEq notequal !=
ge greater or equal >=
gt greater than >
le less or equal <=
lt less than <
當(dāng)然不止這么多瓢湃,不過(guò)這幾個(gè)對(duì)于基本的增、刪赫蛇、查绵患、改是使用最頻繁的
5 數(shù)據(jù)庫(kù)的升級(jí)
每次有舊表的數(shù)據(jù)庫(kù)字段的增加或者新建新表,都有修改版本號(hào)悟耘,這是升級(jí)的依據(jù)藏雏。部分代碼如下:
public static void migrate(Database db, Class<? extends AbstractDao<?, ?>>... daoClasses) {
//1 新建臨時(shí)表
generateTempTables(db, daoClasses);
//2 創(chuàng)建新表
createAllTables(db, false, daoClasses);
//3 臨時(shí)表數(shù)據(jù)寫(xiě)入新表,刪除臨時(shí)表
restoreData(db, daoClasses);
}
進(jìn)過(guò)測(cè)試,無(wú)論數(shù)據(jù)庫(kù)字段的增加或者新建新表掘殴,都能升級(jí)成功赚瘦,但同時(shí)不要忘記改版本號(hào)喲。后期會(huì)把源碼附上奏寨。