2012-03-22 8 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. あなたはbillItemsフィールドをマークするために@ForeignCollectionFieldアノテーションを使用する必要があります。 Billを照会すると、コレクションがロードされます。 foreign collectionsのドキュメントを参照してください。

    @ForeignCollectionField 
    ForeignCollection<BillItem> billItems; 
    
  2. の代わりに手で毎回更新をやって、あなたは更新update()メソッドをオーバーライドし、独自に内部のオブジェクトを更新しBillための独自のダオクラスを作成することができます。

+0

回答ありがとう@Gray。したがって、BillのDaoクラスの更新メソッドは、すべてのbillItemを繰り返し処理し、それぞれを更新するためにBillItemのDaoクラスを呼び出します。だから現在これを自動化する方法はありませんか?手動で行うのは面白くないようです。また、以前のbillItemsが新しいbillItemsリストにないかどうかを手動でチェックしなければならない場合は、手動でデータベースから削除してください。 ( – Sergio

+0

@Sergio 'ForeignCollection'を使用している場合、' billItems.remove(bill) 'を呼び出すと、それはDAOを介してデータベースとコレクションから削除されます。 – Gray

+0

@Sergio問題は、それがプロキシオブジェクトのコレクションになっていることです。あなたが 'billItems 'のエントリを変更したときに、ORMLiteは考えていません。あなたがしたことを伝えない限り、「コレクション」と呼ばれます。 – Gray

関連する問題