Realm是一個移動端數據庫,用來代替SQLite和ORMs。支持跨平臺,本文簡單介紹Realm在Xamarin.Forms中使用簡單的實現一個任務列表增刪改的Demo。
添加Realm包
Nuget中搜索Realm,選擇對應包添加到項目中,其中Fody
作為依賴包添加到項目中。
成功添加包后會在項目中生成一個FodyWeavers.xml
文件(前提是你項目中沒有引用過Fody包)。對FodyWeavers.xml
文件做如下修改:
PCL項目需要分別為平臺項目和PCL添加Realm包,Shared項目則只在平臺項目中添加Realm包即可
Model的定義
Realm中定義Model需要繼承RealmObject
類,在Model類中可以像普通的C#類一樣定義自己方法和事件,需要注意的是你只能在對象的創建線程中使用它,并為屬性提供getters
和setters
。Realm中Model類必須要有一個無參數的構造函數,在Model中沒有定義任何的構造函數時,編譯器會自動為你添加,如果你定義了任何一個包含參數的構造函數,同時必須定義一個無參數構造函數。
Realm中Model必須直接繼承
RealmObject
,不支持對RealmObject
子類的繼承
支持類型
Realm提供了對基礎無符號值類型的支持(bool
,char
,byte
, short
,int
,long
,float
和double
) ,以及string
和DateTimeOffset
。同時支持類似int?
形式的可空類型。
定義Realm的Model時間類型應該用DateTimeOffset
代替DateTime
。
IList<RealmObject>
和IQueryable<RealmObject>
集合類型支持,定義該集合類型時,應只定義get操作否則會編譯報錯:
用 IList<RealmObject> 和 RealmObject 建立諸如一對多、一對一的關系模型,使用IList時不需要初始化,Realm SDK會幫我們完成這項工作。
特性說明
Backlink
,Ignored
,Indexed
,MapTo
,PrimaryKey
,Required
- Backlink—— Backlink標記的屬性必須是IQueryable<RealmObject>類型。當兩個Model存在一對一或一對多關系時,通過Backlink實現反向鏈接避免手動同步出錯。
- Ignored——Model與表映射時忽略該屬性,即在表中不會生成相應字段。
- Indexed——索引屬性,目前只有string,int,bool和DateTimeOffset可以設置為索引屬性。查詢時把索引屬性作為查詢條件會加快查詢速度。
- MapTo——當Model屬性與表字段名不同時可以通過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提供了兩種創建事務的方法Realm.BeginWrite()
和Realm.Write()
。
-
Realm.BeginWrite()
返回Transaction
對象,Transaction實現了Dispose
接口,所以Realm.BeginWrite()通常與using
代碼塊一起使用自動釋放Transaction對象。所有操作結束后應手動調用Transaction的Commit
方法提交事務。
使用方式如下:
-
Realm.Write()
參數為一個Action對象,通常傳入一個lambda表達式,當lambda主體中代碼執行完成沒有異常時會自動提交事務。
使用方式如下:
更多介紹見Demo。
Demo介紹
TaskUser實體定義
TaskRecord實體定義
AddPage布局中使用DatePicker控件bindingTaskRecord的日期,DatePicker綁定的值為DateTime類型,Realm中用DateTimeOffset類型表示時間,所以必須增加一個Ignored特性標記的DateTime類型作為中間轉換值。
任務列表頁定義
任務列表頁CS文件代碼
任務添加(修改)頁定義
任務添加(修改)頁CS文件定義
Demo效果圖