7

我有两个实体,User并且Store. User有很多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();

}

每当我尝试调用时,我都会收到“实体与 DAO 上下文分离”异常 user.getStoreList()。异常发生在以下代码中,如下daoSession所示null

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;
}
4

1 回答 1

10

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

看起来您没有使用 greendao 加载用户对象,而是使用new.

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

最重要的是,您还只是在每个商店中设置用户 ID。如果您没有在其他地方插入用户对象,这也可能导致错误,因为外键约束可能被破坏(取决于 greendao 在内部如何处理)。

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

如果这不起作用,请先尝试使用UserDao.

于 2013-09-11T09:17:36.483 回答