2012-07-19 30 views
10

Tôi cần có mã định danh duy nhất cho loại NSManagedObject tôi đã tạo. Nó cần phải có sẵn ngay khi đối tượng đã được tạo ra, không bao giờ thay đổi và hoàn toàn độc đáo.Mã định danh duy nhất cho NSManagedObject

Quy tắc này ra khỏi NSManagedObjectID, vì điều này có thể thay đổi khi ngữ cảnh được lưu. Tôi tin rằng phương pháp -hash có thể không phải là duy nhất nếu đối tượng của tôi có cùng thuộc tính.

Tôi thực sự muốn tránh tạo trường UUID duy nhất vô dụng khác trên thực thể vì điều này có vẻ lãng phí và lộn xộn. Có thực hành tốt nhất được chấp nhận ở đây không?

+0

Bạn đã xem xét băm muối chưa? – Jim

+2

'NSManagedObjectID' sẽ thay đổi sau khi ** ** tiết kiệm bối cảnh đầu tiên sau đó đối tượng sẽ nhận được' NSManagedObjectID' cuối cùng và nó sẽ không bị thay đổi bao giờ. bạn không nên lo lắng về các ID tồn tại sau đó, ngay cả khi bạn đã xóa 'đối tượng' vì không có' đối tượng' mới sẽ nhận được ID cũ. – holex

Trả lời

15

thử thuộc tính URIRepresentation của NSManagedObjectID. đây là ID duy nhất cho số NSManagerObject hiện tại nhưng hãy cẩn thận cho đến khiNSManagedObjectkhông được lưu. ID này chỉ cung cấp cho bạn ID tạm thời, không phải là số vĩnh viễn và có thể khác. (Tôi chỉ nói rằng nó bởi vì tôi không biết những gì và làm thế nào bạn muốn sử dụng ID duy nhất.)

CẬP NHẬT # 1

này không được một ID duy nhất tưởng tượng chỉ, đây là URL duy nhất cho mỗi cá nhân NSManagedObject (giống như mọi tệp có URL duy nhất), sử dụng chúng, bạn có thể tìm lại số NSManagedObject gốc sau khi bạn mất con trỏ. Tôi biết rất khó hiểu, nhưng đây là điểm của NSManagedObjectID và các thuộc tính của nó.

(nếu bạn không hiểu làm thế nào CoreData và các đối tượng của họ làm việc, bạn sẽ không downvote câu trả lời. Xin vui lòng, đọc tài liệu nhiều hơn thay vì downvoting vô nghĩa.)

CẬP NHẬT # 2

theo bình luận @NickLocking, tôi sẽ mở rộng phần in đậm của câu trả lời của tôi trên:

cho đến khi tiết kiệmNSManagedObjectContextcho lớp học mới và vẫn chưa được lưuNSManagedObjectchỉ có ID duy nhất tạm thời. Họ sẽ nhận được ID duy nhất vĩnh viễn sau khi được lưu lần đầu tiên.

+1

Sự hiện diện URIRepresentation thay đổi khi đối tượng được lưu lần đầu tiên. –

0

Số nhận dạng duy nhất được cung cấp tự động bởi CoreData là ID đối tượng, nhưng như bạn đã lưu ý, nó sẽ thay đổi sau khi được tạo ban đầu. Nhưng trước khi bạn đi đến với một cách khác để làm việc xung quanh này, bạn có thể muốn xem xét việc xác định một cái gì đó như sau trong lớp đối tượng quản lý của bạn:

- (NSManagedObjectID *)permID { 
    if ([[self objectID] isTemporaryID]) { 
     // Save myself, returning nil if there are errors 
    } 
    return [self objectID]; 
} 

Cách tiếp cận này không phải là hoàn hảo bởi bất kỳ phương tiện, đặc biệt là nếu bạn cần hiển thị ID cố định trước khi đối tượng ở trạng thái hợp lệ và có thể được lưu vào cơ sở dữ liệu. Nhưng nó sẽ cho phép bạn để lộ một ID vĩnh viễn một cách nhất quán miễn là bạn không cần nó trước khi đối tượng có thể được lưu lại.

+1

Vấn đề với điều này là, lưu đối tượng trong trường hợp này có nghĩa là các phần khác của ứng dụng của tôi phát hiện rằng một đối tượng mới đã được tạo và xử lý nó. Điều này có nghĩa, ví dụ, một mục nhập xem bảng được tạo ra mà không có trường nào được đặt. –

3

Cuối cùng tôi đã quyết định rằng không có cách nào tốt để làm điều này, vì vậy tôi vừa tạo ra một trường uniqueIdentifier mà tôi áp dụng một UUID vào awakeFromInsert.

Lưu đối tượng làm cho các phần khác của ứng dụng của tôi, cụ thể là NSFetchedResultsControllers, để cập nhật trước khi tôi kết thúc với đối tượng. Tôi đã thử một cách ngắn gọn phương thức obtainPermanentObjectIds của NSManagedObjectContext: withError:, nghĩ rằng nó sẽ lấy các ID đối tượng mà không lưu ngữ cảnh, nhưng trên thực tế nó chỉ đơn giản là lưu ngữ cảnh.

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