2013-06-06 6 views
0

Я использую ORMlite, и мне интересно, возможно ли иметь несколько столбцов идентификации в одной таблице.Два столбца идентификации

У меня есть таблица с двумя конкретными столбцами среди других: идентификатор и номер. Я хочу, чтобы ORMlite только обновлял строку, если идентификатор и номер совпадают, иначе он должен создать новую строку. Я использую метод createOrUpdate.

Спасибо.

ответ

1

Прочтите эту статью и документацию ORMLite; Multiple primary keys - ORMlite

Я не уверен на 100% ответ на этот вопрос. uniqueCombo = true кажется хорошей догадкой, но я не уверен, что такие вещи, как Update и Delete, все еще работают. Тебе придется самому протестировать.

+0

Спасибо за эту ссылку, пропустил ее полностью. Я попробовал uniqueCombo раньше, но это не работает для моей проблемы. – Thommy

2

Я хочу, чтобы ORMlite обновлял строку только в том случае, если идентификатор и номер совпадают, иначе он должен создать новую строку (я использую метод createOrUpdate).

Да, вы не сможете использовать createOrUpdate(...), однако вы должны быть в состоянии добавить свой собственный метод DAO, чтобы имитировать его довольно хорошо. Если ID не будет уникальным, тогда вам нужно будет создать другое поле ID как идентификатор и использовать ID как просто другое поле, возможно с ограничением uniqueCombo.

@DatabaseField(generatedId = true) 
private int uniqueId; 
// not the id field because it is not unique 
@DatabaseField 
private int id; 
@DatabaseField 
private int number; 

В классе DAO, переопределить BaseDaoImpl класс и переопределить метод createOrUpdate(...). Он должен сделать что-то вроде:

public CreateOrUpdateStatus createOrUpdate(Foo data) throws SQLException { 
    QueryBuilder<Foo, Integer> qb = queryBuilder(); 
    // NOTE: id here is not the identity field 
    qb.where().eq("id", data.id).and().eq("number", data.number); 
    Foo existing = qb.queryForFirst(); 
    if (existing == null) { 
     int numRows = create(data); 
     return new CreateOrUpdateStatus(true, false, numRows); 
    } else { 
     int numRows = update(data); 
     return new CreateOrUpdateStatus(false, true, numRows); 
    } 
} 

В качестве оптимизации, вы можете создать этот запрос заранее, используя ThreadLocalSelectArg аргументы для идентификаторов и числовых аргументов, а затем просто установить арг и выполнить запрос в методе createOrUpdate(...).

+0

Это должно быть принятым ответом –

+0

В случае 'else' вам не нужно назначать поле' uniqueId' существующей записи 'Foo' объекту' data' перед вызовом 'update (data)'? Потому что в противном случае Дао не узнает, какую строку обновить. Кроме того, перед вызовом 'create (data)' вам нужно убедиться, что поле 'uniqueId' элемента' data' еще не существует в таблице базы данных. – saschoar

+0

Я так не считаю @saschoar. В другом случае вы знаете, что 'existing' имеет те же' id' и 'number' как' data' из-за запроса. Это означает, что 'uniqueId' - то же самое. Если это не так, то некоторая некоторая несогласованность данных произошла. – Gray

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