我有两个实体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();
}
每当我尝试拨打user.getStoreList()
时,我都会收到“实体与DAO上下文分离”异常。由于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;
}
答案 0 :(得分:9)
表示数据库条目的对象(如User
)仅在数据库会话中从数据库中提取或之前插入数据库时才附加到数据库会话中。
看起来你没有使用greendao加载你的用户对象,而只是用new
创建它。
您似乎也不使用dao存储此用户对象。因此,用户对象未附加到会话。
除此之外,您还要在每个商店中设置用户ID。如果你还没有在其他地方插入用户对象,这也可能导致错误,因为foreignkey-constraint可能会被破坏(取决于greendao在内部如何处理它)。
尝试使用setUser()
而不是setUserIdForStore()
将用户对象添加到商店。
如果这不起作用,请先尝试使用UserDao
存储或加载用户对象。