2010-09-09 35 views
6

Tôi nghĩ rằng tôi hiểu thông báo lỗi: CoreData không thể hoàn thành lỗi, nhưng tôi không chắc chắn cách xử lý nó.CoreData không thể hoàn thành lỗi khi đối tượng được cập nhật bằng dịch vụ HTTP

Chúng tôi có một ứng dụng mà chúng tôi sử dụng Dữ liệu cốt lõi để lưu giữ dữ liệu tồn tại từ một dịch vụ JSON. Hôm nay tôi đang làm như sau.

  1. Fetch đối tượng cục bộ từ cửa hàng dai dẳng và trở về giao diện người dùng
  2. Hỏi máy chủ nếu đối tượng được cập nhật - khi tôi nhận được câu trả lời, tôi cập nhật các dữ liệu cốt lõi quản lý đối tượng
  3. Cập nhật giao diện người dùng với mục đích cập nhật

Vấn đề là; ngay cả khi tôi không sử dụng đa luồng, đôi khi tôi nhận được lỗi khi yêu cầu HTTP xóa các đối tượng được quản lý mà giao diện người dùng của tôi đã giữ lại. Tôi đã cố gắng lấy các đối tượng với hàm returnObjectsAsFaults thành NO. Tôi nghĩ rằng tôi sau đó có thể truy cập tất cả các mối quan hệ và tài sản của một đối tượng quản lý ngay cả khi nó đã bị xóa (miễn là giao diện người dùng của tôi đã giữ lại nó).

Tôi nên giải quyết vấn đề này như thế nào?

Tôi nghĩ mình có thể sử dụng NSManagedObjectContext riêng để đọc và ghi. Tôi đã thực hiện kiểm tra này:

MyAuthorMO *authorUpdate = [[MyAuthorMO alloc] init]; // I have made this init insert the object into the updateContext 
authorUpdate.firstname = @"Hans"; 
authorUpdate.lastname = @"Wittenberg"; 
authorUpdate.email = @"[email protected]"; 

NSManagedObjectContext *updateContext = [[MyCoreManager getInstance] managedObjectContext]; 

NSError *error = nil; 
[updateContext save:&error]; 

NSManagedObjectContext *readContext = [[MyCoreManager getInstance] readOnlyContext]; 

NSFetchRequest *fetchRequest = [managedObjectModel fetchRequestFromTemplateWithName:@"authorByEmail" substitutionVariables:[NSDictionary dictionaryWithObject:@"[email protected]" forKey:@"EMAIL"]]; 
[fetchRequest setReturnsObjectsAsFaults:NO]; 

NSArray *authors = [readContext executeFetchRequest:fetchRequest error:&error]; 

MyAuthorMO * readAuthor = [authors objectAtIndex:0]; 

// Delete the author with update context: 
[updateContext deleteObject:authorUpdate]; 
[updateContext save:&error]; 

NSLog(@"Author: %@ %@, (%@)", readAuthor.firstname, readAuthor.lastname, readAuthor.email); 

Nhật ký được xuất tốt nhất miễn là tôi sử dụng readContext để tìm nạp. Nếu tôi sử dụng updateContext cho tìm nạp, tôi nhận được một ngoại lệ. Điều này có vẻ đầy hứa hẹn, nhưng tôi sợ rằng tôi sẽ gặp phải vấn đề ở giai đoạn sau. Sớm hay muộn tôi có lẽ sẽ cố gắng truy cập vào một tài sản mà không được lấy hoàn toàn (một lỗi). Làm thế nào tôi có thể đạt được hành vi mà tôi đang tìm kiếm?

+0

Nick, có thể bạn đã đúng. Tôi đã đọc qua các bài viết trước đó của mình và chấp nhận các giải pháp tốt nhất. Cám ơn bạn đã góp ý. – Andi

Trả lời

14

Bạn không nên giữ lại các đối tượng được quản lý mà ngữ cảnh đã phát hành. Hãy để bối cảnh làm điều đó cho bạn.

Vấn đề là đối tượng được quản lý có thể tồn tại dưới dạng lỗi hoặc đối tượng được hiện thực hóa. Khi bạn giữ lại một, bạn có thể giữ lại lỗi không chứa dữ liệu. Ngay cả khi bạn giữ lại đối tượng thực tế, đối tượng có thể không hoạt động đúng khi nó đã được tách khỏi ngữ cảnh của nó.

Để xử lý kịch bản của bạn, bạn cần ngữ cảnh cho giao diện người dùng và sau đó là ngữ cảnh cho máy chủ. Sau khi bối cảnh làm thay đổi, bạn nên hợp nhất bối cảnh để đảm bảo cả hai được cập nhật đúng cách liên quan đến cửa hàng.

Giao diện người dùng của bạn phải được định cấu hình để phản ánh trạng thái của mô hình dữ liệu, bạn không nên có các phần của mô hình dữ liệu phụ thuộc vào trạng thái của giao diện người dùng.

+1

Tôi đồng ý với bạn, nhưng có một số câu hỏi tiếp theo. Tôi không giữ lại MO, nhưng nếu tôi sử dụng nó ở đâu đó, nó có thể được giữ lại mà tôi không biết. Có ok để thêm một MO để NSArray hoặc NSDictionary? Nếu vậy, sau đó nó sẽ được giữ lại ... Tôi có cần hợp nhất bối cảnh không, hoặc tôi có thể đợi lần tiếp theo tôi tìm nạp từ "read" -context "? Tôi sợ rằng dữ liệu của tôi bị hỏng nếu tôi hợp nhất hai bối cảnh nơi đối tượng mà tôi hiện đang hiển thị sẽ bị xóa (với "write" -context) – Andi

+1

Tôi không rõ ràng.Tôi có nghĩa là bạn không nên cố gắng giữ lại một đối tượng được quản lý mà bối cảnh đã xử lý. Điều đó sẽ trở nên lộn xộn. Bạn nên hợp nhất bối cảnh nhưng bạn sẽ cần phải đóng băng giao diện trong khi mô hình cập nhật. Hãy xem cách NSFetchedResultsController xử lý vấn đề chính xác này với việc cập nhật dữ liệu trong khi dữ liệu được hiển thị trong một bảng. Đóng băng giao diện người dùng thường hoàn toàn không được chú ý bởi người dùng. Nếu bạn có dữ liệu có thể bị xóa trong khi người dùng đang làm việc với nó, bạn cần phải suy nghĩ lại về thiết kế của mình. Người dùng nên kiểm soát việc xóa đó. – TechZen

0

Tôi đã gặp vấn đề tương tự trong cơ sở dữ liệu của mình vì tôi tham chiếu đến đối tượng không tồn tại (vì tôi xóa đối tượng đó với đối tượng có quan hệ khác). Giải pháp của tôi là đặt "Không hành động" trong mối quan hệ của tôi.

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