Swift: 如何查找包含自定义字符串的 Realm 数据库

Swift: How to find Realm database contains custom string

我在过滤领域数据库时遇到问题。我搜索电影名称并将值写入领域数据库 Json。写入后,我分配给 tableview 单元格以显示结果。在第二次搜索中,由于从数据库中获取所有结果,我总是得到相同的值。我需要从数据库中过滤新值并设置为 tableview。请帮助我!

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    self.counter = 0
    aranacak_kelime = searchBar.text!
    let url = URL(string: "https://www.omdbapi.com/?s=" + aranacak_kelime + "&apikey=c6e----")
    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
        if(error != nil)
        {
            print("error")
        }
        else{
            if let content=data
            {
                    do
                    {
                        let json = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableLeaves) as AnyObject
                        if let search = json["Search"] as? [NSDictionary]
                        {
                            DispatchQueue(label: "background").async {
                                             autoreleasepool {
                            let realm = try! Realm()
                 print(Realm.Configuration.defaultConfiguration.fileURL)
                            for result in search
                            {
                               let movie = Movie()
                               movie.name = result["Title"] as! String
                               movie.type = result["Type"] as! String
                               movie.year = result["Year"] as! String
                               movie.poster = result["Poster"] as! String

                           try! realm.write {
                               realm.add(movie)
                           }
                           self.counter += 1
                           DispatchQueue.main.async {self.tableView.reloadData()}
                          }
                    }
           }
       }   
  }
  catch{
   print("error in JSONSerialization")
      }                   
 }
}}task.resume()}

和表视图

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "textCell", for: indexPath) as! TableViewCell
    let row = indexPath.row
    let realm = try! Realm()

    //let results = realm.objects(Movie.self).filter("ANY name.contains('aranacak_kelime')")

    let results = realm.objects(Movie.self)
    cell.movieName.text = results[row].name
    cell.movieYear.text = results[row].year
    cell.movieType.text = results[row].type
    let imageUrl = results[row].poster
}

和我的电影class

class Movie: Object{
@objc dynamic var name:String = ""
@objc dynamic var type:String = ""
@objc dynamic var year:String = ""
@objc dynamic var poster:String = ""
}

据我了解,您有几个问题。如果您两次搜索同一部电影,您将把相同的结果保存到您的领域数据库中。所以也许使用某种 ID 并在保存时使用 realm.add(movie, update: true) 这将防止将同一部电影存储两次。 另一个问题是您没有过滤在 table 视图上加载的结果。

您应该有一个辅助方法,您可以在重新加载 table 视图之前使用搜索栏文本过滤结果,例如:

func reloadContent() { self.data = realm.objects(Movie.self).filter("ANY name.contains(YOUR_SEARCHBAR.text)") self.tableView.reloadData() }

您应该将此行 DispatchQueue.main.async {self.tableView.reloadData()} 更改为 DispatchQueue.main.async {self.reloadContent()}

最后有一个 属性 of var data: Results<Movie>?,您将在其中存储过滤后的电影。您将不得不更改 table 视图数据源委托方法以改为使用此数据。

希望对您有所帮助。