Android Orm框架(GreenDao)

android項(xiàng)目里面很多都會(huì)有使用sqlite來保存數(shù)據(jù)碉京。原生api真心不好使啊,要寫超多超多的代碼螟深,還要寫顧慮很多細(xì)節(jié)問題谐宙。于是乎就想偷懶了,干脆去網(wǎng)上找個(gè)orm框架吧界弧!

Ok凡蜻,google it搭综。篩選一下,就鎖定了ormlite和greendao咽瓷。簡單看了一下设凹,ormlite簡單好用,比較符合JavaEE開發(fā)者使用習(xí)慣茅姜,注解真的很好用啊月匣!再去greendao官網(wǎng)逛逛钻洒,他說我們的目標(biāo)是:

最牛掰的性能

超好用的API

為Android大大優(yōu)化

最小的內(nèi)存使用

******

再翻翻看,還有同ormlite的性能對比:

上面可以看到锄开,greeendao的insert和update效率要比ormlite快兩倍左右素标,load更是夸張到4倍多。尼瑪也太厲害了吧萍悴,優(yōu)化這么狠头遭。這么一大堆好處,還不趕緊使使癣诱。

我們可以在官網(wǎng)上直接下來计维,也可去github項(xiàng)目主頁上下載源碼。建議去下載github哈撕予,因?yàn)橛性创a有列子鲫惶,比較直觀易懂。源碼使用gradle構(gòu)建实抡,需要安裝gradle插件欠母。其實(shí)真正也只有依賴一個(gè)freemaker.jar,直接網(wǎng)上下載一個(gè)就好吆寨。下面新建一個(gè)java工程赏淌,注意是java工程不是android工程。導(dǎo)入freemaker.jar和greendao-generator.jar啄清,加入到build path六水。建一個(gè)如下的類:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56publicclassDaoGenerator {

publicstaticvoidmain(String[] args)throwsException {

// first parameter for version, second for default generate package

Schema schema =newSchema(1,"com.xckevin.example.model");

addNote(schema);

addCustomerOrder(schema);

addUser(schema);

// set dao class generate package

schema.setDefaultJavaPackageDao("com.xckevin.example.dao");

// keep custom code block

schema.enableKeepSectionsByDefault();

newDaoGenerator().generateAll(schema,"../GreenDaoExample/src");

}

privatestaticvoidaddNote(Schema schema) {

Entity note = schema.addEntity("Note");

note.addIdProperty();

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

note.addStringProperty("comment");

note.addDateProperty("date");

}

privatestaticvoidaddUser(Schema schema) {

Entity user = schema.addEntity("User");

user.setTableName("t_user");

user.addIdProperty();

user.addStringProperty("account").unique();

user.addStringProperty("password");

user.addDateProperty("birthday");

user.addShortProperty("gender");

user.addIntProperty("height");

user.addFloatProperty("weight");

user.addDateProperty("registerTime");

user.implementsInterface("Jsonable");

}

privatestaticvoidaddCustomerOrder(Schema schema) {

Entity customer = schema.addEntity("Customer");

customer.addIdProperty();

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

Entity order = schema.addEntity("Order");

order.setTableName("ORDERS");// "ORDER" is a reserved keyword

order.addIdProperty();

Property orderDate = order.addDateProperty("date").getProperty();

Property customerId = order.addLongProperty("customerId").notNull().getProperty();

order.addToOne(customer, customerId);

ToMany customerToOrders = customer.addToMany(order, customerId);

customerToOrders.setName("orders");

customerToOrders.orderAsc(orderDate);

}

}

代碼號(hào)簡單的話,看名字就知道是什么意思了盒延。greendao支持各種類型的哇缩擂,還支持一對一、一對多添寺、多對多的關(guān)系胯盯,很強(qiáng)悍!直接運(yùn)行计露,代碼生成

自動(dòng)生成model和dao博脑,倍兒爽憎乙!隨便看一個(gè)model類:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123packagecom.xckevin.example.model;

// THIS CODE IS GENERATED BY greenDAO, EDIT ONLY INSIDE THE "KEEP"-SECTIONS

// KEEP INCLUDES - put your custom includes here

importorg.json.JSONException;

importorg.json.JSONObject;

// KEEP INCLUDES END

/**

* Entity mapped to table t_user.

*/

