2010-08-31 30 views
11

Sqlite trên Android cho phép bạn truy cập cơ sở dữ liệu từ nhiều procs để đọc, nhưng nếu bạn đang viết từ một quá trình, đọc và viết từ procs khác sẽ ném một ngoại lệ vì ghi đầu tiên có khóa trên db.Android sqlite concurrency không có ngoại lệ

Bằng "procs", tôi có nghĩa là các chủ đề khác trong cùng một ứng dụng.

Có cách nào tiêu chuẩn để có các luồng khác chỉ đơn giản là chờ cho đến khi cơ sở dữ liệu có sẵn một lần nữa, có thể với một thời gian chờ được chỉ định, thay vì ném một ngoại lệ?

Dự đoán "tại sao bạn làm như vậy?" câu trả lời, nó chỉ là cách chúng ta đang làm nó, và đó là nó. Chúng tôi cũng sẽ không sử dụng nhà cung cấp nội dung. Chỉ muốn có một cách để đồng bộ hóa truy cập db.

Giả sử không có cách tiêu chuẩn để làm điều đó, có lẽ chúng ta sẽ viết một trình bao bọc xung quanh lệnh gọi db để thực hiện đồng bộ hóa một số luồng.

Trả lời

17

Miễn là bạn đang sử dụng cùng một đối tượng SQLiteDatabase, việc đồng bộ hóa được thực hiện cho bạn.

Vì vậy, nếu bạn truy cập vào đối tượng qua một đĩa đơn, sẽ không có vấn đề gì. Mặc dù bạn có thể muốn thêm một số logic nữa nếu bạn muốn triển khai thời gian chờ, ví dụ: chờ đợi/thông báo hoặc một cái gì đó tương tự.

+0

Vì vậy, bạn đang nói sử dụng 1 SQLiteOpenHelper, và sau đó 1 kết nối có thể ghi cho toàn bộ ứng dụng của bạn? Tất cả các hoạt động và dịch vụ? –

+4

Tôi không có đủ "ảnh hưởng" để đưa ra câu trả lời này, nhưng nó đã dẫn tôi xuống đường dẫn đến câu trả lời đúng. SQLiteOpenHelper thực sự trả về cùng một đối tượng được lưu trữ, bất kể nếu bạn gọi "getReadable ..." hoặc "getWritable ...", thì đối tượng cơ sở dữ liệu có đối tượng Khóa java để đảm bảo mọi cuộc gọi, đọc hoặc ghi, được đăng. Tôi sẽ phải giữ một singleton SQLiteOpenHelper, nó sẽ cho phép tôi định kỳ "đóng" các đối tượng db, có vẻ như "an toàn hơn". Sqlite chính nó có thể xử lý nhiều khách hàng đọc, mà có vẻ hợp lý để thực hiện tốt hơn, nhưng bất cứ điều gì. Cảm ơn bạn lần nữa. –

+0

@ kāgii là người hỏi câu hỏi, bạn có thể chấp nhận câu trả lời này hoặc viết câu trả lời của riêng bạn và chấp nhận rằng – ohhorob

2

Hoặc bạn có thể sử dụng cơ sở dữ liệu khác hỗ trợ cơ sở dữ liệu đó, chẳng hạn như H2. Tôi biết nó nghe có vẻ như một ý tưởng kỳ lạ. Nhưng theo thử nghiệm ban đầu của tôi nó hoạt động tốt (trên giả lập cũng như trên thiết bị), và thực sự không chậm hơn. Ngoại trừ việc mở và đóng một cơ sở dữ liệu, hiện đang khá chậm, khoảng 1 giây, nhưng có lý do khác và hy vọng sẽ được sửa trong phiên bản tiếp theo.

Các vấn đề liên quan