我现在的雇主正在使用后端Xamarin.Forms
和 Asp.net mvc开发移动应用程序。我建议在移动应用程序中使用 realm。我的经理希望看到一个POC(Proof of concept)
应用程序使用具有backlink
功能的领域,然后才能允许在应用程序中使用它。我正在 GitHub 上处理 POC。文档非常有限,Realm-dotnet 的 GitHub 存储库没有很好的sample
。 我完成了这个项目。但无法实施backlink
.我开发的示例应用程序允许用户在第一页中创建assignees(employees)
。用户可以使用context menu
删除或编辑员工。当用户单击员工姓名时,应用将导航到该特定员工的ToDoListPage
。在这里,用户可以创建ToDoItems
。在此ToDoList页面上,我想显示仅assigned
该employee
的ToDoItems。 模型如下:
public class Assignee : RealmObject
{
public Assignee()
{
ToDoItems = Enumerable.Empty<ToDoItem>().AsQueryable();
}
[PrimaryKey]
public string Id { get; set; } = Guid.NewGuid().ToString();
public string Name { get; set; }
public string Role { get; set; }
[Backlink(nameof(ToDoItem.Employee))]
public IQueryable<ToDoItem> ToDoItems { get; }
}
public class ToDoItem : RealmObject
{
[PrimaryKey]
public string Id { get; set; } = Guid.NewGuid().ToString();
public string Name { get; set; }
public string Description { get; set; }
public bool Done { get; set; }
public Assignee Employee { get; set; }
}
我正在将员工添加到每个待办事项:
Item.Employee = Employee;
_realm.Add(Item);
现在我想访问员工的待办事项:
Items = _realm.All<Assignee>().Where(x => x.Id == EmployeeId).FirstOrDefault().ToDoItems;
但这行不通。如果有人可以通过最好在我的示例应用程序中编写代码或在回复中编写正确的代码来帮助我,我将不胜感激。
谢谢
首先,Realm .NET 目前不支持遍历属性 (x.Employee.Id
(。因此,当我启动应用程序并尝试转到ToDoListPage
时,该应用程序崩溃并出现异常:
Equal 运算符的左侧必须是对 Realm 中持久化属性的直接访问
Realm 支持对象比较,因此我们可以像这样解决这个问题:
var employee = _realm.Find<Assignee>(EmployeeId);
Items = _realm.All<ToDoItem>().Where(x => x.Employee == employee);
其次,你的代码中一切似乎都很好,所以我深入研究了一下,看看为什么它不起作用。问题是,当我们尝试使用上面的代码获取所有项目时,EmployeeId
参数是null
.由于EmployeeId
是在触发加载逻辑后填充的,因此我们不需要在 ctor 中加载数据。因此,您可以删除此代码。
最后,由于您不会在 ctor 中加载数据,而是在SetValues
方法中加载数据,因此 UI 需要知道在更新数据时,究竟要重绘什么。因此,您还需要将集合标记为Reactive
:
[Reactive]
public IEnumerable<ToDoItem> Items { get; set; }
然后,您需要更改SetValues
方法以使用对象比较,而不是遍历:
async Task SetValues()
{
Employee = _realm.Find<Assignee>(EmployeeId);
Title = Employee.Name;
Items = _realm.All<ToDoItem>().Where(x => x.Employee == Employee);
}
总而言之 - 您无需尝试在 ctor 中加载数据,因为您不知道何时设置EmployeeId
。您已经在跟踪属性何时更改,并且在SetValues
命令中,您只需更改表达式谓词。