使用Core Data时更新Spotlight搜索索引?

时间:2015-12-08 20:38:21

标签: ios swift core-data corespotlight

我有一个使用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.")
      }
    }

将项目添加到索引后,所有项目都可通过聚光灯搜索进行搜索。选择索引项时,appDelegate中的函数会处理操作。

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

那么,当CSSearchableIndex更新时,如何更新NSManagedObject个项目?

3 个答案:

答案 0 :(得分:5)

如果您希望索引相关,则保持索引最新是至关重要的。每次使用Core Data执行此类操作时,都必须在索引中添加/删除项目。在从Core Data中删除之前,应使用以下方法从索引中删除项目。您还可以在CoreSpotlight文档中找到许多有用的信息。

- deleteSearchableItemsWithIdentifiers:completionHandler:

答案 1 :(得分:3)

如果你在NSManagedObject上实现willSave:方法,那么你就是在正确的轨道上,它将在针对该记录的任何保存/删除操作上被调用。更多关于那里

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. 更新/删除该索引
  4. 提示:如果您为核心数据对象序列化NSManagedObjectID,(假设您在保存对象之前获得了对象的永久ID),您可以使用它作为搜索索引项的唯一标识符,这样您就可以快速查找/更新它

答案 2 :(得分:1)

您希望索引与删除项目同步。因此,请查看CSSearchableIndex类实现的这三种方法,以便在不再需要时删除项目。

  1. deleteAllSearchableItemsWithCompletionHandler(_:)
  2. deleteSearchableItemsWithDomainIdentifiers(_:completionHandler:)
  3. deleteSearchableItemsWithIdentifiers(_:completionHandler:)
  4. 就像这个例子一样,

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