有没有办法在{0}索引处插入新项目到Realm
容器?我在Realm
课程中没有看到插入方法。
我需要使用List
吗?如果答案是肯定的,我如何重构以下代码以便能够使用List
并使List与Realm
容器保持同步。换句话说,在添加和删除时,我很难想出一个让Realm
容器和List
具有相同项目的好方法。
在以下代码中,在最后一个索引处输入新项目。如何重组它以便能够在0索引处插入项目?
import RealmSwift
class Item:Object {
dynamic var productName = ""
}
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)
}
}
}
item = Item(value: ["productName": inputItem.text!])
try! realm.write {
realm.insert(item!, at:0)
}
答案 0 :(得分:4)
添加sortedIndex
整数属性,允许您手动控制对象的排序,这绝对是在Realm中订购对象的更流行的方法之一,但它效率很低。为了将对象插入0,您需要遍历每个其他对象并将其排序数增加1,这意味着您最终需要触摸数据库中该类型的每个对象。为了做到这一点。
此类实现的最佳实践是创建另一个包含Object
属性的List
模型子类,在Realm中保留它的一个实例,然后将每个对象添加到该属性中。 List
属性的行为与普通数组类似,因此可以非常快速有效地按顺序排列对象:
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
对象作为表格视图的数据源。
答案 1 :(得分:3)
他们至少有两种方法可以做到这一点:
您可以在班级for.ex中手动添加优先级作为数字:
class Task: Item {
dynamic var something = ""
dynamic var priority = 0
}
添加到领域:
//you can make priority 2,3,4 etc - 0 will be at the top
let task = Task(something: "Something", priority: 0)
并在检索对象后:
var tasks: Results<Task>!
viewdidLoad(){
let realm = try! Realm()
tasks = realm.objects(Task.self).sorted(byKeyPath: "priority")
}
或者你可以这样做日期:
class Task: Item {
dynamic var something = ""
dynamic var created = Date()
override class func indexedPriority() -> [String]{
return ["created"]
}
}
添加到领域:
let task = Task(something: "Something")
并在检索对象后:
var tasks: Results<Task>!
viewdidLoad(){
let realm = try! Realm()
tasks = realm.objects(Task.self).sorted(byKeyPath: "created")
}
第一个你必须自己更新以分配优先级,第二个将自动更新