如何将0索引处的项插入到Realm容器中

时间:2017-04-18 11:38:31

标签: ios swift realm

有没有办法在{0}索引处插入新项目到Realm容器?我在Realm课程中没有看到插入方法。

我需要使用List吗?如果答案是肯定的,我如何重构以下代码以便能够使用List并使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) 
    }

2 个答案:

答案 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")
}

第一个你必须自己更新以分配优先级,第二个将自动更新