2017-08-15 9 views
3

私はレルムに直近で、私のプロジェクトでレルムを使用しようとしています。ここでは、JSONを解析して領域を使用して保存しようとしています。結果の配列エラーがレルムと結果の操作JSON

を発生して、私はループにしようとしているときに「書き込みトランザクションの外でオブジェクトを変更しようとする - 最初のRLMRealmインスタンス上beginwritetransactionを呼び出す」これはJSONの結果である

を:

{"data":[{"id":1,"parent_id":0,"name":"JenniferMaenle","title":"Ms","phone":"","address":"Toled, ohio","email":"[email protected]","image":"44381525_2017.jpg","relation_id":5,"created_at":null,"updated_at":"2017-08-10 02:30:05"},{"id":2, "parent_id":1,"name":"Khadeeja","title":"","phone":"","address":"","email":"","image":"Khadeeja_2017-07-17.jpg","relation_id":2,"created_at":null,"updated_at":"2017-07-17 08:3:12"}]} 

JSONを解析してRealmデータベースに保存しようとしています。ここに私の試みは、次のとおりです。

class Person: Object { 

dynamic var name = "" 
dynamic var title = "" 
dynamic var address = "" 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.add() 

} 

func add(){ 

    guard let data = dataFromFile("ServerData") else { return } 

    let persons = Person() 

    do { 

     if let json = try JSONSerialization.jsonObject(with: data) as? [String: AnyObject] { 

      if let data = json["data"] as? [[String:AnyObject]]{ 

       for eachItem in data{ 
        persons.name = eachItem["name"] as! String 
        persons.title = eachItem["title"] as! String 
        persons.address = eachItem["address"] as! String 

        try! realm.write { 
         realm.add(persons) 
        } 
       } 

      } 
     } 
    } catch { 

     print("Error deserializing JSON: \(error)") 
    } 
} 

答えて

2

personsオブジェクトを変更してもう一度領域に追加しないでください。レルムに人を追加し、再びfor eachItem in dataの2番目の反復で人を編集するために表示されるエラーです。 Personsはすでにこの繰り返しでレルムに追加されており、レルム書き込みトランザクション外の新しい名前を付けようとします。そのため、エラーが表示されます。すべての人に新しいオブジェクトを作成する方がよいでしょう。

func add(){ 
    guard let data = dataFromFile("ServerData") else { return } 

    do { 
     if let json = try JSONSerialization.jsonObject(with: data) as? [String: AnyObject] { 
      if let data = json["data"] as? [[String:AnyObject]]{ 
       for eachItem in data{ 
        let persons = Person() 
        persons.name = eachItem["name"] as! String 
        persons.title = eachItem["title"] as! String 
        persons.address = eachItem["address"] as! String 

        try! realm.write { 
         realm.add(persons) 
        } 
       } 

      } 
     } 
    } catch { 
     print("Error deserializing JSON: \(error)") 
    } 
} 
+1

ありがとうございました@Yannick Working perfect :) –

2

エラーが示すように、あなたは書き込みの内部でトランザクションをプリフォームする必要があり、

一つのオプションは、個別に各人物を書き込むようにします

for eachItem in data{ 
    let person = Person() 
    person.name = eachItem["name"] as! String 
    person.title = eachItem["title"] as! String 
    person.address = eachItem["address"] as! String 

    try! realm.write { 
     realm.add(person) 
    } 
} 

2番目のオプションは、さオブジェクトを作成してから次のように記述します。

for eachItem in data{ 
    let person = Person(); 
    person.name = eachItem["name"] as! String 
    person.title = eachItem["title"] as! String 
    person.address = eachItem["address"] as! String 
    persons.add(person) 
} 
try! realm.write { 
    realm. append(persons) 
} 

これにはほとんど変更を加えないでください。これがアイデアです。