Android平臺(tái)下GreenDao的使用

greenDao的介紹

greenDao是Android數(shù)據(jù)庫(kù)ORM(object/relational mapping 對(duì)象關(guān)系映射的簡(jiǎn)稱)的一個(gè)典型代表,其他也有ORMLite等裙顽,但greenDao在眾多的ORM數(shù)據(jù)庫(kù)框架中性能是最好,速度也是最快的,在官方網(wǎng)站中有這個(gè)對(duì)比,感興趣的同學(xué)可以去看看宣渗,greenDao在單位時(shí)間內(nèi)可以插入、更新和查詢更多的數(shù)據(jù)梨州,而且提供了大量的靈活通用接口,文章的最后有個(gè)插入的測(cè)試落包,當(dāng)然刪除,修改之類的都是一樣快摊唇。

操作步驟

greenDao需要一個(gè)單獨(dú)的Java工程,具體可以參考github上的鏈接greenDao源碼,下面是本人的具體步驟:

1.在AndroidStudio中選擇File-New Model-Java Library新建一個(gè)Java項(xiàng)目,生成表的那個(gè)文件默認(rèn)就好咐蝇,當(dāng)然你自己也可以自己決定類的名稱,創(chuàng)建完項(xiàng)目之后巷查,在build.gradle文件中添加依賴有序,下面是build.gradle的內(nèi)容:

apply plugin: 'java'

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

compile 'de.greenrobot:greendao-generator:1.3.1'

}

其中compile這一句為引入的依賴,然后編寫(xiě)生成框架的類文件,下面是源碼

public class MyClass {

public static void main(String[] args) throws Exception {

Schema schema = new Schema(1000, "com.example.db.bean");//這個(gè)目錄是存放需要建立數(shù)據(jù)庫(kù)的bean的地方

schema.setDefaultJavaPackageDao("com.example.dao");//這個(gè)是設(shè)置包名岛请,就是那個(gè)DAO和master存放的路徑

addNote(schema);

new DaoGenerator().generateAll(schema, "./greendaoproject/src/main/java-gen");//這個(gè)是指定建立greendao存放的目錄

}

private static void addNote(Schema schema) {

Entity note = schema.addEntity("Note");//這是一個(gè)表名旭寿,對(duì)應(yīng)一個(gè)實(shí)體Note

note.addIdProperty().primaryKey().autoincrement();

note.addStringProperty("text").notNull();

note.addStringProperty("comment");

note.addDateProperty("date");

Entity student = schema.addEntity("Student");

student.addIdProperty().primaryKey().autoincrement();//設(shè)置自動(dòng)增長(zhǎng)

student.addStringProperty("name").notNull();

student.addStringProperty("address").notNull();

student.addIntProperty("age");

student.addIntProperty("phonenumber");

student.addStringProperty("imageurl");

student.addStringProperty("author");

Entity account = schema.addEntity("Account");

account.addIdProperty().autoincrement();

account.addStringProperty("name").notNull();

account.addStringProperty("address").notNull();

account.addStringProperty("number").notNull();

}

}

其中,重要的有那么幾句代碼:

Schema schema = new Schema(1000, "com.example.db.bean");//這里面第一個(gè)參數(shù)是版本崇败,第二個(gè)參數(shù)是存放具體業(yè)務(wù)bean的地方盅称,比如學(xué)生實(shí)體,賬戶實(shí)體等

new DaoGenerator().generateAll(schema, "./greendaoproject/src/main/java-gen"); 第二個(gè)參數(shù)很重要后室,它代表的是生成那些greenDao中的Dao存放的目錄缩膝,這個(gè)參數(shù)可以是絕對(duì)路徑,也可以是相對(duì)路徑岸霹,但必須存在疾层,可以看到放在了另一個(gè)項(xiàng)目的java-gen目錄下面,于是新建greendaoproject項(xiàng)目贡避,并在main目錄下新建java-gen目錄痛黎,下面是截圖:

看到?jīng)],紅框的地方就是剛才代碼生成的刮吧,當(dāng)然需要執(zhí)行那個(gè)類湖饱,如果沒(méi)有錯(cuò)誤就會(huì)生成這樣一個(gè)目錄,除此之外杀捻,還需要在greendaoproject中指定這個(gè)java-gen為源碼路徑井厌,下面是build.gradle中的指定代碼:

然后 同步sync一下,就可以看到目錄的顏色跟java一樣的了苏章,這代表已經(jīng)加入了源碼路徑了阳似。

