如何将对象从一个Realm对象正确复制到另一个对象

时间:2017-05-02 01:13:59

标签: ios swift realm

根据以下代码,我希望能够从现有代码创建新的ItemList。换句话说,我有一个名为First List的{​​{1}},我想创建一个新的ItemList,将其称为Second List,然后填写Item来自First List {1}}。

我现在拥有它的方式是它按照预期Second List创建Item来自First List Second List中的Item但是什么不是我的工作是当我只想从First List中删除Item时,它会从两个列表中删除Item。我想我并没有真正复制这些物品。

问题是,如何将First ListSecond 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

2 个答案:

答案 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:)