有没有办法在0索引处插入新项目到Realm容器?我没有在Realm类中看到insert方法. 我需要使用列表吗?如果答案是肯定的,我如何重构以下代码以便能够使用列表并使List与Realm容器保持同步
我需要使用列表吗?如果答案是肯定的,我如何重构以下代码以便能够使用列表并使List与Realm容器保持同步.换句话说,在添加和删除时,我很难想出一个很好的方法来保持Realm容器和List具有相同的项目.
在以下代码中,在最后一个索引处输入新项目.如何重组它以便能够在0索引处插入项目?
模型类
import RealmSwift class Item:Object { dynamic var productName = "" }
主ViewController
let realm = try! Realm() var items : Results<Item>? var item:Item? override func viewDidLoad() { super.viewDidLoad() self.items = realm.objects(Item.self) } func addNewItem(){ item = Item(value: ["productName": productNameField.text!]) try! realm.write { realm.add(item!) } } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.items!.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "reusableCell", for: indexPath) let data = self.items![indexPath.row] cell.textLabel?.text = data.productName return cell } func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == UITableViewCellEditingStyle.delete{ if let item = items?[indexPath.row] { try! realm.write { realm.delete(item) } tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic) } } }
理想情况下,这是我想在addNewItem()方法中插入新项目时能够做到的…
item = Item(value: ["productName": inputItem.text!]) try! realm.write { realm.insert(item!, at:0) }添加一个sortedIndex整数属性,允许您手动控制对象的排序,这绝对是在Realm中订购对象的更常用的方法之一,但它效率很低.为了将对象插入0,您需要遍历每个其他对象并将其排序数增加1,这意味着您最终需要触摸数据库中该类型的每个对象才能执行此操作.
这种实现的最佳实践是创建另一个包含List属性的Object模型子类,在Realm中保留它的一个实例,然后将每个对象添加到该属性.列表属性的行为与普通数组类似,因此可以非常快速有效地按以下方式排列对象:
import RealmSwift class ItemList: Object { let items = List<Item>() } class Item: Object { dynamic var productName = "" } let realm = try! Realm() // Get the list object let itemList = realm.objects(ItemList.self).first! // Add a new item to it let newItem = Item() newItem.productName = "Item Name" try! realm.write { itemList.items.insert(newItem, at: 0) }
然后,您可以直接使用ItemList.items对象作为表视图的数据源.