Indsæt flere rækker i SQLite-fejl
Jeg kan virkelig ikke lide din tilgang. Det er så hårdt, og det ligner spaghettikode. Og din tilgang vil aldrig fungere, fordi én indsættelse kan kun have én værdi . Så du gør det forkert. Hvad med at bruge API insert()
metode, som den direkte er designet til at indsætte?
Også ud fra et synspunkt om hastighedsydelse og sikkerhed anbefaler jeg dig at bruge TRANSACTION
såvel. Men lad os skrive noget kode specielt til dig.
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();
}
}
}
Bemærkninger:
Som jeg har bemærket, har du en tabel kaldet Kontakter så jeg foreslår, at du opretter egen objektkontakt som vil repræsentere din tabel på applikationslaget, hvor egenskaberne for objektet er lig med kolonner i tabellen. Jeg anbefaler dig at bruge denne tilgang, fordi:
- Det er ikke spagetthi-kode
- Det er ret hurtigere
- Det er meget mere sikkert
Et par forslag til sidst:
execSQL()
er ikke dårligt, men jeg bruger det generelt kun, når jeg opretter SQLiteOpenHelper
underklasse til oprettelse og sletning og ændring af tabeller. Der er en brug ret passende. Men som vigtigste anbefalinger til dig er:
- Hver gang du indsætter, opdaterer, sletter en brug af transaktionen er altid en god praksis, for bortset fra at øge hastighedsydelsen (især hvis du indsætter et stort antal rækker), er dit arbejde med database meget mere sikkert.
Kun til info: Jeg lavede et par test, da jeg indsatte 1000, 10.000, 100.000 rækker i SQLite, og jeg kan fortælle dig, at indsættelse af 100.000 rækker kun tog 55.346 sekunder. Indsættelse af 1.000 rækker uden transaktion tog endda 73.398 sekunder.
- Hver gang du vælger, indsætter, opdaterer fra en eller flere tabeller, skal du bruge pladsholdere dvs. parametriserede udsagn og ikke hårdkodede. Med det bliver dine forespørgsler sikrere, hurtigere og bedre læselige for mennesker. Brug altid join-klausul i tilfælde af tilslutning. Det er bedst, du kan vælge.
Opdatering:
Her virker din kode:
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'
Opdatering 2:
Som @Korniltsev Anatoly påpegede i SQLite er der en begrænsning SQLITE_MAX_COMPOUND_SELECT
det betyder, at du ikke kan bruge mere end 500 fagforeninger på én gang.