Android sử dụng cơ chế khóa java để giữ cho truy cập cơ sở dữ liệu SQLite được tuần tự hóa. Vì vậy, nếu nhiều luồng có một cá thể db, nó luôn luôn gọi đến cơ sở dữ liệu theo cách tuần tự và tất nhiên cơ sở dữ liệu là an toàn luồng.
Nếu chúng tôi xác nhận rằng chúng tôi đang sử dụng cơ sở dữ liệu từ chuỗi đơn, chúng tôi có tùy chọn đặt khóa nội bộ cơ sở dữ liệu bằng cách gọi setLockingEnable(false)
nhưng phương pháp này có deprecated từ cấp API 16 và không còn sử dụng nữa. nếu bạn thấy việc thực hiện phương thức này trong lớp SQLiteDatabase
, bạn sẽ không tìm thấy gì được viết ở đó, tức là phương thức trống.
public void setLockingEnabled (boolean lockingEnabled)
Phương pháp này hiện nay không có gì. Không được dùng.
Một điều chúng ta nên quan tâm là chúng ta nên tạo một thể hiện của lớp trợ giúp của bạn (ví dụ bằng cách làm cho nó đơn) và chia sẻ cùng một thể hiện với nhiều chủ đề và không gọi close()
trên cơ sở dữ liệu. bạn có thể nhận được sau ngoại lệ:
java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase
Vì vậy, đừng gọi database.close()
ở giữa truy cập vào cơ sở dữ liệu, cơ sở dữ liệu tự sẽ thực hiện thao tác chặt chẽ trong nội bộ khi tất cả các hoạt động sẽ được kết thúc.
Nguồn
2015-04-19 16:57:02
bản sao có thể có của [Thực tiễn tốt nhất cho SQLite trên Android là gì?] (Http://stackoverflow.com/questions/2493331/what-are-the-best-practices-for-sqlite-on-android) –
bạn nên sử dụng khóa như được mô tả trong https://stackoverflow.com/questions/12758655/sqlitedatabase-multi-thread-locking-pattern –