SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

Masukkan Beberapa Baris dalam Kesalahan SQLite (kode kesalahan =1)

Sisipkan Beberapa Baris dalam Kesalahan SQLite

Saya sangat tidak suka pendekatan Anda. Ini sangat keras dan terlihat seperti kode spageti. Dan pendekatan Anda tidak akan pernah berhasil karena satu sisipan hanya dapat memiliki satu nilai . Jadi Anda melakukannya dengan tidak benar. Bagaimana dengan menggunakan API insert() metode yang secara langsung dirancang untuk dimasukkan?

Juga dari sudut pandang tentang kinerja kecepatan dan keamanan saya sarankan Anda untuk menggunakan TRANSACTION demikian juga. Tapi mari kita menulis beberapa kode khusus untuk Anda.

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();
        }
    }
}

Catatan:

Seperti yang saya perhatikan Anda memiliki tabel bernama Konstak jadi saya sarankan Anda untuk membuat Kontak Objek sendiri yang akan mewakili tabel Anda pada lapisan aplikasi di mana properti objek sama dengan kolom dalam tabel. Saya menyarankan Anda untuk menggunakan pendekatan ini karena:

  • Ini bukan kode spagetthi
  • Cukup lebih cepat
  • Jauh lebih aman

Beberapa saran di bagian akhir:

execSQL() tidak buruk tetapi saya menggunakannya secara umum hanya ketika saya membuat SQLiteOpenHelper subclass untuk membuat dan menghapus serta mengubah tabel. Ada penggunaan yang cukup cocok. Tapi sebagai rekomendasi utama untuk Anda adalah:

  • Setiap kali Anda memasukkan, memperbarui, menghapus penggunaan transaksi selalu merupakan praktik yang sangat baik, karena selain peningkatan kinerja kecepatan (terutama jika Anda memasukkan banyak baris) adalah pekerjaan Anda dengan database jauh lebih aman.

Hanya untuk info: Saya melakukan beberapa tes ketika saya memasukkan 1000, 10 000, 100 000 baris ke SQLite dan saya dapat memberitahu Anda bahwa memasukkan 100 000 baris hanya membutuhkan 55,346 detik. Memasukkan 1.000 baris tanpa transaksi membutuhkan waktu 73.398 detik.

  • Setiap kali Anda memilih, menyisipkan, memperbarui dari satu atau beberapa tabel, gunakan placeholder yaitu pernyataan berparametri dan tidak di-hardcode. Dengan itu, pertanyaan Anda akan menjadi lebih aman, lebih cepat, dan lebih baik untuk dibaca manusia. Dalam hal bergabung selalu gunakan klausa join. Yang terbaik yang bisa Anda pilih.

Pembaruan:

Ini kode Anda yang berfungsi:

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'

Pembaruan 2:

Seperti yang ditunjukkan @Korniltsev Anatoly di SQLite ada batasan SQLITE_MAX_COMPOUND_SELECT itu berarti Anda tidak dapat menggunakan lebih dari 500 serikat pekerja sekaligus.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara mendapatkan baris di SQLite dengan indeks (bukan dengan id)

  2. Cara Mengubah Prompt Baris Perintah di SQLite

  3. Android:Sisipan Massal, saat InsertHelper tidak digunakan lagi

  4. Kesalahan SQLiteConstraintException muncul setelah memulai setiap aktivitas

  5. Apakah id sumber daya berubah setiap kali aplikasi dimulai