尝试使用现有主键值“1”创建“Item”类型的对象

时间:2018-01-09 16:52:08

标签: ios swift realm

我有三个班级,FolderObject& Item

对于每个Folder,都有一个objects列表,对于每个Object,都应该有一个items列表。但是,在使用默认列表Object创建items时,我收到以下错误;

  

***由于未捕获的异常“RLMException”而终止应用程序,原因是:'尝试使用现有的'Item'创建类型的对象   主键值'1'。'

对于每个类,我都有一个对所有对象进行计数并递增ID的函数,这样可以正常工作,但是如何将Item添加到Object.items列表属性中一定有问题。

物品

class Item: Object {

@objc dynamic var id: Int = 0
@objc dynamic var object: Object?

@objc dynamic var title: String = ""

override static func primaryKey() -> String? {
    return "id"
}

func IncrementaID() -> Int{
    let realm = try! Realm()

    var num = 1

    let allItems = realm.objects(Milestone.self)
    if allItems.count >= 1 {
        num = allItems.count + 1
    }

    return num
}


}

创建Object时,我也尝试创建Item以附加到对象items属性,如此

 func addObjectToFolder(_ title: String, folder: Folder) {


    let object = Object()

    object = object.IncrementaID()

    object.title = title


    let defaultList = ["1", "2", "3", "4", "5"]

    for i in defaultList {

        let item = Item()

        item.id = item.IncrementaID()

        item.title = i

        object.items.append(item)
    }

    try! realm.write {
        folder.objects.append(object)
    }

}

在为Objects.items列表创建默认值时,机构是否知道我的错误?

1 个答案:

答案 0 :(得分:2)

只有当您的Realm中存储的IncrementaID个对象发生更改时,Milestone函数返回的值才会更改。您的代码包含一个循环,该循环创建多个Item实例并将其id属性初始化为IncrementaID返回的值。在调用之间,Realm中不会创建或存储Milestone个对象,因此所有Item个对象都以相同的ID结束。

我的建议:使用UUID的字符串表示形式作为主键,而不是尝试管理像这样的唯一整数。