2011-07-13 39 views
28

Tôi có một cơ sở dữ liệu với một số bảng. Tôi muốn cập nhật các bảng bằng nhiều chủ đề. Tôi sẽ sử dụng cùng một thể hiện của SQLiteDatabase trong tất cả các chủ đề.Là chủ đề cơ sở dữ liệu Sqlite an toàn

Vui lòng đề xuất phương pháp này là chính xác. Chuỗi cơ sở dữ liệu Sqlite có an toàn không? Có thể hai luồng khác nhau cập nhật cùng một bảng cho các tập hợp giá trị khác nhau cùng một lúc.

+0

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) –

+0

bạn nên sử dụng khóa như được mô tả trong https://stackoverflow.com/questions/12758655/sqlitedatabase-multi-thread-locking-pattern –

Trả lời

23

[WRONG:] Không, không an toàn theo luồng. Bạn sử dụng các phương thức SQLiteHelper liên quan đến khóa để cung cấp sự an toàn của luồng.

[EDIT]: lớp SQLiteDatabase cung cấp một cơ chế khóa theo mặc định (xem ý kiến) và nếu bạn đang chạy trên multithread, bạn không cần phải xem xét thay đổi bất cứ điều gì để có thread-an toàn.

tìm kiếm cho 'chủ đề' trong tài liệu này: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

Và đọc thêm về:

+11

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html # setLockingEnabled% 28boolean% 29 'Kiểm soát xem SQLiteDatabase có được tạo luồng an toàn hay không bằng cách sử dụng các khóa xung quanh các phần quan trọng. Điều này là khá tốn kém, vì vậy nếu bạn biết rằng DB của bạn sẽ chỉ được sử dụng bởi một chủ đề duy nhất thì bạn nên đặt điều này thành false. Mặc định là true' ... Không phải điều này ngụ ý nó là thread an toàn theo mặc định? – Ryan

+1

Hmm. Nó nên được và bây giờ tôi nhầm. Hmm. –

+1

"Phương pháp này không được chấp nhận ở cấp độ API 16. Phương pháp này hiện không có tác dụng. Không sử dụng." –

-2

Nếu bạn thực hiện nó ..

setLockingEnabled (boolean lockingEnabled) kiểm soát hay không SQLiteDatabase được làm bằng thread-an toàn bằng cách sử dụng ổ khóa xung quanh bộ phận quan trọng.

2

Bạn có thể kiểm soát nếu cơ sở dữ liệu của bạn là chuỗi an toàn hay không bằng setLockingEnabled.

Kiểm soát xem SQLiteDatabase có được an toàn chỉ bằng cách sử dụng khóa quanh các phần quan trọng hay không. Điều này là khá tốn kém, vì vậy nếu bạn biết rằng DB của bạn sẽ chỉ được sử dụng bởi một chủ đề duy nhất thì bạn nên đặt điều này thành false. Mặc định là đúng

Vì vậy, tôi nghĩ điều này sẽ trả lời câu hỏi của bạn.

Phương thức setLockingEnabled được khấu hao ở cấp API 16

+4

Không được chấp nhận trong api 16 –

3

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.

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