2010-03-07 26 views
16

Tôi đang phát triển một ứng dụng Android. Nó có nhiều chủ đề đọc và ghi vào cơ sở dữ liệu SQLite của Android. Tôi nhận được lỗi sau:Cách tránh lỗi khóa SQLiteException

SQLiteException: error code 5: database is locked

Tôi hiểu SQLite khóa toàn bộ db trên chèn/cập nhật, nhưng các lỗi này chỉ dường như xảy ra khi chèn/cập nhật trong khi tôi đang chạy một truy vấn chọn. Truy vấn chọn trả về một con trỏ đang được mở khá một đống (một vài giây một vài lần) trong khi tôi lặp lại nó. Nếu truy vấn chọn không chạy, tôi sẽ không bao giờ lấy được khóa. Tôi ngạc nhiên rằng lựa chọn có thể khóa db. Điều này có thể, hoặc là cái gì khác đang xảy ra?

Cách tốt nhất để tránh các khóa như vậy là gì?

+0

Bạn nói để lại con trỏ mở trong một thời gian. Tôi tin rằng tôi có cùng một vấn đề, nhưng con trỏ của tôi đang được duy trì bởi một listView. Bạn đã bao giờ quản lý để sửa lỗi này? – taer

+1

Có, tôi đã sửa lỗi này bằng cách đọc nội dung của con trỏ ngay lập tức vào một bộ sưu tập, đóng con trỏ và sau đó itterate trên bộ sưu tập để làm việc tốn thời gian. Nếu bạn đang sử dụng một listView, bạn sẽ có thể làm như vậy và sử dụng một ArrayAdapter hoặc viết adapter của riêng bạn mở rộng ArrayAdapter. – TheArchedOne

+0

http://stackoverflow.com/questions/7657223/sqlite-exception-database-is-locked-issue/9503044#9503044 – junto

Trả lời

2

Bằng cách tránh để con trỏ mở trong "khá lâu". Nếu bạn có thể đủ khả năng để có tất cả dữ liệu của bạn trong bộ nhớ cùng một lúc, sau đó làm như vậy.

Nếu không thể, hãy thử tăng thời gian chờ bận.

1

Di chuyển đến trình ContentProvider thay vì truy cập trực tiếp vào DB. ContentResolver marshals đi tất cả các vấn đề luồng cho bạn và cũng cho phép các tính năng hữu ích khác như chia sẻ dữ liệu giữa các ứng dụng hoặc đồng bộ hóa với một máy chủ.

Chi phí api của ContentResolver là tối thiểu. Bạn chỉ cần xác định một chuỗi AUTHORITY (Một chuỗi duy nhất xác định "loại" dữ liệu của bạn - sử dụng loại chuỗi "com.example.myapp.contacts") và sử dụng ContentResolver.bla chứ không phải db.bla.

7

Có thể bạn đang mở và đóng nhiều kết nối cơ sở dữ liệu trong các chuỗi khác nhau của mình. Đây là một ý tưởng tồi. Chỉ cần mở một kết nối cơ sở dữ liệu duy nhất và sử dụng lại nó ở khắp mọi nơi; SQLite sau đó sẽ đảm bảo rằng các truy cập đồng thời được tuần tự một cách chính xác.

Như với câu trả lời của jcwenger, sử dụng Trình ContentProvider là một cách khác để đạt được điều này, nhưng sẽ yêu cầu nhiều thay đổi xâm nhập hơn đối với mã của bạn.

+0

Tôi không mở và đóng cơ sở dữ liệu nhiều lần, mặc dù tôi gặp phải lỗi này, hãy lấy xem [liên kết ở đây] (http://stackoverflow.com/questions/13859840/application-crashes-on-installation-with-error-sqlite3-exec-failed-to-set-sync) – MobileEvangelist

0

của nó gây ra bởi beginTransaction() function.Look tại mã của bạn, vấn đề được giải quyết cho ứng dụng của tôi để thực hiện một dòng chú thích chức năng này (beginTransaction) dòng

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