2012-04-19 30 views
5

Tôi đang cố gắng lưu trữ/hủy lưu trữ NSManagedObjectID trong đối tượng Dữ liệu cốt lõi để lần sau khi ứng dụng của tôi khởi động, tôi có thể truy xuất các ID này và sử dụng chúng để tìm nạp các đối tượng cụ thể.cách chính xác để lưu trữ NSURL trong Dữ liệu chính là gì?

tôi đã cố gắng "lưu trữ" ID như thế này:

//defaultConfiguration is an NSManagedObject defined elsewhere and it works just fine...  
// and newObject is also properly initialized, bound to a context,etc... 

ArchivedID* newID = [NSEntityDescription insertNewObjectForEntityForName:@"ArchivedID" inManagedObjectContext:managedObjectContext]; 
[self.defaultConfiguration addArchiveIDObject:newID]; 
newID.idURI = [[newObject objectID] URIRepresentation]; 
[managedObjectContext save:&error]; 

Và sau đó hủy lưu trữ như thế này (tôi chỉ cần đi cho [anyObject] nguyên nhân tôi đang thử nghiệm và chỉ có một là vào thời điểm này):

NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[defaultConfiguration.archiveID anyObject]]; 

Nhưng khi tôi cố gắng lấy URL trở lại như trên, tôi nhận được ngoại lệ sau đây:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ArchivedID relativeString]: unrecognized selector sent to instance 0x7f59f20' 

Thuộc tính trong thực thể được thiết lập thông qua Xcode thành "biến đổi" và tôi để trống trường giá trị biến áp trong Xcode vì tài liệu Core Data dường như ngụ ý nếu trống nó sử dụng biến mặc định.

Tôi đang làm gì sai?

+0

điều này có liên quan gì với nsurl? – Chet

Trả lời

0

Ok ... Đã 14hrs thẳng của mã hóa .. Tôi một .. eh .. thằng ngốc:

Tôi quên để truy cập thuộc tính trong đối tượng ArchivedID. Đó là:

NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[defaultConfiguration.archiveID anyObject]]; 

nên

NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[[defaultConfiguration.archiveID anyObject] idURI]]; 
+0

Điều đó cũng hoạt động :) – kevboh

1

Có thể bạn có thể giải quyết vấn đề này mà không lưu trữ URL. Xem xét thêm cờ boolean vào mô hình của bạn và đánh dấu các đối tượng bạn muốn truy xuất là đúng, sau đó tìm nạp các đối tượng được gắn cờ vào lần tiếp theo ứng dụng của bạn bắt đầu.

Tuy nhiên, bạn có thể thử tải phiên bản chuỗi URL bằng -absoluteString và lưu trữ.

+0

Nếu bạn đã thực hiện phương pháp này, hãy đảm bảo chọn hộp "được lập chỉ mục" trên thuộc tính boolean vì bạn sẽ tìm nạp dựa trên cờ đó. – ma11hew28

-1

Tôi thích những gì @kevboh gợi ý. Bạn cũng có thể xem xét lưu trữ objectID s cụ thể NSManagedObject s trong NSUserDefaults. Ví dụ:

[[NSUserDefaults standardUserDefaults] setObject:featuredNSManagedObjectIDArray 
              forKey:@"FeaturedNSManagedObjectIDs"]; 
+0

cách hoạt động của kevboh nhưng bổ sung thêm một mức độ vô hướng. Tôi ổn với cách tôi đang làm, chỉ là tôi có lỗi đánh máy. – SaldaVonSchwartz

0

Hmmm. Có vẻ như có một cách đơn giản hơn nhiều để làm điều này với CoreData. Hãy nhớ rằng, CoreData là một đồ thị đối tượng. Thật tốt khi theo dõi các mối quan hệ.

Tại sao không chỉ có một thực thể trong CoreData giữ mối quan hệ một-nhiều với các đối tượng bạn thích? Sau đó, bạn chỉ có thể chèn/xóa/tìm kiếm/lặp lại/bất cứ điều gì trên bộ sưu tập các đối tượng.

+0

Phương pháp URL đã lưu trữ cho phép chuyển các ID thông qua JSON, v.v. và nếu tôi giữ nhiều đối tượng đến các đối tượng tôi cũng có thể tìm nạp chúng (chúng nằm trong một nhiều để bắt đầu với). Toàn bộ vấn đề là để có thể truy xuất chúng đúng lúc mà không cần tạo toàn bộ tìm nạp, vị từ, không có gì, – SaldaVonSchwartz

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