2012-03-22 33 views
3

我剛開始閱讀關於ORMLite的內容,因爲我有興趣在Android應用程序中使用它。使用ORMLite更新對象及其關係

我想感受一下這個框架應該如何保持對象關係。

舉例來說,如果我有這些類:

@DatabaseTable(tableName = "bill_items") 
class BillItem{...} 

@DatabaseTable(tableName = "bills") 
class Bill { 
    @DatabaseField String x; 

    List<BillItem> billItems = new ArrayList<BillItem>; 

    public void setItems(List<BillItem> billItems) { 
    this.billItems = billItems; 
    } 
} 

據我瞭解推薦的方法來更新Bill對象是類似的東西:

Dao<Bill, String> billDao = DaoManager.createDao(connectionSource, Bill.class); 
Bill bill = billDao.queryForId(...); 

List<BillItem> billItems = ...; //some new list of items 
bill.setX("some new value for X"); 
bill.setItems(billItems); 

//saving explicitly the billItems before saving the bill. Is this correct ? 
Dao<BillItem, String> billItemDao = DaoManager.createDao(connectionSource, BillItem.class); 
for(BillItem billItem : billItems) 
    billItemDao.update(billItem); 

billDao.update(bill); 

是這個推薦的方式來更新關係已更改的對象? (特別是與一組持久對象的關係,如上面的代碼所示)。 不知怎的,我有一個印象,它應該是一個更好的方式來做到這一點。另外,如果我想使用這個框架,我想在模型類中放入域屬性和持久性相關屬性(例如,外鍵和主鍵?)。想知道是否有辦法避免這種混亂的擔憂。

感謝您的任何幫助。

回答

3

你的代碼基本上是正確的,儘管你可以通過一些事情來改善它。

  1. 您應該使用@ForeignCollectionField註釋標記billItems領域。當您查詢Bill時,這將加載收集。請參閱foreign collections上的文檔。

    @ForeignCollectionField 
    ForeignCollection<BillItem> billItems; 
    
  2. 而是通過手中的每個時間做了更新,您可以創建自己的DAO類爲Bill重寫更新update()方法並更新自身內部的對象。

+0

感謝您的回答@Gray。所以區別在於Bill的Dao類的更新方法會爲BillItem調用Dao類,以在所有billItems之間進行迭代並更新每個billItem。那麼目前沒有辦法使這個自動化?手動操作似乎並不好玩。此外,似乎我將不得不手動檢查以前的billItems是否不再在新的billItems列表中,如果是這種情況,請手動從數據庫中刪除它們。遺憾的是,如果所有這些都不能自動化:( – Sergio 2012-03-29 15:28:45

+0

@Sergio如果你使用'ForeignCollection',那麼如果你調用'billItems.remove(bill)'它將通過DAO從集合_and_數據庫中刪除。也可以調用'billItems.update(bill)'在更改它時更新它 – Gray 2012-03-29 15:32:20

+0

@Sergio問題是它現在是代理對象的集合ORALite不知道何時更改了'billItems中的條目'收集,除非你告訴它,你做到了。 – Gray 2012-03-29 15:33:09