2011-12-26 23 views
38

Ứng dụng của tôi sử dụng Dữ liệu cốt lõi (với một số trợ giúp của Bản ghi Magical) và khá nhiều luồng đa luồng sử dụng NSOperation.Dữ liệu cốt lõi - hiện tạiObjectWithID: lỗi: gây ra lỗi 133000

Tất nhiên tôi rất cẩn thận khi chỉ vượt qua khoảng NSManagedObjectID giữa các chủ đề/hoạt động.

Bây giờ, để lại cho các đối tượng được quản lý tương ứng trong phẫu thuật, tôi sử dụng -existingObjectWithID:error: như sau:

Collection *owner = (Collection *)[localContext existingObjectWithID:self.containerId error:&error]; 

Nhưng những gì tôi nhận được lại là con số không và error nói đây là một lỗi # 13300: NSManagedObjectReferentialIntegrityError.

Dưới đây là những gì các tài liệu nói về lỗi này:

NSManagedObjectReferentialIntegrityError 
Error code to denote an attempt to fire a fault pointing to an object that does not exist. 
The store is accessible, but the object corresponding to the fault cannot be found. 

nào không đúng trong trường hợp của tôi: đối tượng mà tồn tại. Thật vậy, nếu tôi lặp qua tất cả các trường hợp của thực thể Collection đó với một số NSFetchRequest, tôi tìm thấy nó trong số đó và NSManagedObjectID của nó chính xác là số tôi đã chuyển đến -existingObjectWithID:error:.

Hơn nữa, nếu tôi sử dụng -objectWithID: thay vào đó, tôi nhận được một đối tượng chính xác trở lại tốt.

Vì vậy, có điều tôi đang thiếu. Dưới đây là một vài quan sát/câu hỏi bổ sung:

  • "đối tượng không tồn tại": ý nghĩa của "tồn tại" trong câu đó là gì? "tồn tại" ở đâu? Nó chắc chắn "tồn tại" trong kho dữ liệu cốt lõi của tôi tại thời điểm đó.
  • "đối tượng tương ứng với lỗi không thể tìm thấy": ý nghĩa của từ "tìm thấy" trong câu đó là gì? "tìm thấy" ở đâu? Nó chắc chắn "được tìm thấy" trong kho dữ liệu cốt lõi của tôi tại thời điểm đó.

Vì vậy, có thể tôi thiếu điều gì đó liên quan đến những gì existingObjectWithID:error: làm gì? Tài liệu hướng dẫn cho biết:

If there is a managed object with the given ID already registered in the context, that object is returned directly; otherwise the corresponding object is faulted into the context. 
[...] 
Unlike objectWithID:, this method never returns a fault. 

Điều này không giúp được vấn đề của tôi. Tôi không quan tâm đến việc đối tượng của mình hoàn toàn bị lỗi, và không phải là lỗi. Trong thực tế, bất kỳ lỗi nào bên trong nó sẽ kích hoạt trên dòng mã tiếp theo khi tôi truy cập các thuộc tính của đối tượng.

  • Kịch bản thực tế dẫn đến NSManagedObjectReferentialIntegrityError là gì?

Cảm ơn mọi giác ngộ.

+2

Bạn đã bao giờ tìm ra điều này chưa? Tôi nhận được cùng một vấn đề và đối tượng của tôi chắc chắn là có và hoạt động tiết kiệm đang chạy, nhưng nó chỉ xảy ra rải rác. – Adam

Trả lời

36

Vấn đề là NSManagedObjectID bạn vượt qua là tạm thời. Bạn có thể kiểm tra bằng cách gọi phương thức isTemporaryID của NSManagedObjectID. Từ tài liệu:

Returns a Boolean value that indicates whether the receiver is temporary.

Most object IDs return NO. New objects inserted into a managed object context are assigned a temporary ID which is replaced with a permanent one once the object gets saved to a persistent store.

Trước tiên, bạn nên lưu các thay đổi của bạn đến cửa hàng khăng khăng, chỉ sau đó nhận được một ID vĩnh viễn để vượt qua bối cảnh khác.

8

Khi bạn đang sử dụng nhiều ngữ cảnh, bạn cần đảm bảo lưu ngữ cảnh A trước khi chuyển ID đối tượng được quản lý từ ngữ cảnh A sang ngữ cảnh khác B. Chỉ sau khi lưu xong, đối tượng đó có thể truy cập được từ ngữ cảnh B.

-objectWithID: sẽ luôn trả về đối tượng không phải là nil, nhưng nó sẽ ném một ngoại lệ khi bạn bắt đầu sử dụng nếu không có đối tượng sao lưu trong cửa hàng. -existingObjectWithID:error: thực sự sẽ chạy một số SQL và làm I/O nếu đối tượng đó chưa được đăng ký với ngữ cảnh được sử dụng.

+2

Đó không phải là: khi tôi sử dụng '-objectWithID:', tôi nhận được đối tượng chính xác (như tôi đã viết): Tôi có thể sử dụng nó, truy cập các thuộc tính, quan hệ của nó, mọi thứ. Và quả thực, bối cảnh mà nó được tạo ra trước đó đã được lưu lại. Tuy nhiên, '-existingObjectWithID: error:' vẫn không thành công với lỗi 133000. –

+0

Âm thanh thực sự lạ. Cả hai bối cảnh có cùng NSPersistentStoreCoordinator không? –

+1

Tôi "giải quyết" điều này bằng cách đặt lại trên managedObjectContext. Chắc chắn không lý tưởng, vì vậy tôi mong muốn được nghe các giải pháp khác :-) – niklassaers

2

NSManagedObjectReferentialIntegrityError = 133000

NSManagedObjectReferentialIntegrityError Error code to denote an attempt to fire a fault pointing to an object that does not exist. The store is accessible, but the object corresponding to the fault cannot be found. Available in Mac OS X v10.4 and later. Declared in CoreDataErrors.h.

Xem này documentation.

This tutorial có thể hữu ích cho bạn.

Vì vậy, lý do có thể xảy ra là bạn đang cố tìm nạp đối tượng không tồn tại. Điều này xảy ra thường khi bạn cố gắng tạo một objectid cho một đối tượng không tồn tại. Các objectid sẽ được trả lại cho bạn và khi cố gắng để có được đối tượng với đối tượng nàyId bạn đang ném ngoại lệ này.

0

Tôi đã tìm thấy chúng khi xử lý thông báo NSManagedObjectContextDidSave. Nhiều người trong số các đối tượng mà một bối cảnh khác đã bị xóa không thể được lấy vì (Duh!) Họ đã bị xóa! Tuy nhiên một số đối tượng đã xóa chỉ xuất hiện tốt, giống như những đối tượng tôi đã bị lỗi trong ngữ cảnh hiện tại. Bạn có thể có một vấn đề tương tự - các đối tượng bạn có thể tìm thấy khi bạn lặp lại các cửa hàng có thể đã bị lỗi trong bối cảnh đó trước khi chúng bị xóa và bạn không hợp nhất các thay đổi trở lại ngữ cảnh đó, hoặc chỉ là không vẫn chưa hợp nhất.

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