2016-04-11 99 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 ith WebService通過:

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

    } 

最後,實際將對象保存到Realm 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)") 
     } 
    } 
    } 

但是我不能把所有的節目都放到數據庫中。任何人都可以幫助我在這裏?

在此先感謝!

+0

科爾可能在這裏已經釘了問題,但爲了以防萬一,你可以請發佈您在嘗試插入所有節目時得到的錯誤日誌?謝謝! – TiM

+0

是的,這是我的邏輯問題!我沒有收到任何錯誤,但只保存了第一個元素[0]。我想我需要先檢查我的listingArray是否爲空(或無?),然後執行寫操作。感謝科爾坎貝爾。 – acmobile

回答

1

我不能確定沒有錯誤日誌,但它似乎確實會因爲您的主鍵而出現問題。 Realm強制實現主鍵的唯一性,因此如果嘗試使用與相同類型的現有對象相同的主鍵將對象添加到領域,它將會中斷。據我所知,默認情況下,您將主鍵設置爲0,但您在保存之前沒有使用唯一值更新它。

如果你只需要爲每個對象和順序無所謂的唯一標識符,這是一個很好的解決方案:

dynamic var id: String = NSUUID().UUIDString