ios - 如何检查给定数组中哪些项目已保存在 Core Data 中
问题描述
我的目标是
我想将一组数据存储到 coreData 中。这是我的数组
let storageArr = ["Teja", "Teja two", "Teja Ri", "Bhanu", "Stack", "Stack over", "Stack over flow"] as NSObject
如果用户在文本字段中输入,我需要在下拉列表(tableView)中显示它们(与该字符相关)。
假设用户输入了"Te"。我需要在表格视图中显示Teja,Teja 2,Teja Ri 。
我已经做了一切。但是我无法从数组中仅获取Teja、Teja 2、Teja Ri 。
这是我尝试过的代码
override func viewDidLoad() {
super.viewDidLoad()
savingDataToLocalDB()
}
@IBAction func searchBtnClicked(_ sender: Any) {
setUpData(searchKeyword: searchTF.text)
}
func savingDataToLocalDB(){
let saveContext = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext
let data: SearchList = NSEntityDescription.insertNewObject(forEntityName: "SearchList",
into: saveContext!) as! SearchList
data.names = storageArr
do {
try saveContext?.save()
print("data saved")
} catch {
print(error)
}
}
func setUpData(searchKeyword: String){
let fetchContext = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext
let fetchReq = NSFetchRequest<NSManagedObject>(entityName: "SearchList")
do {
let data = try fetchContext?.fetch(fetchReq)
var filteredData = data as! [SearchList]
print(filteredData[0].names) // Am getting data here
//following line is not working
let wasfilteredData = filteredData.filter { $0.names!.lowercased().contains(searchKeyword.lowercased()) } as NSArray
} catch {
print(error)
}
}
Here in viewDidLoad()
am callsavingDataToLocalDB()
这意味着存储在 coreData
并且@IBAction
正在从 coreData 获取数据。
但是在setUpData(searchKeyword: String)
方法中我无法归档数据包含“ Te ”(用户在文本文件中输入)
请找到以下图片。这就是我创建实体的方式
我在哪里做错了?
解决方案
您的数据库中似乎有一个 SINGLE 实体,具有“名称”的可转换属性。该属性是一个可转换的数组。这意味着它作为数据存储在数据库中,并自动编码和解码。数据库无法搜索或排序此数组,因为 1) 它是单个属性,而不是实体的集合,并且 2) 它被存储为数据。因此,所有管理都必须在内存中完成,这意味着您没有核心数据的任何好处,同时还要承担所有成本。
接下来,在您的代码中,您获取所有SearchList
. 您的数据库包含一个,因此您返回长度为 1 的数组。然后过滤该 SearchList 数组 - 而不是名称数组,您将返回与您开始时相同的 searchList 数组,因为 SearchList 确实通过了测试。
也许你想要:
let wasfilteredData = filteredData.first?.names.filter { $0.lowercased().contains(searchKeyword.lowercased()) } as NSArray
或者也许您应该考虑让每个实体仅包含术语,然后使用谓词进行搜索。
推荐阅读
- rabbitmq - 具有 1Master 和 5Nodes 的 RabbitMQ 集群 [已解决]
- python - 2个数据帧中非唯一数据的比较
- assembly - 如何计算我需要多少尺寸才能正确制作 MBR
- amazon-web-services - AWS SES:用户无权对资源执行 ses:SendEmail
- docker - 如何在相当普通的笔记本电脑上提高 WSL/docker 容器的性能?
- android - 无法在 Flutter 应用程序中隐藏进度对话框
- python - 使用 Python 和请求的自签名 CA 验证错误
- c++ - C++ const_iterator 到 forward_list 的迭代器
- sql - PostgreSQL 删除行,其中等于以逗号分隔的字符串
- r - R中三列之间的匹配大小写