【发布时间】:2016-06-14 18:33:37
【问题描述】:
我的数据库中有 2 个如下所示的托管对象。
public class Product : RealmObject
{
public int Id { get; set; }
public string Name { get; set; }
public string Date { get; set; }
public RealmList<Report> Reports { get; } // child objects
}
和
public class Report : RealmObject
{
public int Id { get; set; }
public string Ref { get; set; }
public string Date { get; set; }
public Product Parent { get; set; } // Parent object reference
}
每次加载我的应用程序时,网络点击都会获取产品列表,然后开始在 Realm 数据库中管理它们,它会在 TableView 中显示产品。当您单击表格视图中的一个产品时,您会得到一个报告列表。报告列表由另一个使用产品 ID 的网络点击获取。每次我从 Web 获得新的报告列表时,我都需要从 Realm 数据库中删除所有旧的 Report 对象,这些对象链接到一个特定的产品(按 id)。
这就是混乱。根据这个https://realm.io/docs/xamarin/latest/#current-limitations,目前不支持级联删除。我认为这意味着在我上面的关系中删除了对象。因此,目前在不破坏事物的情况下删除子对象(RealmList)的最佳方法是什么。到目前为止,我提出了两种方法。这是一些代码。
方法 A:
// id is passed in as a param by function
var reportsById = realm.All<Report>.Where(r => r.Product.Id == id).ToList();
foreach (var report in reportsById)
{
// Delete an object with a transaction
using (var trans = realm.BeginWrite())
{
realm.Remove(report);
trans.Commit();
}
}
// Then simply add the new reports to my old Product
// Pseudo code
var newreports = getnewreports()
foreach report in newreports
product.Reports.add(report)
方法 B:
// Get the current Product object
var currentProduct = realm.All<Product>.Where(p => p.Id == id).ToList().FirstOrDefault();
foreach (var report in currentProduct.Reports)
{
// Delete an object with a transaction
using (var trans = realm.BeginWrite())
{
realm.Remove(report);
trans.Commit();
}
}
// Add new reports to product again
最后,这是我用来将子对象(来自网络的报告)添加到父对象(产品)的方法。
// First
var webReports = await FetchWebReport(); // IList<Report> type
/...../
// Then
var currentProduct = Realm.blah()... // get from realm database with query
foreach (var report in webReports)
{
// Manage object with a transaction
using (var trans = realm.BeginWrite())
{
// Add reference to parent product
report.Parent = currentProduct;
// Add to child list in product
currentProduct.Reports.Add(report);
trans.Commit();
}
}
有没有人有任何想法/意见?随意挑选我当前的代码。指出问题。感谢 Realm 开发人员。 =)
【问题讨论】: