使用核心数据时更新 Spotlight 搜索索引?
Update Spotlight Search Index when working with Core Data?
我有一个应用程序使用 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.")
}
}
将项目添加到索引后,所有项目都可以通过 Spotlight 搜索进行搜索。 appDelegate
中的一个函数负责处理选择索引项时的操作。
所以一切似乎都很好,直到我在应用程序中编辑或删除 NSManagedObject
,因为 Searchable Items Index
不更新索引索引中列出的项目不是最新的并且仍然列出deleted/old 数据。
那么,当 NSManagedObject
更新时,我如何保持 CSSearchableIndex
项更新?
如果您希望索引具有相关性,那么保持索引最新是至关重要的。每次使用 Core Data 进行此类操作时,您都必须 add/remove 索引中的项目。在从核心数据中删除之前,您应该使用以下方法从索引中删除项目。您还可以在 CoreSpotlight 文档中找到很多有用的信息。
您走在正确的轨道上,如果您在 NSManagedObject 上实现 willSave:
方法,它将在针对该记录的任何 save/delete 操作中被调用。更多信息请点击这里
要遵循的步骤:
- 在你的核心数据 NSManagedObject 上实现 willSave 方法
子类
- 查找映射到核心数据对象的索引对象
- Update/Delete 即索引
提示:如果您为核心数据对象序列化 NSManagedObjectID,(假设您在保存之前获得了该对象的永久 ID),您可以使用它作为搜索索引项的唯一标识符,这样你可以很快find/update它
您希望索引与项目删除同步。因此,寻找由 CSSearchableIndex class 实现的这三种方法来删除不再需要的项目。
- deleteAllSearchableItemsWithCompletionHandler(_:)
- deleteSearchableItemsWithDomainIdentifiers(_:completionHandler:)
- deleteSearchableItemsWithIdentifiers(_:completionHandler:)
像这个例子,
CSSearchableIndex.defaultSearchableIndex().deleteSearchableItemsWithDomainIdentifiers(["tv-shows"]) { (error) -> Void in
if error != nil {
print(error?.localizedDescription)
}
else {
// Items were deleted successfully
}
}
我有一个应用程序使用 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.")
}
}
将项目添加到索引后,所有项目都可以通过 Spotlight 搜索进行搜索。 appDelegate
中的一个函数负责处理选择索引项时的操作。
所以一切似乎都很好,直到我在应用程序中编辑或删除 NSManagedObject
,因为 Searchable Items Index
不更新索引索引中列出的项目不是最新的并且仍然列出deleted/old 数据。
那么,当 NSManagedObject
更新时,我如何保持 CSSearchableIndex
项更新?
如果您希望索引具有相关性,那么保持索引最新是至关重要的。每次使用 Core Data 进行此类操作时,您都必须 add/remove 索引中的项目。在从核心数据中删除之前,您应该使用以下方法从索引中删除项目。您还可以在 CoreSpotlight 文档中找到很多有用的信息。
您走在正确的轨道上,如果您在 NSManagedObject 上实现 willSave:
方法,它将在针对该记录的任何 save/delete 操作中被调用。更多信息请点击这里
要遵循的步骤:
- 在你的核心数据 NSManagedObject 上实现 willSave 方法 子类
- 查找映射到核心数据对象的索引对象
- Update/Delete 即索引
提示:如果您为核心数据对象序列化 NSManagedObjectID,(假设您在保存之前获得了该对象的永久 ID),您可以使用它作为搜索索引项的唯一标识符,这样你可以很快find/update它
您希望索引与项目删除同步。因此,寻找由 CSSearchableIndex class 实现的这三种方法来删除不再需要的项目。
- deleteAllSearchableItemsWithCompletionHandler(_:)
- deleteSearchableItemsWithDomainIdentifiers(_:completionHandler:)
- deleteSearchableItemsWithIdentifiers(_:completionHandler:)
像这个例子,
CSSearchableIndex.defaultSearchableIndex().deleteSearchableItemsWithDomainIdentifiers(["tv-shows"]) { (error) -> Void in
if error != nil {
print(error?.localizedDescription)
}
else {
// Items were deleted successfully
}
}