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.