簡體   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