【问题标题】:What is the best way to reference a core data entity?引用核心数据实体的最佳方式是什么?
【发布时间】:2014-05-18 11:13:28
【问题描述】:

我最近一直在阅读和处理核心数据,我喜欢它实现数据存储的方式。

但是,我仍然无法在我的应用中解决一件事。

在我的数据模型中,我有一个实体,它代表用户在文本字段中插入的一段文本。我希望能够让用户能够通过引用将这段文本嵌入到另一个文本字段中。

如果我直接使用数据库,我会这样做:

  1. 用户将一段文本添加到数据库中。它恰好有行索引17
  2. 用户返回主编辑器,在该编辑器中可以引用数据库中的文本块并插入诸如{chunk.17} 之类的模式,其中17 是数据库中的行索引。
  3. 用户单击“解析”按钮,应用程序会在数据库中查询该行,并将字符串 {chunk.17} 替换为存储在其中的文本块。

由于 Core Data 没有自动递增索引之类的东西,我不确定如何在不做太多工作的情况下创建类似的行为。任何想法表示赞赏!

【问题讨论】:

  • 顺便说一句...回应您的评论的注释...“核心数据没有自动递增索引之类的东西”。如果您使用NSSQLiteStoreType,并且您在不使用NSManagedDocument 的情况下保存数据,您可以(通过终端)打开 SQLite 数据库并检查数据库。您会注意到,当 Core Data 创建每个表时,它还会创建 Z_PK INTEGER PRIMARY KEY,这是一个自动增量主键。我知道这不能在代码中直接访问,但它存在。我知道,与您的问题无关,只是想提供此信息作为背景。
  • 针对您的问题,您是否正在为您希望在代码中访问的数据模型中的每个实体准备一个NSManagedObject 子类?
  • @andrewbuilder 是的。我正在使用由 Xcode 生成的类,并使用类别来构建它们。
  • 您是否使用 UITableViewController 类和视图来管理和呈现您的数据?也就是说,你如何向用户展示这个?
  • 很抱歉,这是在 OS X 上。我正在使用带有 NSPersistentDocument 的基于文档的应用程序。为了显示数据,我使用了一个简单的NSFetchRequest

标签: objective-c macos core-data


【解决方案1】:

听起来您需要向具有某些唯一值的实体添加属性(例如“id”)(S​​tackoverflow 上有很多关于如何为对象生成唯一 ID/值的讨论) .一旦你有了它,你就可以使用 NSPredicate 引用这个值:

NSFetchRequest *req = [[NSFetchRequest alloc] initWithEntityName:@"Demo"];
// A predicate is used as a limited substitute for a 'where' clause.  In this case, we're specifying that
// the result set should only contain entities whose id is 'chunk.17'.
[req setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE[c] %@", @"id", @"chunk.17"]];

NSError *error;
NSArray *results = [self.managedObjectContext executeFetchRequest:req error:&error];

【讨论】:

  • 为什么不允许用户指定“身份”,特别是如果他们稍后要在触发“解析”之前再次输入它...另外,请小心LIKE[c],因为它允许通配符和用户输入的内容可能会导致问题...
  • 同意 - 如果您要让用户设置身份,应谨慎使用 LIKE[c]。我上面的建议是基于身份将以编程方式设置的前提。
猜你喜欢
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
相关资源
最近更新 更多