2016-04-11 13 views
1

Ich bin neu in Realm und habe Probleme beim Speichern von JSON-Daten aus WebService in meiner Realm-Datenbank.Daten von JSON in Realm speichern

Dies ist die JSON:

{ 
    "Programacao":[ 
     { 
     "Dia":"5", 
     "Idp":"1833", 
     "Programa":"T\u00e1 Na Hora", 
     "Inicio":"06:00", 
     "Final":"08:00", 
     "Data":"08\/04\/2016" 
     }, 
     { 
     "Dia":"5", 
     "Idp":"1834", 
     "Programa":"Bom dia Chiru", 
     "Inicio":"08:00", 
     "Final":"09:00", 
     "Data":"08\/04\/2016" 
     }, 
     { 
     "Dia":"5", 
     "Idp":"1835", 
     "Programa":"Conex\u00e3o", 
     "Inicio":"09:00", 
     "Final":"11:00", 
     "Data":"08\/04\/2016" 
     }, 
     { 
     "Dia":"5", 
     "Idp":"1836", 
     "Programa":"As Mais Pedidas", 
     "Inicio":"11:00", 
     "Final":"12:00", 
     "Data":"08\/04\/2016" 
     }, 
     { 
     "Dia":"5", 
     "Idp":"1837", 
     "Programa":"Casa da Sogra", 
     "Inicio":"12:00", 
     "Final":"13:00", 
     "Data":"08\/04\/2016" 
     }, 
     { 
     "Dia":"5", 
     "Idp":"1838", 
     "Programa":"Canal Livre", 
     "Inicio":"13:00", 
     "Final":"15:00", 
     "Data":"08\/04\/2016" 
     }, 
     { 
     "Dia":"5", 
     "Idp":"18", 
     "Programa":"Batid\u00e3o da Chiru", 
     "Inicio":"15:00", 
     "Final":"17:00", 
     "Data":"08\/04\/2016" 
     }, 
     { 
     "Dia":"5", 
     "Idp":"1827", 
     "Programa":"Sul Bandas", 
     "Inicio":"17:00", 
     "Final":"19:00", 
     "Data":"08\/04\/2016" 
     }, 
     { 
     "Dia":"5", 
     "Idp":"1828", 
     "Programa":"Voz do Brasil", 
     "Inicio":"19:00", 
     "Final":"20:00", 
     "Data":"08\/04\/2016" 
     }, 
     { 
     "Dia":"5", 
     "Idp":"1831", 
     "Programa":"Al\u00f4 Chiru", 
     "Inicio":"20:00", 
     "Final":"23:59", 
     "Data":"08\/04\/2016" 
     } 
    ] 
} 

ich die folgende Struktur erstellt haben:

Realm Objektklasse:

import Foundation 
import RealmSwift 

class ROListing: Object {  // Programação da Rádio 

    dynamic var id    = 0 

    dynamic var showName  = "" 
    dynamic var showId   = "" 

    dynamic var showStartTime = "" 
    dynamic var showEndTime  = "" 

    dynamic var showNumericDate = "" 
    dynamic var showDate  = "" 

    override static func primaryKey() -> String? { 
    return "id" 
    } 

} 

Objektmanipulation Klassen:

import Alamofire 
import SwiftyJSON 
import Foundation 

class Listing: ResponseJSONObjectSerializable { 

    var showName  :String? // nomePrograma 
    var showId   :String? // idp 

    var showStartTime :String? // inicioPrograma 
    var showEndTime  :String? // finalPrograma 

    var showNumericDate :String? // dia 
    var showDate  :String? // data 

    required init?(json: JSON) { 

    self.showName   = json["Programa"].string 
    self.showId   = json["Idp"].string 

    self.showStartTime = json["Inicio"].string 
    self.showEndTime  = json["Final"].string 

    self.showNumericDate = json["Dia"].string 
    self.showDate   = json["Data"].string 

    } 

    required init() { } 
} 

class ListingArray: ResponseJSONObjectSerializable { 

    var showArray: [Listing]?  // Programacao 

    required init?(json: JSON) { 

    if let arrayJson = json["Programacao"].array { 
     self.showArray = [] 

     for json in arrayJson { 
     let instance = Listing(json: json) 
     self.showArray?.append(instance!) 
     } 

    } 

    } 

    required init() { } 
} 

Verbindung mit it dem WebService durch:

func getRadioListing(success:() ->()) { 

    guard let url = apiController.createURLWithComponentsForListingsWith(appId: "63") else { 
     print("Invlaid URL!") 
     return 
    } 

    print(url) 

    Alamofire.request(.GET, url).responseObject { 
     (response: Response<ListingArray, NSError>) in 

     if let jsonResults = response.result.value { 
     self.listings = jsonResults 

     for listing in self.listings.showArray! { 
      RealmObjectManager.sharedInstance.createUpdateDB(withListing: listing) 
     } 

     success() 

     } else { 
     print("Error parsing JSON!") 
     return 
     } 
    } 

    } 

Und schließlich, das Verfahren zum tatsächlich die Objekte in die Realm DB speichern.

func createUpdateDB(withListing listing: Listing) { 

    print(Realm.Configuration.defaultConfiguration.path!) 

    if self.listingArray.count == 0 { 

     do { 

     try self.realm.write { 

      let newListing = ROListing() 

      newListing.showName = listing.showName! 
      newListing.showId = listing.showId! 

      newListing.showStartTime = listing.showStartTime! 
      newListing.showEndTime = listing.showEndTime! 

      newListing.showNumericDate = listing.showNumericDate! 
      newListing.showDate = listing.showDate! 

      self.realm.add(newListing) 
     } 

     } catch let error as NSError { 
     print("Error creating Listing DB: \(error.userInfo)") 
     } 
    } 
    } 

Allerdings kann ich nicht alle Shows in die DB bekommen. Jeder könnte mir hier helfen?

Vielen Dank im Voraus!

+0

Cole vielleicht schon das Problem hier genagelt hat, aber nur für den Fall, können Sie bitte Welches Fehlerprotokoll bekommst du, wenn du versuchst alle Shows einzufügen? Vielen Dank! – TiM

+0

Ja, es ist ein Problem mit meiner Logik! Ich bekomme keinen Fehler, aber nur das erste Element [0] wird gespeichert. Ich denke, ich muss zuerst überprüfen, ob mein listingArray leer ist (oder nil?) Und dann den Schreibvorgang ausführen. Danke Cole Campbell. – acmobile

Antwort

1

Ich kann nicht sicher ohne das Fehlerprotokoll sagen, aber es scheint, dass Sie ein Problem aufgrund Ihres Primärschlüssels haben werden. Realm erzwingt die Eindeutigkeit für den Primärschlüssel. Wenn Sie also versuchen, dem Realm ein Objekt mit dem gleichen Primärschlüssel wie einem vorhandenen Objekt des gleichen Typs hinzuzufügen, wird es unterbrochen. Soweit ich das beurteilen kann, setzen Sie den Primärschlüssel standardmäßig auf 0, aber Sie aktualisieren ihn vor dem Speichern nicht mit einem eindeutigen Wert.

Wenn Sie nur eine eindeutige Kennung für jedes Objekt und benötigen keine Rolle spielt, ist dies eine gute Lösung:

dynamic var id: String = NSUUID().UUIDString