DaoException:实体与DAO上下文分离

时间:2013-09-02 16:46:57

标签: greendao

我有两个实体UserStoreUser有许多Stores(1:M)关系。我已经通过以下代码将一些商店列表插入到商店表中。

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,所以在以下代码中发生异常。

public ArrayList<Store> getDMStoreListFromDatabase(Context context) {
    return SharedData.getInstance().getUser().getStoreList();
}

其中SharedData是我的单身人士,拥有一个用户对象:

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

我得到sharedData实例如下:

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

1 个答案:

答案 0 :(得分:9)

表示数据库条目的对象(如User)仅在数据库会话中从数据库中提取或之前插入数据库时​​才附加到数据库会话中。

看起来你没有使用greendao加载你的用户对象,而只是用new创建它。

您似乎也不使用dao存储此用户对象。因此,用户对象未附加到会话。

除此之外,您还要在每个商店中设置用户ID。如果你还没有在其他地方插入用户对象,这也可能导致错误,因为foreignkey-constraint可能会被破坏(取决于greendao在内部如何处理它)。

尝试使用setUser()而不是setUserIdForStore()将用户对象添加到商店。

如果这不起作用,请先尝试使用UserDao存储或加载用户对象。