2013-09-02 16 views
6

私はUserStoreという2つのエンティティを持っています。 Userには多くのStores(1:M)の関係があります。私はいくつかのストアリストを次のコードによってストアテーブルに挿入しました。DaoException:エンティティがDAOコンテキストからデタッチされました

public void saveStoresToDatabase(Context context, ArrayList<Store> storeList) { 

    DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, "notes-db", null); 
    SQLiteDatabase db = helper.getWritableDatabase(); 
    DaoMaster daoMaster = new DaoMaster(db); 

    DaoSession daoSession = daoMaster.newSession(); 
    StoreDao storeDao = daoSession.getStoreDao(); 

    ArrayList <Store> list = SharedData.getInstance().getUser().getStoreList(); 

    for(int i = 0; i < storeList.size(); i++) { 
     storeList.get(i).setUserIdForStore(SharedData.getInstance().getUser().getId()); 
    } 
    storeDao.insertOrReplaceInTx(storeList); 
    list.addAll(storeList); 
    user.resetStoreList(); 

} 

私はuser.getStoreList()を呼び出してみたときに、私は「エンティティがDAOコンテキストから切り離され、」例外を取得しています。例外は、daoSessionnullであるため、次のコードでスニップされます。

SharedDataユーザオブジェクトを有する、私のシングルトンである
public ArrayList<Store> getDMStoreListFromDatabase(Context context) { 
    return SharedData.getInstance().getUser().getStoreList(); 
} 

private SharedData() { 
    user = new User(); 
} 

、私は次のようsharedDataインスタンスを取得:(Userのような)データベースエントリを表す

public static synchronized SharedData getInstance() { 
    if (sharedObject == null) { 
     sharedObject = new SharedData(); 
    } 
    return sharedObject; 
} 
+0

ユーザオブジェクトを取得する場所と、user.getStoreList()をどこで呼び出すかに関するコードを入力してください。 storeListがdbに正しく挿入されていますか?選択したユーザーのStoreListがデータベースに存在していますか? – AlexS

+0

私はいくつかのコードを入れて私の質問を編集しました。はい、私はトランザクションで挿入していますが、storeListが挿入されていると確信していますが、リスト要素を1つずつ挿入してチェックしました。ユーザーが1人しかいないので、選択したユーザーのstoreListは、正常に挿入されたのでdbにあると確信しています。データベーステーブルを表示する方法はありますか? –

答えて

9

オブジェクトでありますそれらがデータベースからフェッチされたか、以前にデータベースに挿入されている場合にのみ、データベースセッションに添付されます。

greendaoを使用してユーザーオブジェクトを読み込まず、代わりにnewで作成するようです。

あなたはdaoを使用してこのユーザーオブジェクトを保存していないようです。したがって、ユーザオブジェクトはセッションにアタッチされません。

さらに、各ストアでユーザーIDを設定するだけです。他の場所にユーザオブジェクトを挿入していない場合、これは、foreignkey-constraintが(内部的にgreendaoがどのように処理するかによって)壊れる可能性があるため、エラーを引き起こす可能性があります。

setUserIdForStore()ではなく、setUser()のユーザーオブジェクトを店舗に追加してください。

これが機能しない場合は、最初にUserDaoを使用してユーザーオブジェクトを格納またはロードしてください。

+0

「UserDaoを使用して最初にユーザーオブジェクトを格納/ロードする」という提案は機能しました。 "setUserIdForStore()"の設定については、データベースに挿入しようとしている各ストアのIDを設定するために、サーバーは既にデータベースに挿入されているストアと同じストアのリストを返す可能性があるため、userIdForStoreキーダウンロードされたstoresListとログインしたuserIdを使用してinsertOrReplaceを成功させると、storeListがフェッチされてdbに挿入されるたびに重複レコードが挿入されます。考えられる原因を突き止めることができますか? –

+0

私はあなたのニーズを正確に理解していません。ユーザーには多くのストアがあり、ストアは1人のユーザーに属します。特定のユーザーにストアを追加する場合は、idだけでなくユーザー全体のオブジェクトを使用してユーザーを設定してください。あなたはORMフレームワークを使用していますので、idを使いこなすのではなく、オブジェクトを使用してください。さもなければ、奇妙な行動が起こるかもしれません。 – AlexS

関連する問題