Realm是一個(gè)移動端數(shù)據(jù)庫,用來代替SQLite和ORMs缎脾。支持跨平臺从绘,本文簡單介紹Realm在Xamarin.Forms中使用簡單的實(shí)現(xiàn)一個(gè)任務(wù)列表增刪改的Demo访忿。
添加Realm包
Nuget中搜索Realm凿掂,選擇對應(yīng)包添加到項(xiàng)目中伴榔,其中Fody
作為依賴包添加到項(xiàng)目中。
成功添加包后會在項(xiàng)目中生成一個(gè)FodyWeavers.xml
文件(前提是你項(xiàng)目中沒有引用過Fody包)庄萎。對FodyWeavers.xml
文件做如下修改:
PCL項(xiàng)目需要分別為平臺項(xiàng)目和PCL添加Realm包踪少,Shared項(xiàng)目則只在平臺項(xiàng)目中添加Realm包即可
Model的定義
Realm中定義Model需要繼承RealmObject
類,在Model類中可以像普通的C#類一樣定義自己方法和事件糠涛,需要注意的是你只能在對象的創(chuàng)建線程中使用它援奢,并為屬性提供getters
和setters
。Realm中Model類必須要有一個(gè)無參數(shù)的構(gòu)造函數(shù)忍捡,在Model中沒有定義任何的構(gòu)造函數(shù)時(shí)集漾,編譯器會自動為你添加,如果你定義了任何一個(gè)包含參數(shù)的構(gòu)造函數(shù)砸脊,同時(shí)必須定義一個(gè)無參數(shù)構(gòu)造函數(shù)具篇。
Realm中Model必須直接繼承
RealmObject
,不支持對RealmObject
子類的繼承
支持類型
Realm提供了對基礎(chǔ)無符號值類型的支持(bool
,char
,byte
, short
,int
,long
,float
和double
) 脓规,以及string
和DateTimeOffset
栽连。同時(shí)支持類似int?
形式的可空類型险领。
定義Realm的Model時(shí)間類型應(yīng)該用DateTimeOffset
代替DateTime
侨舆。
IList<RealmObject>
和IQueryable<RealmObject>
集合類型支持,定義該集合類型時(shí)绢陌,應(yīng)只定義get操作否則會編譯報(bào)錯(cuò):
用 IList<RealmObject> 和 RealmObject 建立諸如一對多挨下、一對一的關(guān)系模型,使用IList時(shí)不需要初始化脐湾,Realm SDK會幫我們完成這項(xiàng)工作臭笆。
特性說明
Backlink
,Ignored
,Indexed
,MapTo
,PrimaryKey
,Required
- Backlink—— Backlink標(biāo)記的屬性必須是IQueryable<RealmObject>類型。當(dāng)兩個(gè)Model存在一對一或一對多關(guān)系時(shí),通過Backlink實(shí)現(xiàn)反向鏈接避免手動同步出錯(cuò)愁铺。
- Ignored——Model與表映射時(shí)忽略該屬性鹰霍,即在表中不會生成相應(yīng)字段。
- Indexed——索引屬性茵乱,目前只有string,int,bool和DateTimeOffset可以設(shè)置為索引屬性茂洒。查詢時(shí)把索引屬性作為查詢條件會加快查詢速度。
- MapTo——當(dāng)Model屬性與表字段名不同時(shí)可以通過MapTo匹配瓶竭。
- PrimaryKey——主鍵督勺,可以指定Model中唯一屬性為主鍵且只有char,int和string類型屬性可以作為主鍵斤贰,主鍵的值具有唯一性智哀。
- Required——表示該屬性不能為空。
For objects where you have specified a [PrimaryKey], you can pass in update: true in realm.Addto add the passed in object or update the existing one
Create荧恍、Update瓷叫、Delete操作
Realm中所有增刪改的操作都必須在事物中完成(a write transaction)。Realm提供了兩種創(chuàng)建事務(wù)的方法Realm.BeginWrite()
和Realm.Write()
送巡。
-
Realm.BeginWrite()
返回Transaction
對象赞辩,Transaction實(shí)現(xiàn)了Dispose
接口,所以Realm.BeginWrite()通常與using
代碼塊一起使用自動釋放Transaction對象授艰。所有操作結(jié)束后應(yīng)手動調(diào)用Transaction的Commit
方法提交事務(wù)辨嗽。
使用方式如下:
-
Realm.Write()
參數(shù)為一個(gè)Action對象,通常傳入一個(gè)lambda表達(dá)式淮腾,當(dāng)lambda主體中代碼執(zhí)行完成沒有異常時(shí)會自動提交事務(wù)糟需。
使用方式如下:
更多介紹見Demo。
Demo介紹
TaskUser實(shí)體定義
TaskRecord實(shí)體定義
AddPage布局中使用DatePicker控件bindingTaskRecord的日期谷朝,DatePicker綁定的值為DateTime類型洲押,Realm中用DateTimeOffset類型表示時(shí)間,所以必須增加一個(gè)Ignored特性標(biāo)記的DateTime類型作為中間轉(zhuǎn)換值圆凰。
任務(wù)列表頁定義
任務(wù)列表頁CS文件代碼
任務(wù)添加(修改)頁定義
任務(wù)添加(修改)頁CS文件定義
Demo效果圖