首页 文章

Realm和Parse集成:如何保存领域

提问于
浏览
2

我正在尝试为我的应用程序创建一个bundle域 . 我认为应该很简单 . 由于我已经在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教程,它们实际上很简单 . 那么,我做错了什么?

Update

所以,我更新了我的代码,使其尽可能简单/可读 . 我有一个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]的非法递归调用 . 注意:不能使用Realm的查询结果预先填充Swift对象类的属性

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

3 回答

  • 0

    关于您的 RealmSwift 代码:您已正确实施 .

    当你在swift中声明一个领域时,它是 Object 类的子类 . 类似地,对于解析它是 PFObject 的子类 .

    You custom class have to have only one base class. 所以不能使用Parse和Realm两个库的功能 .

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

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

    Why you want to use both Parse and Realm ? parse also provides local data store 只需在appDelegate中编写 Parse.enableLocalDatastore() 之前

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

    实际上我发现了什么是错的:因为我怀疑这是一个愚蠢的错误,我班上的一些属性是UIImage类型,而且Realm不能用这种类型(即使我不想把这个类的对象放入领域) . 所以,我的坏 . 我有点尴尬,但不会删除我的问题,因为来自Realm的错误消息在这种情况下不是很容易理解

  • 0

    您的Realm Swift代码似乎很好 . 在使用 (_:value:update:) 创建对象时,Realm非常灵活,能够接收支持下标的任何类型的对象 . 因此,如果模式匹配,您甚至可以直接插入 PFObject .

    问题似乎是你如何填充 allUserContainers 数组 . 如错误所示,您无法从Realm中获取Realm Object ,然后尝试以这种方式重新添加它 . 如果你需要再次提供整个对象 .

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

    旁注:您可能不需要将Realm属性定义为隐式解包 . 这是推荐的模式:

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

相关问题