使用核心数据时更新 Spotlight 搜索索引?

Update Spotlight Search Index when working with Core Data?

我有一个应用程序使用 Core Spotlight 来索引应用程序内容。该应用程序还使用 Core Data,并且在创建 NSManagedObject 时,对象的详细信息用于 CSSearchableItem,然后添加到 Spotlight Search Index

我的印象是 NSManagedObjectCSSearchableItem 没有方向参考,所以当项目添加到索引时,它只是复制详细信息。

这里是一个添加项目到索引的例子。

//Spotlight Index Search
// Create an attribute set to describe an item.

    let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeData as String)

// Add metadata that supplies details about the item.

    attributeSet.title = "\(object.title)"
    attributeSet.contentDescription = "\(object.description)"

// Create an item with a unique identifier, a domain identifier, and the attribute set you created earlier.
    let item = CSSearchableItem(uniqueIdentifier: "1", domainIdentifier: "ObjectType", attributeSet: attributeSet)

// Add the item to the on-device index.
       CSSearchableIndex.defaultSearchableIndex().indexSearchableItems([item]) { error in

    if error != nil {
      print(error?.localizedDescription)
    }
      else {
      print("Item indexed.")
      }
    }

将项目添加到索引后,所有项目都可以通过 Spotlight 搜索进行搜索。 appDelegate 中的一个函数负责处理选择索引项时的操作。

所以一切似乎都很好,直到我在应用程序中编辑或删除 NSManagedObject,因为 Searchable Items Index 不更新索引索引中列出的项目不是最新的并且仍然列出deleted/old 数据。

那么,当 NSManagedObject 更新时,我如何保持 CSSearchableIndex 项更新?

如果您希望索引具有相关性,那么保持索引最新是至关重要的。每次使用 Core Data 进行此类操作时,您都必须 add/remove 索引中的项目。在从核心数据中删除之前,您应该使用以下方法从索引中删除项目。您还可以在 CoreSpotlight 文档中找到很多有用的信息。

- deleteSearchableItemsWithIdentifiers:completionHandler:

您走在正确的轨道上,如果您在 NSManagedObject 上实现 willSave: 方法,它将在针对该记录的任何 save/delete 操作中被调用。更多信息请点击这里

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/index.html#//apple_ref/occ/instm/NSManagedObject/willSave

要遵循的步骤:

  1. 在你的核心数据 NSManagedObject 上实现 willSave 方法 子类
  2. 查找映射到核心数据对象的索引对象
  3. Update/Delete 即索引

提示:如果您为核心数据对象序列化 NSManagedObjectID,(假设您在保存之前获得了该对象的永久 ID),您可以使用它作为搜索索引项的唯一标识符,这样你可以很快find/update它

您希望索引与项目删除同步。因此,寻找由 CSSearchableIndex class 实现的这三种方法来删除不再需要的项目。

  1. deleteAllSearchableItemsWithCompletionHandler(_:)
  2. deleteSearchableItemsWithDomainIdentifiers(_:completionHandler:)
  3. deleteSearchableItemsWithIdentifiers(_:completionHandler:)

像这个例子,

CSSearchableIndex.defaultSearchableIndex().deleteSearchableItemsWithDomainIdentifiers(["tv-shows"]) { (error) -> Void in
    if error != nil {
        print(error?.localizedDescription)
    }
    else {
        // Items were deleted successfully
    }
}