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效果图
网友评论