好了朽肥,準(zhǔn)備工作已經(jīng)做好了筷转,現(xiàn)在看看那個(gè)目錄到底有啥內(nèi)容吧析珊,前面說(shuō)過(guò)了栋齿,加入了3個(gè)實(shí)體甘晤,按道理會(huì)生成3個(gè)Dao和3個(gè)bean狐血,并在指定的路徑撮弧,實(shí)際上確實(shí)如此潘懊,下面是截圖:

看到了吧,自動(dòng)生成了贿衍,其中還生成了DaoMaster和DaoSession,這兩個(gè)類一般是全局的授舟,官方推薦在自定義的Application中初始化,這樣就避免了多次初始化贸辈,下面是在自定義的applicaiton中初始化數(shù)據(jù)庫(kù)以及獲取各種Dao的代碼

public class BaseApplication extends Application {

private static BaseApplication mInstance;

//db

private SQLiteDatabase db;

private static DaoMaster daoMaster;

private static DaoSession daoSession;

@Override

public void onCreate() {

super.onCreate();

if (mInstance == null) {

mInstance = this;

}

DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, GlobalConfig.DB_NAME, null);

db = helper.getWritableDatabase();

daoMaster = new DaoMaster(db);

daoSession = daoMaster.newSession();

}

public static BaseApplication getInstance() {

return mInstance;

}

public static void setmInstance(BaseApplication mInstance) {

BaseApplication.mInstance = mInstance;

}

public SQLiteDatabase getDb() {

return db;

}

public void setDb(SQLiteDatabase db) {

this.db = db;

}

public static DaoMaster getDaoMaster() {

return daoMaster;

}

public static void setDaoMaster(DaoMaster daoMaster) {

BaseApplication.daoMaster = daoMaster;

}

public static DaoSession getDaoSession() {

return daoSession;

}

public static void setDaoSession(DaoSession daoSession) {

BaseApplication.daoSession = daoSession;

}

public AccountDao getAccountDao() {

return daoSession.getAccountDao();

}

public NoteDao getNoteDao() {

return daoSession.getNoteDao();

}

public StudentDao getStudentDao() {

return daoSession.getStudentDao();

}

}

看到?jīng)]释树,首先用DaoMaster的DevOpenHelper獲取一個(gè)helper,然后用這個(gè)helper打開(kāi)一個(gè)實(shí)際操作的數(shù)據(jù)庫(kù)db ,之后把這個(gè)db作為參數(shù)傳進(jìn)DaoMaster獲取一個(gè)DaoMaster,之后用daoMaster獲取daoSession,有了daoSession,各種業(yè)務(wù)Dao就可以寫(xiě)個(gè)方法獲取了擎淤,因?yàn)镈aoSession管理了所有的Dao,寫(xiě)完之后記得注冊(cè)自定義的application,好了奢啥,下面是開(kāi)始測(cè)試了,我這里只是測(cè)試了插入嘴拢,當(dāng)然桩盲,其他都是一樣的,新建一個(gè)activity,并寫(xiě)如下代碼測(cè)試席吴,我這邊是測(cè)試5000條數(shù)據(jù)

public class MainActivity extends AppCompatActivity {? ? private Listlist=new ArrayList<>();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

for(int i=0;i<5000;i++){

Account account=new Account();

account.setAddress("測(cè)試地址"+i);

account.setName("你好啊赌结,我擦"+i);

account.setNumber("這是號(hào)碼"+i);

list.add(account);

}

long start=System.currentTimeMillis();

AccountDao accountDao=BaseApplication.getInstance().getAccountDao();

accountDao.insertInTx(list);

long end=System.currentTimeMillis();

Log.d("[app]","耗時(shí)為:"+(end-start));

}

}

結(jié)果怎樣呢,我這邊測(cè)試了10次孝冒,結(jié)果如下:

