【问题标题】:How to check which items are already saved in Core Data from a given array如何检查给定数组中哪些项目已保存在 Core Data 中
【发布时间】:2019-12-28 01:21:23
【问题描述】:

我的目标是

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

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

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

假设用户输入了 “Te”。我需要在表格视图中显示Teja,Teja 二,Teja Ri

我已经做了一切。但我无法从数组中仅获取 Teja, Teja two, 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”(用户在文本文件中输入)

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

我哪里做错了?

【问题讨论】:

  • 第一个评论,你真的需要核心数据吗?数据是静态的(或者这只是一个简化的示例?)其次,如果数组中没有太多元素,如何将其存储为逗号分隔的字符串?
  • 一种方法是您可以使用带有 BEGINSWITH NSPredicate(format: "name BEGINSWITH[c] %@", searchKeyword) 的谓词并将谓词设置为获取请求,然后您就可以开始了。
  • 你可以print(filteredData.map{$0.names})看看你是否得到了你需要的所有数据。
  • 我认为你不需要将它存储为一个数组,它可以只是一个单一的条目字符串,每个字符串都会是一个新的 searchList 项
  • 当您注意到“以下行不工作”时,您究竟是什么意思?终端窗口中是否报告了错误? filteredData 的值是多少?另外,你为什么要明确解开filteredData?您是否尝试过var filteredData = data as? [SearchList],然后在您的.filter 通话中使用if let wasfilteredData...

标签: ios swift iphone core-data iphonecoredatarecipes


【解决方案1】:

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

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

也许你想要:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多