Tôi đang sử dụng wrapper FMDatabase SQLite trong Objective C và tôi có vấn đề sau:Cơ sở dữ liệu SQLite với FMDatabase Wrapper
Tôi đang chạy một phân tích cú pháp XML và DB chèn trong một thread nền cho một số nội dung mà người dùng không có thể truy cập, tuy nhiên người dùng có thể tương tác với một giao diện người dùng và cơ sở dữ liệu từ phần họ đang ở.
The FMDatabase <FMDatabase: 0x17b7b0> is currently in use.
ngẫu nhiên, tôi sẽ nhận được một "FMDatabase đã được sử dụng" thông báo và mảng sẽ không bao giờ có dân cư bởi cơ sở dữ liệu. Tôi đã theo ấn tượng rằng lớp FMDatabase sẽ xử lý các truy vấn một khi nó trở thành tự do, nhưng tôi có một:
while(contents.count < 1){
sleep(1);
}
Hy vọng rằng một khi cơ sở dữ liệu giải phóng, mảng sẽ được áp dụng. Tôi cũng đã cố gắng chạy lại tập lệnh dân số mảng nếu DB đang bận nhưng không có kết quả.
Xin lỗi nếu câu hỏi này gây nhầm lẫn, tôi rất vui được làm rõ.
tôi muốn làm giống như bạn, nhưng đối với truy vấn trong FMDatabaseQueue, kết quả phải trở lại async ..... nó không phải là rất thuận tiện. Bạn có gợi ý nào không? – flypig
Tôi donnot có vấn đề thực sự. Tôi đã chỉnh sửa câu trả lời của mình để thêm một đoạn mã, vui lòng đính kèm nếu nó không trợ giúp. – dvkch
mã khối được thực hiện bởi hàng đợi fmdb không đồng bộ, và r sẽ được cập nhật trong khối khi mã khối được thực hiện, nhưng bạn chỉ cần trả về r trong dòng cuối cùng của thủ tục .... tôi nghĩ bạn sẽ bị trống đôi khi kết quả truy vấn, tùy thuộc vào trạng thái hàng đợi fmdb. Điều này khiến tôi bối rối trong một vài ngày .. có thể là chúng ta nên chuyển một khối hoàn thành để trả lại kết quả truy vấn, ví dụ: "(BOOL) updateTaskState: (NSNumber *) taskID vớiNewStatus: (NSNumber *) trạng thái hoàn thành: (void (^) (BOOL r)) hoàn thành;" và gọi hoàn thành (r) trong [queue inDatabase:^(FMDatabase * db) {..}] chặn. – flypig