Xamarin.Forms Realm 使用入门

Realm是一个移动端数据库,用来代替SQLite和ORMs。支持跨平台,本文简单介绍Realm在Xamarin.Forms中使用简单的实现一个任务列表增删改的Demo。

《Xamarin.Forms Realm 使用入门》

添加Realm包

Nuget中搜索Realm,选择对应包添加到项目中,其中Fody作为依赖包添加到项目中。

《Xamarin.Forms Realm 使用入门》

成功添加包后会在项目中生成一个FodyWeavers.xml文件(前提是你项目中没有引用过Fody包)。对FodyWeavers.xml文件做如下修改:

《Xamarin.Forms Realm 使用入门》

PCL项目需要分别为平台项目和PCL添加Realm包,Shared项目则只在平台项目中添加Realm包即可

Model的定义

Realm中定义Model需要继承RealmObject类,在Model类中可以像普通的C#类一样定义自己方法和事件,需要注意的是你只能在对象的创建线程中使用它,并为属性提供getterssetters。Realm中Model类必须要有一个无参数的构造函数,在Model中没有定义任何的构造函数时,编译器会自动为你添加,如果你定义了任何一个包含参数的构造函数,同时必须定义一个无参数构造函数。

Realm中Model必须直接继承RealmObject,不支持对RealmObject子类的继承

支持类型

Realm提供了对基础无符号值类型的支持(bool,char,byte, short,int,long,floatdouble) ,以及stringDateTimeOffset。同时支持类似int?形式的可空类型。
定义Realm的Model时间类型应该用DateTimeOffset代替DateTime
IList<RealmObject>IQueryable<RealmObject>集合类型支持,定义该集合类型时,应只定义get操作否则会编译报错:

《Xamarin.Forms Realm 使用入门》

用 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方法提交事务。
    使用方式如下:

    《Xamarin.Forms Realm 使用入门》

  • Realm.Write()参数为一个Action对象,通常传入一个lambda表达式,当lambda主体中代码执行完成没有异常时会自动提交事务。
    使用方式如下:

    《Xamarin.Forms Realm 使用入门》

更多介绍见Demo。

Demo介绍

TaskUser实体定义

《Xamarin.Forms Realm 使用入门》

TaskRecord实体定义

《Xamarin.Forms Realm 使用入门》

AddPage布局中使用DatePicker控件bindingTaskRecord的日期,DatePicker绑定的值为DateTime类型,Realm中用DateTimeOffset类型表示时间,所以必须增加一个Ignored特性标记的DateTime类型作为中间转换值。

任务列表页定义

《Xamarin.Forms Realm 使用入门》

任务列表页CS文件代码

《Xamarin.Forms Realm 使用入门》

任务添加(修改)页定义

《Xamarin.Forms Realm 使用入门》

任务添加(修改)页CS文件定义

《Xamarin.Forms Realm 使用入门》

Demo效果图

《Xamarin.Forms Realm 使用入门》

点赞