[英]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.