【问题标题】:Core Data primary key ID for a row in the database数据库中一行的 Core Data 主键 ID
【发布时间】:2011-06-10 20:22:16
【问题描述】:

假设我有一个存储在 Core Data 中的书籍列表。我想通过它的主键 ID 搜索一本书。

我知道 Core Data 创建的 sqlite 文件在每个表中都有一个 ID 列,但这似乎并没有暴露给我。

有人有什么建议吗?

【问题讨论】:

    标签: iphone xcode core-data nspredicate nsmanagedobject


    【解决方案1】:

    -[NSManagedObject objectID] 是 Core Data 中对象实例的唯一 ID。可以通过-[NSManagedObjectID URIRepresentation]进行序列化。您可以使用-[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:] 从持久存储协调器中检索objectID,然后使用-[NSManagedObjectContext objectWithID:] 从托管对象上下文中获取对象。

    但是

    您应该记住,Core Data 不是 ORM。这是一个object graph management framework。那就是使用 SQLite(和唯一的行 ID)作为后端纯粹是一个实现细节。您越早摆脱 SQL/RDBMS 思维模式,您就越快对 Core Data 感到满意。与其尝试从存储的 ID 中查找对象,不如考虑为什么需要该对象以及什么对象需要它。如果Foo 类的实例需要能够访问Bar 类的实例,为什么不创建从FooBar 的关联并将适当的Bar 实例设置为目标在适当的Foo 实例上的关联。让 Core Data 跟踪对象 ID。

    【讨论】:

    • 我希望我能给你另一个加分,因为“核心数据不是数据库”。
    • 在一些常见的用例中,您需要通过对象的 id 来获取对象 - 将数据从表格视图单元格选择传递到详细视图控制器会浮现在脑海中。你可以只传递对象本身,但如果你在细节 VC 中使用不同的上下文,通常你不想这样做。
    • @Michael:没错。这样做的最佳做法是什么?
    • @Noah 传递 objectIDs 是according to Apple 的两个最佳实践之一。
    • 如何在需要同步的服务器->客户端情况下管理 objectID?
    【解决方案2】:

    正如 Barry Wark 所说,永远记住 Core Data 不是一个规范。纯 SQL 细节不会暴露给用户,每一行都只是一个对象。顺便说一句,有时您应该需要访问“主键”,例如当您需要将 coredata db 与外部 sql 数据库同步时(在我的情况下,我需要在回调函数中使用它来在 INSERT 之后更改对象的状态它在远程数据库中成功)。在这种情况下,您可以使用:

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

    这将返回一个字符串,如:x-coredata://76BA122F-0BF5-4D9D-AE3F-BD321271B004/Object/p521,这是 Core Data 用来识别该对象的唯一 ID。

    如果您想取回具有该唯一 ID 的对象:

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

    注意:请记住,如果接收者尚未保存在 CoreData 上下文中,则对象 ID 是一个临时值,将在保存对象时更改。

    【讨论】:

    • 没错!同样的问题。需要向服务器发送带有实体详细信息的此 ID 以进入远程 mySQL,然后作为响应,获取服务器生成的具有相同 objectID 的唯一 ID。获取对象形式 objectId 并将服务器 id 存储在其中。
    • 感谢纽约市的解释和代码...解决了我的问题.. :)
    • @donnit, amogh 那么在我将内容保存在异地,然后当我需要填充服务器端以匹配 ID 并更新值的情况下,我该怎么办?如果数据库中不存在 id,也可以添加新对象。那我该怎么做呢?
    【解决方案3】:

    这是您可以使用SwiftNSManagedObject 获取object idString 的方式:

    entity.objectID.uriRepresentation().absoluteString
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 2012-09-30
      • 1970-01-01
      相关资源
      最近更新 更多