Вставьте несколько значений SQLite Android с одним и тем же запросом - PullRequest
3 голосов
/ 09 августа 2011

Часто в моем приложении мне нужно вставить много значений в таблицу БД.

Так что мне нужно запустить вставку вроде:

insert into clients 
(id, name, lastip, visites) values  
('20','John','1.1.1.1','0'),
('21','Kate','1.1.1.2','3'), 
('35','Phill','1.1.1.3','90') ;

У меня есть два вопроса по этому поводу (я начинаю с SQL)

  1. Как можно избежать сбоев с первичными ключами (заменяя другие столбцы при попытке вставить существующую строку)?
  2. Есть ли способ вставить все значения в один и тот же запрос, используя метод insert () в SQLiteDatabase или аналогичный метод? или я должен построить строку запроса и использовать execSQL()?

заранее спасибо

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Если вы используете ContentProvider для доступа к вашей базе данных, вы можете сделать это с помощью applyBatch():

// List of operations
ArrayList<ContentProviderOperation) ops
    = new ArrayList<ContentProviderOperation>();

// Create the builder
ContentProviderOperation.Builder builder
    = ContentProviderOperation.newInsert(...);

// Create the first item
builder.withValue("Name", "John");
builder.withValue("IP", '1.1.1.1');
ops.add(builder.build());

// Create the second item
builder.withValue("Name", "Kate");
builder.withValue("IP", '1.1.1.2');
ops.add(builder.build());

// Insert the data as one transaction
getContentProvider().applyBatch("AUTHORITY", ops);
1 голос
/ 09 августа 2011

1.) Возможность избежать сбоев первичного ключа - использовать поля автоинкремента.

Если столбец имеет тип INTEGER PRIMARY KEY AUTOINCREMENT , тогда a немного другой алгоритм выбора ROWID. РОУИД выбран для новой строки, по крайней мере, на один больше, чем самый большой ROWID, который имеет когда-либо существовал в той же таблице.

См. Документацию sqlite здесь .

Если в вашем примере id будет полем автоинкремента, вам не нужно указывать его во вставке.

2.) Да, это возможно (для одной строки), как указано в документации, на которую вы ссылаетесь:

public long insert (String table, String nullColumnHack, ContentValues values)

значения, эта карта содержит начальные значения столбца для строки. ключи должны быть именами столбцов, а значениями - значениями столбцов

Однако вы должны использовать подготовленные операторы (ссылка здесь: Как использовать подготовленные операторы в SQlite в Android? )

Если вы хотите вставить все 3 строки одним выстрелом, вам нужно создать строку или выполнить вставку 3 раза.

Изменить на ваш комментарий:

3.) Здесь довольно хорошо ответили: ВСТАВИТЬ, ЕСЛИ ЕЩЕ НЕ ОБНОВИТЬ?

Смотрите также здесь: http://sqlite.org/lang_conflict.html

REPLACE

Когда происходит УНИКАЛЬНОЕ нарушение ограничения, алгоритм ЗАМЕНА удаляет уже существующие строки, которые вызывают нарушение ограничения до вставки или обновления текущей строки и команды продолжает работать нормально. Если нарушение ограничения NOT NULL происходит, разрешение конфликта REPLACE заменяет значение NULL на значение по умолчанию для этого столбца, или если столбец не имеет значения по умолчанию значение, то используется алгоритм ABORT. Если ограничение CHECK нарушение происходит, алгоритм разрешения конфликтов ЗАМЕНА всегда работает как ABORT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...