2013-04-12 2 views
2

Я хочу вставить запись, если она не существует, тогда я хочу обновить эту запись, если ее значение COLUMN_GENERATION меньше, чем значение существующей записи. Я не уверен, как структурировать запрос, или какую команду использовать, даже.Вставка или обновление в SQLite, но только обновление, если одно из значений соответствует условию

установки я моя база данных, как это:

public static final String TABLE_SEARCH = "SearchTable"; 
public static final String COLUMN_OWNER = "Owner"; 
public static final String COLUMN_SPOUSE = "Spouse"; 
public static final String COLUMN_CHILD = "Child"; 
public static final String COLUMN_GENERATION = "Generations"; 

private static final String DATABASE_NAME = "searches.db"; 
private static final int DATABASE_VERSION = 1; 

// Database creation sql statement 
private static final String DATABASE_CREATE = "CREATE TABLE " 
     + TABLE_SEARCH + "(" 
     + COLUMN_OWNER + " INTEGER PRIMARY KEY, " 
     + COLUMN_SPOUSE + " INTEGER DEFAULT 0, " 
     + COLUMN_CHILD + " INTEGER DEFAULT 0, " 
     + COLUMN_GENERATION 
     + " INTEGER DEFAULT 0);"; 

И это вопрос я "использую в настоящее время, который просто игнорирует противоречивые данные:

values.put(SearchDatabaseHelper.COLUMN_OWNER, personID); 
values.put(SearchDatabaseHelper.COLUMN_SPOUSE, spouseID); 
values.put(SearchDatabaseHelper.COLUMN_CHILD, childID); 
values.put(SearchDatabaseHelper.COLUMN_GENERATION, gens); 
long insertID = database.insertWithOnConflict(SearchDatabaseHelper.TABLE_SEARCH, null, values, SQLiteDatabase.CONFLICT_IGNORE); 

Я попытался положить запрос только поиск в первую очередь, и вставлять или обновлять по мере необходимости, но это было очень медленным и на самом деле не работало. Я бы очень признателен за помощь в этом.

Wow-- закрыто как дублирующийся вопрос. Нет реальных ответов. Я обеспокоен тем, что я не правильно назвал название своим вопросом, и поэтому люди просто просмотрели его и не читали то, что я просил.

Никто не заметил ключевую фразу в первом абзаце:

«Я хочу, чтобы обновить эту запись, если его значение COLUMN_GENERATION меньше, чем у существующей записи.»

Я могу вставлять/обновлять базы данных. Основной вопрос заключается в следующем: «Можно ли создать один запрос, который смотрит, существует ли строка в базе данных с моим первичным ключом, а если нет, вставляет и, если это произойдет, то обновляется, только если сохраненный значение одного из столбцов выше, чем введенные данные? "

Я действительно хочу, чтобы иметь возможность сделать это все в рамках одного вызова SQLite, поскольку SQLite намного быстрее, чем сравнение и принятие решений вне SQLite.

+0

также: http://www.sqlite.org/lang_insert.html все это там! – Budius

+1

Определенно не то же самое, что INSERT, если НЕ СУЩЕСТВУЕТ УЛУЧШИТЬ ОБНОВЛЕНИЕ, потому что я хочу только обновить, если новое значение одного столбца меньше существующего значения. – HalR

+0

@Budius Я смотрел документацию и работал над этим в течение нескольких дней. Поэтому диаграммы и диаграммы не работают для меня. – HalR

ответ

1

Прочтите генерацию существующей записи из БД. Если он существует и имеет более низкое поколение, удалите его. Если он не существовал или имел более низкое поколение, вставьте новый.

Различные команды INSERT OR XXX работают только для конкретных распространенных случаев; для вашего алгоритма вы должны это записать.

Просто напишите команды правильно и заверните транзакцию вокруг них, и она будет работать быстро.

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