2012-04-23 5 views
11

В моем Android-проекте ORMLite работает как кеш. Я загружаю данные с веб-сервера и помещаю его в базу данных. Я вызываю createOrUpdate на мои объекты, но дубликаты появляются в базе данных. Записи базы данных идентичны, за исключением первичного ключа (который является просто автоматически увеличивающимся целым числом). Я думаю, что, поскольку мой второй объект еще не имеет первичного ключа, ORMLite считает, что эти два являются разными, хотя каждое другое поле идентично.createOrUpdate() всегда создает новую запись в базе данных с ORMLite

Кто-нибудь знает, если это правда?

ответ

16

Вы не должны звонить createOrUpdate, если у вашего объекта нет имеет набор полей идентификатора. Способ ORMLite определяет, существует ли он в базе данных, чтобы он выполнял по нему запрос. Код:

ID id = extractId(data); 
// assume we need to create it if there is no id <<<<<<<<<<<<<<<<<<<<<<< 
if (id == null || !idExists(id)) { 
    int numRows = create(data); 
    return new CreateOrUpdateStatus(true, false, numRows); 
} else { 
    int numRows = update(data); 
    return new CreateOrUpdateStatus(false, true, numRows); 
} 

Я расширю javadocs, чтобы объяснить это лучше. Они очень слабый там. Сожалею. Я обновил их как:

Это удобный метод для создания элемента в базе данных, если он не существует. Идентификатор извлекается из аргумента данных, и запрос-по-идентификатору делается в базе данных. Если строка в базе данных с тем же идентификатором существует, то все столбцы в базе данных будут обновляться из полей в параметре данных. Если id имеет значение null (или 0 или какое-либо другое значение по умолчанию) или не существует в базе данных, тогда объект будет создан в базе данных. Это также означает, что ваш элемент данных должен иметь определенное поле идентификатора.

+0

Awesome! Я начал подозревать, что это было поведением. Спасибо, что пролил свет. – Quentamia

+0

На самом деле мне нужно, чтобы у ОР было +1, чтобы пролить свет на значение по умолчанию, необходимое для получения новой вставки :)! – AgentKnopf

+2

Как насчет столбца с аннотацией поля «сгенерированныйId = true»? Также он всегда создает новую запись в базе данных. См. ['Ошибка # 173'] (http://sourceforge.net/p/ormlite/bugs/173/). – user2784435

0

Кажется, что вам необходимо вручную извлечь идентификатор уже существующей записи, а затем update базы данных на основе вашего фактического уникального идентификатора. Пример с уникальными адресами:

CacheItem newEntry = fetchEntry("..."); // fetch it here 
List<CacheItem> existing = mDao.queryForEq("url", newEntry.getUrl()); 
if (existing.size() > 0) { 
    int id = existing.get(0).getId(); 
    newEntry.setId(id); 
    mDao.update(newEntry); 
} else mDao.create(newEntry); 
0

Установите свой первичный ключ, чтобы он работал нормально.

@DatabaseField (columnName = "id", uniqueIndex = true) private int id;

Работал для меня. Исключения выбрасываются на фоне, но он работает: D

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