Вмъкване на няколко реда в SQLite Грешка
Наистина не ми харесва подходът ти. Толкова е твърдо и изглежда като спагети код. И вашият подход никога няма да работи, защото една вложка може да има само една стойност . Значи го правите неправилно. Какво ще кажете да използвате API insert()
метод, който директно е предназначен за вмъкване?
Също така от гледна точка на скоростта и сигурността ви препоръчвам да използвате TRANSACTION
също така. Но нека да напишем код специално за вас.
public void insertMultiple(List<Contact> contacts) {
Contact c = null;
ContentValues values = new ContentValues();
try {
if (db != null) {
db.beginTransaction();
for (Contact c: contacts) {
values.put(SQLConstants.FIRSTNAME, c.getFirstName());
values.put(SQLConstants.LASTNAME, c.getLastName());
...
db.insertOrThrow("Contacts", SQLConstants.FIRSTNAME, values);
values.clear();
}
db.setTransactionSuccessful();
}
}
finally {
if (db != null && db.inTransaction()) {
db.endTransaction();
}
}
}
Бележки:
Както забелязах, имате таблица, наречена Контакти затова ви предлагам да създадете собствен обектен контакт който ще представлява вашата таблица на слоя на приложението, където свойствата на обекта са равни на колоните в таблицата. Препоръчвам ви да използвате този подход, защото:
- Това не е спагетти код
- Доста е по-бързо
- Много по-безопасно е
Няколко предложения в края:
execSQL()
не е лошо, но обикновено го използвам само когато създам SQLiteOpenHelper
подклас за създаване и изтриване и промяна на таблици. Там употребата е доста подходяща. Но като основни препоръки към вас са:
- Всеки път, когато вмъквате, актуализирате, изтривате използване на транзакция винаги е много добра практика, защото освен увеличаването на производителността на скоростта (особено ако сте вмъкнали голям брой редове), работата ви с база данни е много по-безопасна.
Само за информация: Направих няколко теста, когато вмъкнах 1000, 10 000, 100 000 реда в SQLite и мога да ви кажа, че вмъкването на 100 000 реда отне само 55 346 секунди. Вмъкването на 1 000 реда без транзакция отне дори 73 398 секунди.
- Всеки път, когато избирате, вмъквате, актуализирате от една или повече таблици, използвайте заместители т.е. параметризирани изрази и не са твърдо кодирани. С него вашите заявки ще станат по-безопасни, по-бързи и по-добре четими от човека. В случай на присъединяване винаги използвайте клауза за присъединяване. Най-добре е да избирате.
Актуализация:
Тук работи вашият код:
insert into Contacts(ID, FirstName, LastName, PhoneNumber, EmailId, Status)
select 'someId' as ID, 'xxx' as FirstName, 'xxx' as LastName , '9008987887' as PhoneNumber , '[email protected]' as EmaiId, 'Yes' as Status
union all select 'someId', 'xxx', 'xxx', '9008987887', '[email protected]', 'Yes'
union all select 'someId', 'xxx', 'xxx', '9008987887', '[email protected]', 'Yes'
Актуализация 2:
Както @Korniltsev Анатолий посочи в SQLite, има ограничение SQLITE_MAX_COMPOUND_SELECT
това означава, че не можете да използвате повече от 500 съюза наведнъж.