ios - 如何检查给定数组中哪些项目已保存在 Core Data 中

标签 ios swift iphone core-data iphonecoredatarecipes

我的目标是

我想将一组数据存储到 coreData 中。 这是我的数组

let storageArr = ["Teja", "Teja two", "Teja Ri", "Bhanu", "Stack", "Stack over", "Stack over flow"] as NSObject

如果用户在文本字段中输入,我需要在下拉列表(tableView)中显示它们(与该字符相关)。

假设用户输入了“Te”。我需要在表格 View 中显示 Teja、Teja Two、Teja Ri

我已经做了一切。但我无法从数组中仅获取 Teja、Teja 两个、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)
    }
}

viewDidLoad() 中调用 savingDataToLocalDB() 这意味着存储在 coreData

并在@IBAction中从coreData获取数据。

但是在 setUpData(searchKeyword: String) 方法中,我无法过滤包含“Te”(用户在文本字段中输入的数据)的数据

请找到下面的图片。这就是我创建实体的方式

enter image description here

我哪里做错了?

最佳答案

您的数据库中似乎有一个实体,其可转换属性为“名称”。该属性是一个可转换的数组。这意味着它作为数据存储在数据库中并自动编码和解码。数据库无法搜索或排序该数组,因为 1) 它是单个属性,而不是实体的集合,2) 它存储为数据。因此,所有管理都必须在内存中完成,这意味着您在承担所有成本的同时,无法享受到核心数据的任何好处。

接下来,在您的代码中获取所有 SearchList。您的数据库包含一个,因此您将返回长度为 1 的数组。然后您过滤该 SearchList 数组(而不是名称数组),然后您会返回与开始时相同的 searchList 数组,因为该 SearchList 确实通过了测试。

也许你想要:

    let wasfilteredData = filteredData.first?.names.filter { $0.lowercased().contains(searchKeyword.lowercased()) } as NSArray

或者也许您应该考虑让每个实体仅包含术语,然后使用谓词进行搜索。

关于ios - 如何检查给定数组中哪些项目已保存在 Core Data 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57614054/

相关文章:

ios - 如何通过DiffableDataSource更新Section中的页脚而不会造成闪烁效果?

ios - 如果我们将 UIlabel 给 GCD 或 NSOperationQueue 中的后台线程会发生什么

ios - 移动键盘时出现黑色区域

ios - 自定义 UITableView 单元格 Nib 文件仅在选择单元格后显示?

javascript - 如何使用 Swift 在 Javascript 中单击按钮

iphone - iOS 6 - 状态保存和恢复

iphone - 从 iPhone 移植到 Windows Phone 7

iphone - Cocos2d 从 iPad 到 iPhone

ios - 使用 UIDocumentPickerViewController 在 Swift 中导入文本

ios - UIToolbar 在带有 UIPickerView 的自定义 UITableViewCell 中没有响应