publicclassUserimplementsJsonable {

privateLong id;

privateString account;

privateString password;

privatejava.util.Date birthday;

privateShort gender;

privateInteger height;

privateFloat weight;

privatejava.util.Date registerTime;

// KEEP FIELDS - put your custom fields here

// KEEP FIELDS END

publicUser() {

}

publicUser(Long id) {

this.id = id;

}

publicUser(Long id, String account, String password, java.util.Date birthday, Short gender, Integer height, Float weight, java.util.Date registerTime) {

this.id = id;

this.account = account;

this.password = password;

this.birthday = birthday;

this.gender = gender;

this.height = height;

this.weight = weight;

this.registerTime = registerTime;

}

publicLong getId() {

returnid;

}

publicvoidsetId(Long id) {

this.id = id;

}

publicString getAccount() {

returnaccount;

}

publicvoidsetAccount(String account) {

this.account = account;

}

publicString getPassword() {

returnpassword;

}

publicvoidsetPassword(String password) {

this.password = password;

}

publicjava.util.Date getBirthday() {

returnbirthday;

}

publicvoidsetBirthday(java.util.Date birthday) {

this.birthday = birthday;

}

publicShort getGender() {

returngender;

}

publicvoidsetGender(Short gender) {

this.gender = gender;

}

publicInteger getHeight() {

returnheight;

}

publicvoidsetHeight(Integer height) {

this.height = height;

}

publicFloat getWeight() {

returnweight;

}

publicvoidsetWeight(Float weight) {

this.weight = weight;

}

publicjava.util.Date getRegisterTime() {

returnregisterTime;

}

publicvoidsetRegisterTime(java.util.Date registerTime) {

this.registerTime = registerTime;

}

// KEEP METHODS - put your custom methods here

@Override

publicUser parse(JSONObject jsonObj) {

// TODO Auto-generated method stub

try{

id = jsonObj.getLong("id");

account = jsonObj.getString("account");

returnthis;

}catch(JSONException e) {

e.printStackTrace();

}

returnnull;

}

// KEEP METHODS END

}

注意上面的// KEEP代碼塊中是手動(dòng)加入了,當(dāng)設(shè)置了

?

1

schema.enableKeepSectionsByDefault

后叉趣,該部分代碼塊在下次更新的時(shí)候會(huì)保留下來泞边。

dao類中也有各種基本的方法,如insert,update,delete等等疗杉≌笱瑁基本可能完成大部分需求了,終于不用寫那么繁瑣的數(shù)據(jù)庫操作啦烟具!

再看看怎么在client獲取到dao梢什,注意client要加入greendao.jar哦。有了dao就可以對數(shù)據(jù)庫各種操作了朝聋!

?

1

2

3

4

5DevOpenHelper helper =newDaoMaster.DevOpenHelper(this,"notes-db",null);

db = helper.getWritableDatabase();

daoMaster =newDaoMaster(db);

daoSession = daoMaster.newSession();

userDao = daoSession.getUserDao();

總體來說嗡午,ormlite使用簡單,學(xué)習(xí)成本低冀痕,容易上手荔睹,效率比greendao偏慢一點(diǎn)。greendao耦合性高言蛇,使用時(shí)要另外使用一個(gè)java工程創(chuàng)建僻他,開始環(huán)境搭建比較麻煩,但是一旦上手還是十分容易使用的猜极,并且效率最好中姜。個(gè)人還是推薦使用greendao。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末跟伏,一起剝皮案震驚了整個(gè)濱河市丢胚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌受扳,老刑警劉巖携龟,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異勘高,居然都是意外死亡峡蟋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門华望,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕊蝗,“玉大人,你說我怎么就攤上這事赖舟∨钇荩” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵宾抓,是天一觀的道長子漩。 經(jīng)常有香客問我豫喧,道長,這世上最難降的妖魔是什么幢泼? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任紧显,我火速辦了婚禮,結(jié)果婚禮上缕棵,老公的妹妹穿的比我還像新娘孵班。我一直安慰自己,他們只是感情好挥吵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布重父。 她就那樣靜靜地躺著,像睡著了一般忽匈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上矿辽,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天丹允,我揣著相機(jī)與錄音,去河邊找鬼袋倔。 笑死雕蔽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宾娜。 我是一名探鬼主播批狐,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼前塔!你這毒婦竟也來了嚣艇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對情侶失蹤华弓,失蹤者是張志新(化名)和其女友劉穎食零,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寂屏,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贰谣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了迁霎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吱抚。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖考廉,靈堂內(nèi)的尸體忽然破棺而出秘豹,到底是詐尸還是另有隱情,我是刑警寧澤芝此,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布憋肖,位于F島的核電站因痛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏岸更。R本人自食惡果不足惜鸵膏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望怎炊。 院中可真熱鬧谭企,春花似錦、人聲如沸评肆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓜挽。三九已至盹廷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間久橙,已是汗流浹背俄占。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淆衷,地道東北人缸榄。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像祝拯,于是被迫代替她去往敵國和親甚带。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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