根据以下代码,我希望能够从现有代码创建新的ItemList
。换句话说,我有一个名为First List
的{{1}},我想创建一个新的ItemList
,将其称为Second List
,然后填写Item
来自First List
{1}}。
我现在拥有它的方式是它按照预期Second List
创建Item
来自First List
Second List
中的Item
但是什么不是我的工作是当我只想从First List
中删除Item
时,它会从两个列表中删除Item
。我想我并没有真正复制这些物品。
问题是,如何将First List
从Second List
复制到class ItemList: Object {
dynamic var listName = ""
dynamic var createdAt = NSDate()
let items = List<Item>()
}
class Item:Object{
dynamic var productName:String = ""
dynamic var createdAt = NSDate()
}
?
Second List
First List
Second List
的代码
此工作正常,它会创建First List
并添加Second List
中的项目,但我不认为我只是在 let newList = ItemList()
newList.listName = "Second List"
if let selectedList = realm.objects(ItemList.self).filter("listName = %@", "First List").first{
let itemsFromFirstList = selectedList.items
newList.items.append(objectsIn:itemsFromFirstList)
}
try! realm.write {
realm.add(newList)
}
中制作副本。< / p>
First List
First List
这实际上会删除Second List
和 let listToDelete = realm.objects(ItemList.self).filter("listName = %@", "First List").first
try! realm.write {
for item in (listToDelete?.items)! {
realm.delete(realm.objects(Item.self).filter("productName = %@", item.productName).first!)
}
}
highlight
答案 0 :(得分:1)
您要做的是使用:
for record in postsDB.objects(PostModel.self) {
if !combinedDB.objects(PostModel.self).filter("postId == \(record.parentId)").isEmpty {
combinedDB.create(PostModel.self, value: record, update: false)
}
}
create方法继承自Object。它告诉目标创建一个新对象。如果您希望它查看是否已有记录,请使用true,如果有,则更新它。 PostModel是Object类型,记录是你想要复制的。
编辑:我添加了if语句以提供更多上下文。你没有显示你的课程定义,所以我猜。这是一个有效的例子。我要求DatabaseA提供一组记录并将其复制到DatabaseB(postsDB到combinedDB)。
因此,如果您要插入的对象的类型是List,我建议您定义Object的子类,并至少包含您需要的列表作为属性。
class TagList: Object {
dynamic var tag = ""
var list = List<PostModel>()
override class func primaryKey() -> String? {
return "tag"
}
}
完整的工作示例说明:创建新对象,将所有对象复制到第二个列表,复制后从第二个列表中删除,添加到第一个列表(没有从中删除任何内容。
import Foundation
import RealmSwift
class Letter: Object {
dynamic var letter = "a"
}
class Letters: Object {
var letterList = List<Letter>()
}
class ListExample {
let listRealmStore = try! Realm() // swiftlint:disable:this force_try
func testThis() {
print(Realm.Configuration.defaultConfiguration.fileURL!)
listRealmStore.beginWrite()
addSingleItems() // add 3 objects to the DB
let firstList = Letters()
let allObjects = listRealmStore.objects(Letter.self)
for item in allObjects {
firstList.letterList.append(item)
}
let secondList = Letters()
let itemsToCopy = firstList.letterList
for item in itemsToCopy {
let obj = listRealmStore.create(Letter.self)
obj.letter = item.letter
secondList.letterList.append(obj)
}
let third = Letter()
third.letter = "Z"
listRealmStore.add(third)
firstList.letterList.append(third)
secondList.letterList.removeLast()
do {
try listRealmStore.commitWrite()
} catch let error {
print("couldn't commit db writes: \(error.localizedDescription)")
}
print("list one:\n\(firstList)")
print("list two:\n\(secondList)")
}
func addSingleItems() {
for letter in ["a", "b", "c"] {
let objectToInsert = Letter()
objectToInsert.letter = letter
listRealmStore.add(objectToInsert)
}
}
}
Results in:
list one:
Letters {
letterList = List<Letter> (
[0] Letter {
letter = a;
},
[1] Letter {
letter = b;
},
[2] Letter {
letter = c;
},
[3] Letter {
letter = Z;
}
);
}
list two:
Letters {
letterList = List<Letter> (
[0] Letter {
letter = a;
},
[1] Letter {
letter = b;
}
);
}
答案 1 :(得分:1)
您是否真的想要创建商品的副本,或者您是否希望能够独立地从列表中删除它们?
当你这样做时:
newList.items.append(objectsIn: itemsFromFirstList)
最终,两个列表中的相同对象结束。 List<T>
只存储对Realm中对象的引用。将对象附加到List
只引用现有对象,它不会复制该对象。
当您调用Realm.delete(_:)
时,您完全从Realm中删除该对象,而不仅仅是从它所属的单个列表中删除该对象。要从List
中删除对象,您应该使用List.remove(objectAtIndex:)
。