看到?jīng)]柬姚,10次測(cè)試,5000條數(shù)據(jù)迈倍,平均在500毫秒左右,比ORMLite快多了伤靠,ORMLite是利用反射完成的,需要耗費(fèi)一點(diǎn)性能啼染,有人會(huì)說(shuō)假如有10萬(wàn)條數(shù)據(jù),那豈不是很耗時(shí)焕梅,呵呵迹鹅,如果有十萬(wàn)條數(shù)據(jù),沒(méi)必要全部一次性存儲(chǔ)贞言,分開(kāi)存儲(chǔ)斜棚,就是先存儲(chǔ)5000條,然后再存儲(chǔ)5000條,這樣就好弟蚀,當(dāng)然了你可以開(kāi)一個(gè)線程去存儲(chǔ)蚤霞,畢竟你不可能一下子展示10萬(wàn)條數(shù)據(jù),對(duì)吧义钉,當(dāng)你看完前面的5000條數(shù)據(jù)的時(shí)候昧绣,剩下的95000條數(shù)據(jù)早已經(jīng)插入數(shù)據(jù)庫(kù)啦,這個(gè)時(shí)候直接獲取再展示就好了捶闸。好了夜畴,今天就寫(xiě)到這兒吧,各位多去實(shí)踐删壮,多去測(cè)試就知道greenDao有多優(yōu)秀的ORM框架了贪绘。

備注:

通常情況下,數(shù)據(jù)庫(kù)作為緩存的最佳選擇央碟,當(dāng)然除了數(shù)據(jù)庫(kù)税灌,文件也是一個(gè)不錯(cuò)的選擇,但文件在存儲(chǔ)大量數(shù)據(jù)的時(shí)候性能很低的亿虽,在項(xiàng)目中菱涤,我都是利用greendao來(lái)實(shí)現(xiàn)收藏功能,就是獲取到數(shù)據(jù)之后先存儲(chǔ)在本地经柴,然后需要的時(shí)候再獲取顯示狸窘,當(dāng)然除了收藏功能,其他需要利用緩存的地方也是可以使用greenDao的坯认,因?yàn)槿魏螛I(yè)務(wù)都是以對(duì)象的形式存在的翻擒,即使不是對(duì)象,我們也可以構(gòu)造對(duì)象進(jìn)行存儲(chǔ)牛哺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末陋气,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子引润,更是在濱河造成了極大的恐慌巩趁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淳附,死亡現(xiàn)場(chǎng)離奇詭異议慰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)奴曙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門别凹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人洽糟,你說(shuō)我怎么就攤上這事炉菲《檎剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵拍霜,是天一觀的道長(zhǎng)嘱丢。 經(jīng)常有香客問(wèn)我,道長(zhǎng)祠饺,這世上最難降的妖魔是什么越驻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮吠裆,結(jié)果婚禮上伐谈,老公的妹妹穿的比我還像新娘。我一直安慰自己试疙,他們只是感情好诵棵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著祝旷,像睡著了一般履澳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怀跛,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天距贷,我揣著相機(jī)與錄音,去河邊找鬼吻谋。 笑死忠蝗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漓拾。 我是一名探鬼主播阁最,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼骇两!你這毒婦竟也來(lái)了速种?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤低千,失蹤者是張志新(化名)和其女友劉穎配阵,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體示血,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棋傍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了难审。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舍沙。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖剔宪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤葱绒,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布感帅,位于F島的核電站,受9級(jí)特大地震影響地淀,放射性物質(zhì)發(fā)生泄漏失球。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一帮毁、第九天 我趴在偏房一處隱蔽的房頂上張望实苞。 院中可真熱鬧,春花似錦烈疚、人聲如沸黔牵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)猾浦。三九已至,卻和暖如春灯抛,著一層夾襖步出監(jiān)牢的瞬間金赦,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工对嚼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夹抗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓纵竖,卻偏偏與公主長(zhǎng)得像漠烧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子磨确,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 一沽甥、關(guān)于greenDAO greenDAO應(yīng)該算是當(dāng)前最火的數(shù)據(jù)庫(kù)開(kāi)源框架了,它是一個(gè)將對(duì)象映射到SQLite數(shù)據(jù)...
    當(dāng)幸福來(lái)敲門58閱讀 13,851評(píng)論 3 19
  • 序言 (寫(xiě)分享前的序言)大家好.很高興能為大家分享Android之GreenDao筆記,也希望能和大家一起學(xué)習(xí)進(jìn)步...
    王黎聰閱讀 1,087評(píng)論 4 11
  • greenDAO官方主頁(yè):http://greendao-orm.com/ 官方主頁(yè)新地址:http://gree...
    sunny_zhang閱讀 10,120評(píng)論 12 49
  • GreenDao 介紹:greenDAO是一個(gè)對(duì)象關(guān)系映射(ORM)的框架乏奥,能夠提供一個(gè)接口通過(guò)操作對(duì)象的方式去操...
    小董666閱讀 726評(píng)論 0 1
  • CSDN同步更新:http://blog.csdn.net/bskfnvjtlyzmv867/article/de...
    Mr丶sorrow閱讀 1,686評(píng)論 1 0