2011-12-08 25 views
10

Tôi đang tạo đối tượng NSManagedObjectContext ở cấp đại biểu Ứng dụng và chia sẻ nó trên tất cả các số UIViewController s của mình. Dưới đây là đoạn code mà tôi sử dụng để truy cập vào nó trong một trong những Xem Bộ xử lý của tôi:CoreData: Xóa các thay đổi từ NSManagedObjectContext

 NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext; 
     modelObj = (Model *) [NSEntityDescription insertNewObjectForEntityForName:@"Model" inManagedObjectContext:[appDelegate managedObjectContext]]; 

Bây giờ trong màn hình này, tôi có một UITableView với 9 hàng & mỗi tế bào có một UITextField. Khi người dùng nhập các giá trị vào các trường văn bản, tôi gán chúng vào modelObj. Bây giờ, người dùng của tôi có một tùy chọn để hủy bỏ và loại bỏ tất cả các thay đổi hoặc lưu chúng vào đĩa. Tôi có mã lưu làm việc tốt. Nhưng trong trường hợp người dùng cố gắng loại bỏ các thay đổi, tôi không chắc chắn phải làm gì. Có vẻ như không phải là phương pháp [managedObjectContext discardChanges] để ném tất cả chúng đi.

Tôi có thể nghĩ ra một vài cách để giải quyết vấn đề này.

  • Tạo phiên bản mới NSManagedObjectContext cho mỗi bộ điều khiển thay vì chia sẻ một trên ứng dụng.
  • Hoặc, tôi có thể tạo một bó số NSString s trong mã của tôi và lưu giá trị người dùng vào chúng và gọi insertNewObjectForEntityForName: chỉ khi người dùng nhấp vào lưu.

Cách nào là đúng? Hoặc có cách nào để thực hiện NSManagedObjectConext loại bỏ tất cả các thay đổi đã được thực hiện cho nó không?

Xin cảm ơn,
Teja.

+1

Câu trả lời của Tim Dean là chính xác. Nhưng nó cũng sẽ không phải là một cách tiếp cận sai để tạo ra một bối cảnh con cho màn hình chỉnh sửa này, chèn đối tượng mới của bạn ở đó, và chỉ lưu nó vào bối cảnh gốc nếu người dùng xác nhận. Nếu không, chỉ cần ném đứa trẻ đi, và bạn đã hoàn tất. –

Trả lời

36

NSManagedObjectContext có một phương pháp đơn giản cho việc này:

[managedObjectContext rollback]; 

Phương pháp này "loại bỏ tất cả mọi thứ từ lùi lại ngăn xếp, loại bỏ tất cả chèn và xóa bỏ, và phục hồi các cập nhật đối tượng cho các giá trị cam kết cuối cùng của họ." (documentation)

Trừ khi tôi thiếu thứ gì đó, điều đó sẽ cung cấp cho bạn mọi thứ bạn cần.

+2

Vì câu hỏi được gắn thẻ với iOS, có thể hữu ích khi đề cập đến phương thức rollback yêu cầu một 'undoManager' được gán cho MOC, trong trường hợp của iOS, tôi tin rằng nó không được mặc định và do đó' rollback' sẽ làm không có gì. –

+1

Đây là tài liệu tham khảo hỗ trợ nhận xét của @ ChristopherKing [tài liệu táo] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/#//apple_ref/occ/instp/NSManagedObjectContext/undoManager). Hãy chắc chắn thêm 'NSUndoManager' vào' NSManagedObjectContext' của bạn để nó hỗ trợ các hoạt động 'undo' hoặc' rollback'. –

2

Bạn có thể đang tìm kiếm -refreshObject:mergeChanges: - tài liệu nói rằng nó đặt lại đối tượng từ cửa hàng liên tục và nếu bạn vượt qua NO làm đối số thứ hai, bạn có thể chọn không áp dụng lại các thay đổi đã được thực hiện.

Điều này có thể sẽ yêu cầu bạn lưu trữ một tập hợp các đối tượng mà bạn đã thay đổi (đối số đầu tiên), sau đó xóa thiết lập khi bạn thực hiện thay đổi trong ngữ cảnh của mình với cửa hàng. Đây là một sự bổ sung khá tầm thường.

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