2017-09-01 72 views
0

我有一個存儲產品列表的表。我只想在任何行得到更新時得到通知。我可以使用RealmChangeListener。下面ID我的代碼如何在領域對象更新時得到通知

public void updateProducts(final List<Product> products) { 
    Realm realmObj = Realm.getDefaultInstance(); 
    for (Product product : products) { 
     if (product.shouldBeDeleted()) { 
      delete(product.getBarcode()); 

     } else { 
      realmObj.beginTransaction(); 
      realmObj.copyToRealmOrUpdate(product); 
      realmObj.commitTransaction(); 
     } 
    } 
    realmObj.close(); 

} 

回答

0

是的,你可以使用領域變化監聽... 我用我的項目是這樣

product.addChangeListener(new RealmChangeListener<RealmModel>() { 
      @Override 
      public void onChange(RealmModel realmModel) { 
       //Your code when any row update or insert new record 
      } 
     }); 

對於細節可以參考此鏈接

https://realm.io/docs/java/latest/api/io/realm/RealmChangeListener.html

+0

所以,即使在表中插入新條目或者只有當退出行已更新時,它纔會被調用。另外我必須在循環中添加這個監聽器。 – swati

+0

@swati當新的條目或現有的行都更新時,它會調用 –

+0

我只想在更新完成時收到通知。 – swati

0

你可以使用我們的細粒度收集通知,它會報告做了什麼樣的修改:

RealmResults<Product> products = realm.where(Product.class).findAll(); 
products.addChangeListener(new OrderedRealmCollectionChangeListener<RealmResults<Product>>() { 
    @Override 
    public void onChange(RealmResults<Product> products, OrderedCollectionChangeSet changeSet) { 
    for (int i : changeSet.getChanges()) { 
     // Item at index i was updated 
    } 
    } 
}); 
0
public void updateProducts(final List<Product> products) { 
    try(Realm r = Realm.getDefaultInstance()) { 
     r.executeTransaction((realm) -> { 
      for (Product product : products) { 
       if (product.shouldBeDeleted()) { 
        delete(product.getBarcode()); 
       } else { 
        realm.insertOrUpdate(product); 
       } 
      } 
     }); 
    }  
} 

而且在UI線程別處:

private Realm realm; 
private RealmResults<Product> results; 
private RealmChangeListener<RealmResults<Product>> listener = (element) -> { 
    if(element.isLoaded()) { 
     // results are loaded, or a change occurred! 
    } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.some_layout); 
    realm = Realm.getDefaultInstance(); 
    results = realm.where(Product.class).findAllAsync(); 
    results.addChangeListener(listener); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    results.removeChangeListener(listener); 
    results = null; 
    realm.close(); 
} 

附:你也想要通知插入和刪除,否則你的UI將會失去同步。謝天謝地,這是默認行爲。

+0

我只想得到通知時更新不是插入。在兩種情況下,element.isLoaded()都將返回true,否則它將返回true以進行插入,並返回false以進行更新。請幫助我,因爲我堅持這一點。謝謝!! – swati

+0

我正在尋找可以告訴我記錄是插入還是更新的方式。由於有數千條記錄,我不想遍歷表格。 – swati

+0

我不知道你需要這些信息。有一個機會,我只是添加一個布爾字段到我的模型,指出這是一個新的對象還是更新的。 – EpicPandaForce