我正在尝试为我的应用程序创建一个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(这会给我一条错误消息&#34; 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
&#34;):
//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教程,它们实际上很简单。那么,我做错了什么?
更新
因此,我更新了我的代码,使其尽可能简单/可读。我有一个狗课,我正试图从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
}
错误信息仍然相同:
由于未捕获的异常终止应用&#39; RLMException&#39;,原因: &#39; + [RLMSchema sharedSchema]的非法递归调用。注意:属性 Swift
Object
类的类不能预先填充查询 领域的结果
我相信我对Realm的工作方式有一些全球性的误解,因为它的配置非常简单。
答案 0 :(得分:0)
关于您的RealmSwift
代码:您已正确实施。
当你在swift中声明一个领域时,它是Object
类的子类。类似地,对于解析它是PFObject
的子类。
您的自定义类必须只有一个基类。因此不能使用Parse和Realm库的功能。
如果你必须同时使用Parse和Realm,you need to declare two different classes like RealmMessage and ParseMessage
。
从解析和复制属性中检索ParseMessage的数据到RealmMessage。
为什么要同时使用Parse和Realm?
解析还提供了本地数据存储,只需在appDelegate中编写 Parse.enableLocalDatastore()
Parse.setApplicationId("key",
clientKey: "key")
答案 1 :(得分:0)
您的Realm Swift代码似乎很好。使用(_:value:update:)
创建对象时,Realm非常灵活,能够接受支持下标的任何类型的对象。因此,如果模式匹配,您甚至可以直接插入PFObject
。
问题似乎在于您如何填充allUserContainers
数组。如错误所示,您无法从Realm中获取Realm Object
,然后尝试以这种方式重新添加它。如果您尝试更新Realm中已有的对象,只要主键属性匹配,您就不需要再次提供整个对象。
您能否重温一下allUserContainers
变量填充方式的逻辑,如果您无法修复,请将代码发布到您的问题中?
旁注:您可能不需要将Realm属性定义为隐式解包。这是推荐的模式:
class RealmContainer : Object {
dynamic var rContainerId = ""
dynamic var rContainerName = ""
}
答案 2 :(得分:0)
实际上我发现了什么是错的:因为我怀疑这是一个愚蠢的错误,我班上的一些属性是UIImage类型,而且Realm不能使用这种类型(即使我不想放置对象这个班级进入境界)。所以,我的坏。我有点尴尬,但不会删除我的问题,因为来自Realm的错误消息在这种情况下不是很容易理解