我有一个使用Core Spotlight
索引应用内容的应用。该应用程序还使用Core Data
,在创建NSManagedObject
时,对象的详细信息将用于CSSearchableItem
,然后添加到Spotlight Search Index
。
事情是,我认为没有NSManagedObject
和CSSearchableItem
的方向引用,因此当项目添加到索引时,它只是复制详细信息。
以下是向索引添加项目的示例。
//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
个项目?
答案 0 :(得分:5)
如果您希望索引相关,则保持索引最新是至关重要的。每次使用Core Data执行此类操作时,都必须在索引中添加/删除项目。在从Core Data中删除之前,应使用以下方法从索引中删除项目。您还可以在CoreSpotlight文档中找到许多有用的信息。
答案 1 :(得分:3)
如果你在NSManagedObject上实现willSave:
方法,那么你就是在正确的轨道上,它将在针对该记录的任何保存/删除操作上被调用。更多关于那里
要遵循的步骤:
提示:如果您为核心数据对象序列化NSManagedObjectID,(假设您在保存对象之前获得了对象的永久ID),您可以使用它作为搜索索引项的唯一标识符,这样您就可以快速查找/更新它
答案 2 :(得分:1)
您希望索引与删除项目同步。因此,请查看CSSearchableIndex类实现的这三种方法,以便在不再需要时删除项目。
就像这个例子一样,
CSSearchableIndex.defaultSearchableIndex().deleteSearchableItemsWithDomainIdentifiers(["tv-shows"]) { (error) -> Void in
if error != nil {
print(error?.localizedDescription)
}
else {
// Items were deleted successfully
}
}