Tôi đang sử dụng FMDB để xử lý cơ sở dữ liệu của tôi hoạt động tốt. Ứng dụng sử dụng chuỗi nền đang thực hiện một số công việc và cần truy cập cơ sở dữ liệu. Đồng thời, chủ đề chính cần chạy một số truy vấn trên cùng một cơ sở dữ liệu. Bản thân FMDB có một hệ thống khóa nhỏ, tuy nhiên, tôi đã thêm một hệ thống khác vào các lớp của tôi.EXC_BAD_ACCESS khi sử dụng SQLite (FMDB) và các chủ đề trên iOS 4.0
Mọi truy vấn chỉ được thực hiện nếu lớp của tôi chỉ ra rằng cơ sở dữ liệu không được sử dụng. Sau khi thực hiện các hành động, cơ sở dữ liệu sẽ được mở khóa. Điều này hoạt động như mong đợi miễn là tải không quá cao. Khi tôi truy cập nhiều dữ liệu với chuỗi chạy trên luồng chính, lỗi EXC_BAD_ACCESS xảy ra.
Dưới đây là tìm kiếm:
- (BOOL)isDatabaseLocked {
return isDatabaseLocked;
}
- (Pile *)lockDatabase {
isDatabaseLocked = YES;
return self;
}
- (FMDatabase *)lockedDatabase {
@synchronized(self) {
while ([self isDatabaseLocked]) {
usleep(20);
//NSLog(@"Waiting until database gets unlocked...");
}
isDatabaseLocked = YES;
return self.database;
}
}
- (Pile *)unlockDatabase {
isDatabaseLocked = NO;
return self;
}
Các debugger nói rằng lỗi xảy ra tại [FMResultSet next]
tại dòng
rc = sqlite3_step(statement.statement);
Tôi đôi kiểm tra tất cả giữ lại đếm và tất cả các đối tượng vẫn tồn tại vào thời điểm này. Một lần nữa, nó chỉ xảy ra khi chủ đề chính bắt đầu nhiều truy vấn trong khi luồng nền đang chạy (chính nó luôn tạo ra tải nặng). Lỗi luôn luôn được tạo ra bởi luồng chính, không bao giờ bởi chuỗi nền.
Ý tưởng cuối cùng của tôi là cả hai luồng đều chạy khóaDatabase cùng một lúc để chúng có thể nhận được đối tượng cơ sở dữ liệu. Đó là lý do tại sao tôi đã thêm khóa mutex qua "@synchronized (self)". Tuy nhiên, điều này không giúp được gì.
Có ai có đầu mối không?
chủ đề này cho một vấn đề FMDB đưa ra một số cái nhìn sâu sắc khác hữu ích vào nguyên nhân có thể: https://github.com/ccgus/fmdb/issues/39 –