繁体   English   中英

领域和解析集成:如何保存领域

[英]Realm and Parse integration: how to save the realm

我正在尝试为我的应用程序创建一个捆绑软件领域。 我认为应该很简单。 由于我已经在Parse中拥有所有需要的记录,因此我只需要:

  • 创建领域模型和对象
  • 将解析记录加载到领域对象
  • 保存领域

因此,我创建了两个领域模型:

class RealmContainer : Object {
    dynamic var rContainerId: String! //should be equal objectId from Parse
    dynamic var rContainerName: String! //should be equal "name" field from Parse
  ...
    var messages = List<RealmMessage>()

    override static func primaryKey() -> String? {
        return "rContainerId"
    }
}

class RealmMessage : Object {
    dynamic var rMessageId: String!
    ...
    dynamic var rParentContainer: RealmContainer!
}

从Parse获取结果似乎是可行的。 而且我的境界对象也不错

    var allUserContainers: [RealmContainer] = [] 

我能够用Parse中的值填充此数组。 但是,当我尝试保存此领域时,我得到的是a)无或b)错误消息

我的代码(这个一无所获):

let realm = try! Realm()
try! realm.write {
    realm.add(self.allUserContainers[0])
    print(Realm().path)
    print(realm.path)
    }

我的代码(这个也不会得到):

let realm = try! Realm()
try! realm.write {
    realm.create(RealmContainer.self, value: self.allUserContainers[0], update: true)
    print(Realm().path)
    print(realm.path)
    }

我的代码3(这将使我收到一条错误消息“ Terminating app due to uncaught exception 'RLMException', reason: 'Illegal recursive call of +[RLMSchema sharedSchema]. Note: Properties of Swift Object classes must not be prepopulated with queried results from a Realm “):

//from firstViewController, realm is a global variable
let realm = try! Realm()

//another swift module
    try! realm.write {
        realm.create(RealmContainer.self, value: self.allUserContainers[0], update: true)
        print(Realm().path)
        print(realm.path)
        }

显然,我不太了解它应该如何工作,但是我尝试了一些swift / realm教程,它们实际上很简单。 那么,我做错了什么?

更新

因此,我更新了代码,使其尽可能简单/易读。 我有一个Dog课程,我正在尝试从Parse获取Dogs并将它们放到Realm。

AppDelegate.swift

let realm = try! Realm() //global

Dog.swift

class Dog : Object {
    dynamic var name = ""
    dynamic var age = 0
}

User.swift(getDogs和putDogs函数)

class User {
    var newDogs:[Dog] = []
...

func getDogs() {
    self.newDogs = []

    let dogsQuery = PFQuery(className: "Dogs")
    dogsQuery.limit = 100
    dogsQuery.findObjectsInBackgroundWithBlock { (currentModes, error) -> Void in
        if error == nil {

            let tempModes:[PFObject] = currentModes as [PFObject]!

            for var i = 0; i < tempModes.count; i++ {
                let temp = Dog()
                temp.name = currentModes![i]["dogName"] as! String
                self.newDogs.append(temp)

            }

        } else {
            print("something happened")
        }
        }
}

...

func putDogs() {

    print(self.newDogs.count)
    try! realm.write({ () -> Void in
        for var i = 0; i < newDogs.count; i++ {
            realm.add(newDogs[i])
        }

    })
        try! realm.commitWrite() //doesn't change anything
    }

错误消息仍然相同:

由于未捕获的异常“ RLMException”而终止应用程序,原因:“ + [RLMSchema sharedSchema]的非法递归调用。 注意:不能使用来自领域的查询结果预填充Swift Object类的属性

我相信我对Realm的工作方式有一些全局性的误解,因为它的配置非常简单。

关于您的RealmSwift代码:您已正确实现了它。

快速声明一个领域类时,它是Object类的子类。 同样,对于解析,它是PFObject的子类。

您的自定义类必须只有一个基类。 因此,不能同时使用库Parse和Realm的功能。

如果必须同时使用Parse和Realm,则you need to declare two different classes like RealmMessage and ParseMessage

从解析和复制属性到RealmMessage检索ParseMessage的数据。

为什么要同时使用Parse和Realm? 通过仅在Parse.enableLocalDatastore()编写Parse.enableLocalDatastore()之前, parse还可提供本地数据存储

Parse.setApplicationId("key",
            clientKey: "key")

您的Realm Swift代码看起来不错。 使用(_:value:update:)创建对象时,Realm非常灵活,因为它可以接受支持下标的任何类型的对象。 因此,如果架构匹配,您甚至可以直接插入PFObject

问题似乎在于您如何填充allUserContainers数组。 如错误所述,您无法从Realm获取Realm Object ,然后尝试以这种方式重新添加它。 如果您试图更新Realm中已经存在的对象,只要主键属性匹配,就不需要再次提供整个对象。

您能否重温一下如何填充allUserContainers变量的逻辑,如果无法解决该问题,请将代码发布到您的问题中?

旁注:您可能也不需要将Realm属性定义为隐式展开。 这是推荐的模式:

class RealmContainer : Object {
    dynamic var rContainerId = ""
    dynamic var rContainerName = ""
}

实际上,我发现了问题所在:因为我怀疑这是一个愚蠢的错误,我类中的某些属性是UIImage类型,而Realm不能使用该类型(即使我不打算将此类的对象放入领域)。 所以,我不好。 我对此感到有些尴尬,但不会删除我的问题,因为在这种情况下,来自Realm的错误消息不是很容易理解

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM