2016-04-11 18 views
1

私はRealmを初めて使っています。WebServiceからJSONデータをRealm DBに保存しようとするといくつか問題が発生します。JSONからRealmへのデータの保存

これは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" 
     } 
    ] 
} 

私は次の構造を作成しました:

レルムオブジェクトクラス:

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" 
    } 

} 

オブジェクトの操作クラス:

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() { } 
} 

を接続w WebServiceのi番目の通過:

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 
     } 
    } 

    } 

そして最後に、実際にレルムDBにオブジェクトを保存するための方法。

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)") 
     } 
    } 
    } 

しかし、私はすべてのショーをDBに取り込むことができません。誰でもここで私を助けることができましたか?

ありがとうございます!

+0

コールはすでにここに問題を釘付けしているかもしれませんが、念のために、あなたがしてくださいすることができますすべての番組を試してみると、何のエラーログが出るのですか?ありがとう! – TiM

+0

ええ、それは私の論理に問題です!私はエラーは発生しませんが、最初の要素[0]だけが保存されています。私は私のlistingArrayが空(またはnil?)かどうかをチェックしてから、書き込みを実行する必要があると思います。ありがとうコールキャンプベル。 – acmobile

答えて

1

私はエラーログなしで確実に言うことはできませんが、プライマリキーのために問題があるように見えます。レルムはプライマリキーの一意性を強制します。したがって、同じ種類の既存のオブジェクトと同じプライマリキーを持つレルムにオブジェクトを追加しようとすると、そのオブジェクトは中断されます。私が知る限り、デフォルトでプライマリ・キーを0に設定していますが、セーブする前に一意の値でプライマリ・キーを更新しているわけではありません。

あなただけの各オブジェクトおよび注文の一意の識別子が必要な場合は関係ありません、これは良い解決策です:

dynamic var id: String = NSUUID().UUIDString 
関連する問題