我有三个班级,Folder
,Object
& 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
列表创建默认值时,机构是否知道我的错误?
答案 0 :(得分:2)
只有当您的Realm中存储的IncrementaID
个对象发生更改时,Milestone
函数返回的值才会更改。您的代码包含一个循环,该循环创建多个Item
实例并将其id
属性初始化为IncrementaID
返回的值。在调用之间,Realm中不会创建或存储Milestone
个对象,因此所有Item
个对象都以相同的ID结束。
我的建议:使用UUID的字符串表示形式作为主键,而不是尝试管理像这样的唯一整数。