C# - 如何删除领域中的行 - android xamarin

时间:2016-10-13 06:47:37

标签: c# android xamarin.android realm

我试过这个我创建的方法,但它提示我一个错误:

Realms.RealmInvalidObjectException:此对象已分离。它是从领域中删除的吗?'

    public void deleteFromDatabase(List<CashDenomination> denom_list)
    {
        using (var transaction = Realm.GetInstance(config).BeginWrite())
        {
            Realm.GetInstance(config).Remove(denom_list[0]);
            transaction.Commit();
        }
    }

在C#编码类型中从域中删除数据库的正确编码是什么?

3 个答案:

答案 0 :(得分:2)

你正在以正确的方式做到这一点。您收到的错误消息表明该对象已被删除。你确定它仍然存在于领域吗?

<强>更新

我决定更新这个答案,因为我对其他答案的评论有点难以阅读。

您的原始代码应该可以正常工作。但是,如果您希望deleteFromDatabase接受已经删除的CashDenomination个实例的列表,或者从未添加到域中,则需要添加一个检查。此外,请注意您应该保留Realm实例并在您创建的事务中使用它。在大多数情况下,您希望保持更长时间,但通过GetInstance获取它的开销很小。

public void deleteFromDatabase(List<CashDenomination> denom_list)
{
    if (!denom_list[0].IsValid) // If this object is not in the realm, do nothing.
        return;

    var realm = Realm.GetInstance(config);
    using (var transaction = realm.BeginWrite())
    {
        realm.Remove(denom_list[0]);
        transaction.Commit();
    }
}

现在,如果你想使用标识符,你可以像查看一样,但仍然只使用Remove

public void deleteFromDatabase(int denom_id)
{
    var realm = Realm.GetInstance(config);

    var denom = realm.All<CashDenomination>().FirstOrDefault(c => c.denom_id == denom_id);
    if (denom == null)  // If no entry with this id exists, do nothing.
        return;

    using (var transaction = realm.BeginWrite())
    {
        realm.Remove(denom);
        transaction.Commit();
    }
}

最后,如果您的CashDenomination denom_id标记为PrimaryKey,您可以这样查看:

public void deleteFromDatabase(int denom_id)
{
    var realm = Realm.GetInstance(config);

    var denom = realm.ObjectForPrimaryKey<CashDenomination>(denom_id);
    if (denom == null)  // If no entry with this id exists, do nothing.
        return;

    using (var transaction = realm.BeginWrite())
    {
        realm.Remove(denom);
        transaction.Commit();
    }
}

答案 1 :(得分:1)

public void deleteFromDatabase(Realm realm, long cashDenominatorId)
{
    realm.Write(() => 
    {
         var cashDenominator = realm.All<Person>().Where(c => c.Id == cashDenominatorId);
         Realm.RemoveRange<CashDenomination>(((RealmResults<CashDenomination>)cashDenominator));
    });
}

你可以称之为

Realm realm = Realm.GetInstance(config);
var denom_list = ...
// ...
deleteFromDatabase(realm, denom_list[0].id);

答案 2 :(得分:1)

我已经使用了这个代码:)感谢@EpicPandaForce的答案。

git push -n

它现在正毫无例外地删除我的数据:)