2013-02-14 22 views
5

Một số nền:Cần làm rõ về refreshObject: mergeChanges: YES

Tôi cố gắng để lưu trữ một lượng lớn dữ liệu trong DB địa phương và tôi muốn làm điều đó một cách hiệu quả càng tốt.

Kịch bản:

Có rất nhiều thực thể mà là liên quan, như địa chỉ được kết hợp với một số liên lạc như thế này:

địa chỉ < < -> Số liên lạc

Để quản lý các mối quan hệ, tôi đã viết một phương thức trong mỗi lớp con của NSManagedObject, bên dưới là một số đoạn mã:

// class Contact 
- (void)manageRelationships 
{ 
    @autoreleasepool { 
     LocalDBManager *localDBManager = [[LocalDBManager alloc] init]; 

     // managing relationships 

     // map associated addresses 

     NSPredicate *addressIdPredicate = [NSPredicate predicateWithFormat:@"%K == %@",ADDRESSID,self.addressid]; 

     // below method returns an object as fault by firing a fetch request against context 
     NSSet *retrievedAddresses = [localDBManager retrieveManagedObjectsForEntity:ADDR_ENTITY withPredicate:addressIdPredicate asFault:YES withPropertyValues:NO error:nil]; 
     self.addresses = retrievedAddresses; 


     // managing few more relationships   
    } 

} 

điểm để xem xét:

Vì có thể có nhiều mối quan hệ cho một đối tượng, tôi biết rằng tiêu thụ bộ nhớ sẽ tăng lên khi tôi sẽ là mối quan hệ lập bản đồ.

Câu hỏi:

Tôi muốn quay trở lại một đối tượng vào lỗi, mà không mất bất kỳ thay đổi được thực hiện, một khi mối quan hệ được ánh xạ.

Từ tài liệu về táo và một số googling Tôi đã biết rằng tôi có thể sử dụng phương thức refreshObject: mergeChanges:. Vì vậy, tôi đang lên kế hoạch để thêm bên dưới dòng ở cuối của khối mã trong phương pháp manageRelationships:

[[self managedObjectContext] refreshObject:self mergeChanges:YES]; 

Tôi là một chút bối rối và muốn biết rằng -

Liệu nó có nghĩa là bất cứ điều gì thay đổi được thực hiện cho đối tượng sẽ là được lưu trữ trong lưu trữ liên tục và sau đó đối tượng sẽ chuyển sang lỗi? Nếu có, tôi có thể xem xét nó tương đương với phương pháp lưu NSManagedObjectContext

Vui lòng đề nghị.

+0

gặp vấn đề tương tự! bạn có tìm thấy giải pháp nào cho kịch bản này không? – Bucket

Trả lời

11

Trước hết bạn không cần tự quản lý các mối quan hệ. Hãy để CoreData xử lý điều đó.

Dữ liệu lõi tự động giải quyết (lỗi) khi bạn truy cập dữ liệu do lỗi. Việc tải xuống một cách chậm chạp của các đối tượng liên quan này là tốt hơn nhiều đối với việc sử dụng bộ nhớ và nhanh hơn nhiều khi tìm nạp các đối tượng liên quan đến các đối tượng hiếm khi được sử dụng (hoặc rất lớn). CoreData performance

Bạn có thể làm điều này bằng cách khởi tạo mối quan hệ một-nhiều giữa địa chỉ liên hệ đơn giản.

Liên quan đến refreshObject: mergeChanges: bạn đã sai.Nó không tương đương với phương thức save:. Nếu bạn đặt các thay đổi hợp nhất thành CÓ, điều đó chỉ có nghĩa là:

Nếu cờ là YES, thì giá trị thuộc tính của đối tượng sẽ được tải lại từ các cửa hàng hoặc trạng thái lưu trữ cuối cùng sau đó mọi thay đổi được thực hiện (tại địa phương ngữ cảnh) được áp dụng lại cho các giá trị đó (bây giờ mới được cập nhật). Cocoa touch Doc

Vì vậy, nếu bạn đã làm một số thay đổi trong quản lý đối tượng A và sau đó đã làm [bối cảnh refreshObject: Một mergeChanges: YES] hơn đối tượng A vẫn sẽ giữ ở trạng thái chưa được lưu.

+0

hi Mark .. thnx để làm rõ :-) – Devarshi

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