【问题标题】:Knowing what persistent store a query comes from了解查询来自哪个持久存储
【发布时间】:2012-09-20 15:14:23
【问题描述】:

Core Data 可能无法完成我尝试做的事情,如果是这样,请告诉我。

我有一个 ManagedObjectContext,我通过 addPersistentStoreWithType 添加 sqlite 数据库。 . .

所以我将添加一些数据库 - 假设在 1 到 5 之间,然后我对数据库中的数据执行提取。太好了,我不必说我正在搜索哪些来源 - 结果刚回来,它们就合并在一起了。

但是,如果我知道每个结果来自哪个 Store,该怎么办?这甚至可能吗?我是不是想得太“老派”了,想知道结果找到了哪些“文件”?

帮助/建议将不胜感激。

这里有一些代码:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"PMBEntity"
    inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                    initWithKey:@"Name" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[fetchRequest setReturnsDistinctResults:YES];
[sortDescriptor release];

NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

看,上面我有一个 PMBEntity,它是我通过 XCode 创建的核心数据 NSManagedObjectModel。如您所知,(众多)字段之一是“名称”。在这里,我正在搜索所有唯一名称并按名称排序。

返回给我的是这些 PMBEntity 对象的 NSArray。

【问题讨论】:

  • [link]developer.apple.com/library/mac/#documentation/Cocoa/Reference/… 似乎暗示我应该能够做到这一点 - 但我看不出如何:
  • 协调器提供对其底层对象存储的访问权限。您可以在第一次添加对象存储时检索对象存储(使用 addPersistentStoreWithType:configuration:URL:options:error:),或者使用 persistentStoreForURL: 或 persistentStores。例如,这使您可以确定是否已添加商店,或两个对象是否来自同一商店
  • 为什么特别需要多个数据库?
  • 因为这个应用程序用户正在通过 iTunes 添加他们自己的数据库。我希望能够向他们展示哪些数据来自什么来源。
  • 那么,您是在动态生成 NSManagedObjectModel 吗?

标签: core-data nsmanagedobjectcontext nspersistentstore


【解决方案1】:

您需要托管对象的objectID 属性的persistentStore 属性。这将为您提供一个指向保存托管对象的持久存储的 URL。

但是,只有在对象至少保存一次到持久存储之后。在此之前,它有一个不指向商店的临时 UUID。我不确定新的进口商店如何影响它。读入时可能会得到一个永久 ID,但我还没有测试它。

【讨论】:

  • 完美!这就是我一直在寻找的。谢谢:[[instanceOfNSManagedObject] objectID] persistentStore] 有效。谢谢。
【解决方案2】:

好吧,当您获取时,您将获得 NSManagedObject 实例作为结果。 NSManagedObject 实例具有对其 NSManagedObjectContext 的引用。那个 NSManagedObjectContext 引用了它的 persistentStoreCoordinator。 NSPersistentStoreCoordinator 实例具有对持久存储和 NSManagedObjectModel 的引用。

【讨论】:

  • 我可以看到获取持久存储的方法,但它返回一组正在管理的持久存储,而不是它提取的特定存储(如果你会在我的脑海中“归档”)它从。你能进一步解释一下吗?
  • NSArray *foo = [[[p managedObjectContext] persistentStoreCoordinator] persistentStores]; 返回一个包含我添加的所有 3 个持久存储的数组 - 不是它从中找到这个对象“p”的那个。
  • 您需要查找存储元数据,并查看您获取的记录是否包含在持久存储的元数据中。
  • 你能给我一个指向方法的指针吗?我意识到我需要做什么的概念,我只是不知道该怎么做。
猜你喜欢
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多