我怎样才能正确地将对象从一个Realm对象复制到另一个对象
基于下面的代码,我希望能够从现有的创build一个新的ItemList
。 换句话说,我有一个名为First List
的ItemList
,我想创build一个新的ItemList
,将其称为Second List
,并用First List
的Item
填充它。
我现在的做法是按预期创buildSecond List
, Second List
显示的First List
的Item
,但是不工作的是当我只想从First List
删除Item
,删除Item
来自两个列表。 我想我并没有真正的复制这些项目。
所以问题是,我怎么能从第First List
复制Item
到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() }
从First List
创buildSecond List
代码
这工作正常,它创buildSecond 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) }
此代码应该只删除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!) } }
你想要做的是使用:
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方法是从Objectinheritance的。 它告诉目标创build一个新的对象。 如果您想要查看是否有已经存在的logging,请使用true,如果有,则更新它。 PostModel是对象types,logging是你想要复制的。
编辑:我添加了if语句以提供更多上下文。 你没有显示你的类定义,所以我猜测。 这是一个工作的例子。 我从DatabaseA请求一组logging并将其复制到DatabaseB(postsDB到combinedDB)。
所以,如果你试图插入的对象的types是一个列表,我build议你定义一个对象的子类,至less有你需要作为一个属性的列表。
class TagList: Object { dynamic var tag = "" var list = List<PostModel>() override class func primaryKey() -> String? { return "tag" } }
完整的工作示例说明:创build新对象,将所有对象复制到第二个列表中,复制后从第二个列表中删除,添加到第一个列表中(没有从中删除任何内容。
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; } ); }
你真的想要创build你的项目的副本,或者你只是想能够独立从列表中删除它们?
当你这样做时:
newList.items.append(objectsIn: itemsFromFirstList)
你最终将在两个列表中的相同的对象 。 List<T>
只是存储对领域内的对象的引用。 将一个对象附加到List
只是引用了现有的对象,它不会复制该对象。
当你调用Realm.delete(_:)
你完全从Realm中删除了这个对象,而不是从它所属的单个列表中删除。 要从List
移除一个对象,应该使用List.remove(objectAtIndex:)
。