我怎样才能正确地将对象从一个Realm对象复制到另一个对象

基于下面的代码,我希望能够从现有的创build一个新的ItemList 。 换句话说,我有一个名为First ListItemList ,我想创build一个新的ItemList ,将其称为Second List ,并用First ListItem填充它。

我现在的做法是按预期创buildSecond ListSecond List显示的First ListItem ,但是不工作的是当我只想从First List删除Item ,删除Item来自两个列表。 我想我并没有真正的复制这些项目。

所以问题是,我怎么能从第First List复制ItemSecond 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 ListSecond 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:)