C# - how to delete row in realm - android xamarin

前端 未结 3 421
暖寄归人
暖寄归人 2021-01-28 10:35

i tried this method that I created but it prompts me an error:

Realms.RealmInvalidObjectException:This object is detached. Was it deleted from the realm?\'

相关标签:
3条回答
  • 2021-01-28 10:54
    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));
        });
    }
    

    Which you would call as

    Realm realm = Realm.GetInstance(config);
    var denom_list = ...
    // ...
    deleteFromDatabase(realm, denom_list[0].id);
    
    0 讨论(0)
  • 2021-01-28 11:10

    You are doing it the right way. The error message you are getting indicates that the object was removed already. Are you sure it still exists in the realm?

    UPDATE:

    I decided to update this answer because my comment on the other answer was a bit hard to read.

    Your original code should work fine. However, if you want deleteFromDatabase to accept lists with CashDenomination instances that either have been removed already or perhaps were never added to the realm, you would need to add a check. Furthermore, note that you should hold on to your Realm instance and use it in the transaction you created. In most cases, you want to keep it around even longer, though there is little overhead to obtaining it via 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();
        }
    }
    

    Now, if you want to use identifiers, you could look it up like you do, but still just use 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();
        }
    }
    

    Finally, if your CashDenomination has denom_id marked as PrimaryKey, you could look it up like this:

    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();
        }
    }
    
    0 讨论(0)
  • 2021-01-28 11:14

    I already made it having this code :) thanks to @EpicPandaForce 's answer.

        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));
            });
        }
    

    it is now deleting my data without exception :)

    0 讨论(0)
提交回复
热议问题