2013-09-02 3 views
6

У меня есть два объекта, User и Store. User имеет много отношений (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(); 

} 

Я получаю «объект отсоединяется от контекста DAO» исключение всякий раз, когда я пытаюсь позвонить user.getStoreList(). Исключение происходит при следующем коде sniped, поскольку 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

Просьба указать код, где вы можете получить пользовательский объект, и где вы вызываете user.getStoreList(). Вы уверены, что storeList правильно вставлен в ваш db? Вы уверены, что для выбранного пользователя в db есть StoreList? – AlexS

+0

Я отредактировал мой вопрос, поставив некоторый код, да, я уверен, что storeList вставлен, хотя я вставляю транзакцию, но я также проверил его, вставив элементы списка один за другим. Есть только один пользователь, так что да, я уверен, что storeList для выбранного пользователя находится в db, поскольку он был успешно вставлен. Есть ли способ просмотреть таблицы базы данных? –

ответ

9

Объекты, представляющие записи базы данных (как User) являются только привязанные к сеансу базы данных, если они были извлечены из базы данных или вставлены в базу данных раньше.

Похоже, вы не загружаете свой пользовательский объект, используя greendao, но вместо этого просто создавайте его с помощью new.

Возможно, вы не храните этот пользовательский объект с помощью dao. Таким образом, пользовательский объект не привязан к сеансу.

Кроме того, вы также просто устанавливаете идентификатор пользователя в каждом магазине. Если вы еще не вставили объект-пользователь в другое место, это может также вызвать ошибку, так как ограничение внешнего ключа может быть нарушено (в зависимости от того, как greendao обрабатывает это внутренне).

Попробуйте добавить объект-пользователь в магазины с setUser() вместо setUserIdForStore().

Если это не сработает, попробуйте сначала сохранить или загрузить пользовательский объект, используя UserDao.

+0

Предложение «хранить/загружать пользовательский объект с использованием UserDao». О настройке «setUserIdForStore()», я делал это, чтобы установить идентификатор для каждого хранилища, который я собираюсь вставить в db, сервер может вернуть список тех же магазинов, которые уже вставлены в базу данных, поэтому я заменяю ключ userIdForStore для загруженные магазиныList с зарегистрированным пользователем userId, чтобы сделать insertOrReplace успешным, однако, повторяющиеся записи вставляются каждый раз, когда storeList извлекается и вставляется в db. Можете ли вы указать возможную причину? –

+0

Я точно не понимаю ваши потребности. У пользователя много магазинов и магазин принадлежит одному пользователю, не так ли? Если вы хотите добавить магазин к определенному пользователю, попробуйте установить пользователя, используя весь объект-пользователь, а не только идентификатор. Вы используете ORM-Framework, поэтому старайтесь не путаться с id, но используйте объекты. В противном случае может возникнуть странное поведение. – AlexS

Смежные вопросы