2011-09-26 42 views
10

Tôi có một ứng dụng kết nối Internet và lưu trữ dữ liệu trong cơ sở dữ liệu SQL. Tôi đã thử nghiệm với iOS4, nó hoạt động hoàn toàn như nó cần. Khi tôi nâng cấp lên phiên bản mới mặc dù, tôi nhận được một NSInternalInconsistencyException, với điều này là lý do:'Không có kênh cơ sở dữ liệu nào có sẵn'

'_obtainOpenChannel - NSSQLCore 0x951a640: không có kênh cơ sở dữ liệu có sẵn'

Từ những gì tôi có thể thu thập , cơ sở dữ liệu của tôi đang được truy cập bởi một cái gì đó khi nó không nên được, mặc dù tôi không thể hiểu được ở đâu hoặc tại sao.

Có ai có thể giúp tôi xác định và chẩn đoán chính xác sự cố của mình không?

+0

Cuối cùng bạn đã tìm thấy sự cố chưa? Tôi đang có nó bây giờ quá (cập nhật để iOs5 ngày hôm qua ...), và không có thông tin để được tìm thấy ở tất cả về điều này. – TheEye

Trả lời

5

tôi tìm thấy một cái gì đó cho một này:

Tôi đã nhận lỗi (trong một số những người khác, dường như xuất hiện một cách ngẫu nhiên) trong khi tôi đã truy cập vào các mối quan hệ một đối tượng được quản lý trong một thread khác với bối cảnh quản lý được thành lập năm Đã có một số thay đổi đối với các đối tượng được quản lý trong iOS5 đối với các đối tượng được quản lý trong iOS5 (xem tại đây http://developer.apple.com/library/ios/#releasenotes/DataManagement/RN-CoreData/_index.html#//apple_ref/doc/uid/TP40010637) - và mặc dù tài liệu cho biết hành vi mặc định phải như trước iOS5 dường như không đúng, mã của tôi đã hoạt động mà không có sự cố trong iOS4.2.

Hiện tại, giải pháp của tôi là thực hiện tất cả các điều khoản truy cập mối quan hệ trong chuỗi chính, lưu trữ dữ liệu trong một mảng và truy cập dữ liệu tôi cần trong chuỗi khác thông qua mảng đó. Không ít lỗi hơn. Đây không phải là giải pháp 'tốt đẹp' tôi cho rằng, vì tôi nên (và sẽ) thay đổi cách tôi đồng thời truy cập các đối tượng được quản lý, nhưng tôi sẽ không thay đổi điều đó ngay bây giờ.

1

Loại đồng thời mặc định này cho NSManagedObjectContextNSConfinementConcurrencyType, có nghĩa là nó chỉ có thể được sử dụng bởi một chuỗi duy nhất. Từ tài liệu:

Bạn hứa rằng ngữ cảnh đó sẽ không được sử dụng bởi bất kỳ chủ đề nào khác ngoài mà bạn đã tạo ra nó.

Bạn thay vì có thể tạo ra một bối cảnh đối tượng quản lý mà được hỗ trợ bởi một hàng đợi riêng cho việc sử dụng đa luồng:

[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType] 

Để sử dụng bối cảnh đối tượng được quản lý từ một chủ đề khác nhau, sử dụng performBlock: (asyncronous) hoặc performBlockAndWait: (đồng bộ), vd

__block NSArray *results; 
[[self managedObjectContext] performBlockAndWait:^{ 
    results = [[self managedObjectContext] executeFetchRequest:request error:&error]; 
}]; 
// do something with results 

Tài liệu cho biết bạn không cần sử dụng API khối từ chuỗi tạo ngữ cảnh đối tượng được quản lý.

Tùy chọn khác là tạo ngữ cảnh đối tượng được quản lý riêng biệt cho từng chuỗi.

Xem iOS 5 release notes để biết thêm thông tin.

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