【问题标题】:C# - how to delete row in realm - android xamarinC# - 如何删除领域中的行 - android xamarin
【发布时间】:2016-10-13 06:47:37
【问题描述】:

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

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# 类型的编码中从领域中的数据库中删除记录的正确编码是什么?

【问题讨论】:

    标签: c# android xamarin.android realm


    【解决方案1】:

    你做对了。您收到的错误消息表明该对象已被删除。你确定它还在领域中吗?

    更新:

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

    您的原始代码应该可以正常工作。但是,如果您希望 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();
        }
    }
    

    最后,如果您的CashDenominationdenom_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();
        }
    }
    

    【讨论】:

    • 我已经删除了关于 .First() 的内容,因为我了解到它不是通过 realm 中的选择查询删除的一部分。它与问题无关,因此我将其删除。但作为我问题的一部分,我如何检查它是否真的被删除了? :)
    • @jace 你可以试试RealmObject.IsValid。如果对象被删除,则返回 false。
    • 我在这里尝试过,但没有 .IsValid 可用于领域实例、领域本身或在我的对象中删除 :( 我做错了吗? public void deleteFromDatabase(int form_id) { realm.Write( () => { var cashflow_form = realm.All().Where(c => c.form_id == form_id); realm.RemoveRange(((RealmResults)cashflow_form)); realm.IsValid() ; Realm.IsValid(); cashflow_form.IsValid(); }); }
    • 我在这里找到了 --->>>
    • RealmObject asd = new RealmObject(); asd.IsValid() 但如何使用 RealmObject?因为我的代码来自我的第三条评论。以及如何将我的评论格式化为可读评论?当我输入它时它看起来最糟糕 LOL
    【解决方案2】:
    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);
    

    【讨论】:

    • 严重性代码描述项目文件行抑制状态错误 CS1503 参数 1:无法从 'System.Linq.IQueryable' 转换为 'Realms.RealmResults ' RBOS 2.0 D:\Visual Studio 2015\Projects\RBOS 2.0\RBOS 2.0\Realm\RealmDatabase.cs 67 Active 它给我一个错误
    • 嗯,Xamarin 领域有多么愚蠢的 API。无论如何,添加了必要的演员表。
    【解决方案3】:

    感谢@EpicPandaForce 的回答,我已经有了这个代码:)。

        public void deleteFromDatabase(int denom_ID, int form_ID)
        {            
            //Realm realm;
            //and
            //RealmConfiguration config = new RealmConfiguration(dbPath, true);
            //was initialized at the top of my class
    
            realm = Realm.GetInstance(config);
    
            realm.Write(() =>
            {
                var cashflow_denom = realm.All<CashDenomination>().Where(c => c.denom_id == denom_ID);
                var cashflow_form = realm.All<CashForm>().Where(c => c.form_id == form_ID);
    
                realm.RemoveRange(((RealmResults<CashDenomination>)cashflow_denom));
                realm.RemoveRange(((RealmResults<CashForm>)cashflow_form));
            });
        }
    

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

    【讨论】:

    • 我很高兴这对您有用,但没有必要使用RemoveRange - 该方法旨在一次删除多个对象。 Realm.Remove() 仅用于删除单个对象。你应该用类似的东西来达到同样的效果:var o = realm.All&lt;CashDenomination&gt;().FirstOrDefault(c =&gt; c.denom_id == denom_ID); if (o != null) realm.Write(() =&gt; { realm.Remove(o); }); 此外,如果denom_id 被标记为主键,你可以使用ObjectForPrimaryKey
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    相关资源
    最近更新 更多