2016-04-11 100 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