SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

Chèn nhiều hàng trong lỗi SQLite (mã lỗi =1)

Chèn nhiều hàng trong lỗi SQLite

Tôi thực sự không thích cách tiếp cận của bạn. Nó rất cứng và trông giống như mã spaghetti. Và cách tiếp cận của bạn sẽ không bao giờ hiệu quả vì một lần chèn chỉ có thể có một giá trị . Vì vậy, bạn đang làm điều đó không chính xác. phương pháp mà nó trực tiếp thiết kế để chèn?

Ngoài ra, từ quan điểm về hiệu suất tốc độ và bảo mật, tôi khuyên bạn nên sử dụng TRANSACTION cũng. Nhưng chúng ta hãy viết một số mã đặc biệt dành cho bạn.

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

Ghi chú:

Như tôi nhận thấy, bạn có bảng được gọi là Constacts vì vậy tôi khuyên bạn nên tạo Liên hệ đối tượng của riêng mình điều đó sẽ đại diện cho bảng của bạn trên lớp ứng dụng nơi các thuộc tính của đối tượng bằng với các cột trong bảng. Tôi khuyên bạn nên sử dụng phương pháp này vì:

  • Đó không phải là mã spagetthi
  • Nó khá nhanh hơn
  • An toàn hơn nhiều

Một vài gợi ý ở cuối:

executeSQL () không tệ nhưng tôi chỉ sử dụng nó khi tôi tạo SQLiteOpenHelper lớp con để tạo và xóa và thay đổi bảng. Có một cách sử dụng là khá phù hợp. Nhưng các khuyến nghị chính cho bạn là:

  • Mỗi khi bạn chèn, cập nhật, xóa việc sử dụng giao dịch luôn là một phương pháp rất tốt, bởi vì ngoại trừ việc tăng hiệu suất tốc độ (đặc biệt nếu bạn chèn nhiều hàng) thì công việc của bạn với cơ sở dữ liệu sẽ an toàn hơn nhiều.

Chỉ để biết thông tin: Tôi đã thực hiện một vài thử nghiệm khi chèn 1000, 10 000, 100 000 hàng vào SQLite và tôi có thể cho bạn biết rằng việc chèn 100 000 hàng chỉ mất 55,346 giây. Chèn 1000 hàng không có giao dịch thậm chí mất 73.398 giây.

  • Mỗi khi bạn chọn, chèn, cập nhật từ một hoặc nhiều bảng, hãy sử dụng trình giữ chỗ tức là các câu lệnh được đo lường và không được mã hóa cứng. Với nó, các truy vấn của bạn sẽ trở nên an toàn hơn, nhanh hơn và con người có thể đọc được tốt hơn. Trong trường hợp tham gia luôn sử dụng mệnh đề tham gia. Tốt nhất là bạn có thể chọn.

Cập nhật:

Đây là mã của bạn đang hoạt động:

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'

Cập nhật 2:

Như @Korniltsev Anatoly đã chỉ ra trong SQLite có một ràng buộc SQLITE_MAX_COMPOUND_SELECT điều đó có nghĩa là bạn không thể sử dụng hơn 500 liên hiệp cùng một lúc.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách last_insert_rowid () hoạt động trong SQLite

  2. Ràng buộc bảng SQLite duy nhất và BẬT sử dụng REPLACE BẤT NGỜ

  3. java.lang.IllegalArgumentException:cột '_id' không tồn tại

  4. Khi nào phương thức SQLiteOpenHelper onCreate được gọi?

  5. SQLite - Xóa dữ liệu