2011-01-18 42 views
36

Giả sử tôi có danh sách sách được lưu trữ trong Dữ liệu chính. Tôi muốn tìm kiếm một cuốn sách bằng ID khóa chính của nó. Tôi biết các tập tin sqlite được tạo ra bởi Core Data có một cột ID trong mỗi bảng, nhưng điều này dường như không được tiếp xúc với tôi trong anyway.dữ liệu cốt lõi - id khóa chính của một hàng trong cơ sở dữ liệu

Có ai có bất kỳ đề xuất nào không?

Cảm ơn!

Trả lời

94

-[NSManagedObject objectID] là ID duy nhất cho một cá thể đối tượng trong Dữ liệu chính. Nó có thể được tuần tự hóa qua -[NSManagedObjectID URIRepresentation]. Bạn có thể truy xuất số objectID từ điều phối viên cửa hàng liên tục với -[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:] và sau đó lấy đối tượng từ ngữ cảnh đối tượng được quản lý bằng -[NSManagedObjectContext objectWithID:].

NHƯNG

Bạn nên ghi nhớ rằng Core Data là không một ORM. Đây là một số object graph management framework. Đó là sử dụng SQLite (và ID hàng duy nhất) làm phần phụ trợ hoàn toàn là chi tiết triển khai. Bạn càng sớm có thể thoát khỏi tư duy SQL/RDBMS, bạn càng thấy hài lòng với Dữ liệu cốt lõi nhanh hơn. Thay vì cố gắng tìm một đối tượng từ một ID được lưu trữ, hãy xem xét lý do tại sao bạn cần đối tượng đó và đối tượng cần nó. Nếu một thể hiện của lớp Foo cần có thể truy cập vào một thể hiện của lớp Bar, tại sao không chỉ tạo liên kết từ Foo đến Bar và đặt ví dụ Bar thích hợp làm mục tiêu của liên kết trên trường hợp Foo thích hợp. Hãy để Core Data theo dõi các ID đối tượng.

+33

Tôi ước tôi có thể cung cấp cho bạn một điểm cộng nữa cho 'Dữ liệu cốt lõi không phải là cơ sở dữ liệu'. – Abizern

+5

Có những trường hợp sử dụng phổ biến nơi bạn cần lấy một đối tượng bằng dữ liệu truyền id của nó từ một lựa chọn ô xem bảng tới bộ điều khiển xem chi tiết. Bạn chỉ có thể vượt qua đối tượng chính nó, nhưng thường bạn không muốn làm điều đó nếu bạn đang sử dụng một bối cảnh khác nhau trong chi tiết VC. – memmons

+1

@Michael: Chính xác. Thực hành tốt nhất để làm điều này là gì? – Noah

42

Như Barry Wark đã nói, hãy nhớ rằng Dữ liệu cốt lõi không phải là một orm. Chi tiết SQL tinh khiết không được tiếp xúc với người dùng và mọi hàng chỉ là một đối tượng. Nhân tiện, đôi khi bạn cần truy cập "khóa chính", ví dụ khi bạn cần đồng bộ hóa db coredata với cơ sở dữ liệu sql bên ngoài (trong trường hợp của tôi, tôi cần nó trong hàm gọi lại để thay đổi trạng thái của một đối tượng sau khi INSERT với thành công trong db từ xa). Trong trường hợp này, bạn có thể sử dụng:

objectId=[[[myCoredataObject objectID] URIRepresentation] absoluteString] 

rằng sẽ trả về một chuỗi như: x-CoreData: // 76BA122F-0BF5-4D9D-AE3F-BD321271B004/Object/p521 đó là id duy nhất được sử dụng bởi CoreData để xác định đối tượng đó.

Nếu bạn muốn để có được trở lại một đối tượng với id duy nhất:

NSManagedObject *managedObject= [managedObjectContext objectWithID:[persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:objectId]]]; 

NB: Hãy nhớ rằng nếu người nhận chưa được lưu trong bối cảnh CoreData, đối tượng ID là một giá trị tạm thời mà sẽ thay đổi khi đối tượng được lưu.

+1

chính xác! vấn đề giống nhau. cần thiết để gửi máy chủ id này với các chi tiết thực thể để tạo một mục nhập vào mySQL từ xa và sau đó trả lời, nhận được máy chủ tạo ra id duy nhất với cùng một objectID. lấy đối tượng formId và lưu trữ id máy chủ trong đó. –

+0

Cảm ơn bạn đã giải thích và mã nyc ... giải quyết vấn đề của tôi .. :) –

+0

@donnit, amogh Vì vậy, tôi phải làm gì trong một tình huống mà tôi đang lưu nội dung bên ngoài, và sau đó khi tôi cần phải kết thúc máy chủ sau đó có thể khớp với các giá trị của Id và cập nhật không? và cũng có thể thêm một đối tượng mới nếu id không tồn tại trong cơ sở dữ liệu. Làm thế nào tôi sẽ đạt được điều đó? – Pavan

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