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 视图数据源委托方法以改为使用此数据。
希望对您有所帮助。
我在过滤领域数据库时遇到问题。我搜索电影名称并将值写入领域数据库 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 视图数据源委托方法以改为使用此数据。
希望对您有所帮助。