对象映射器/核心数据,对象映射器无值字段

对象映射器/核心数据,对象映射器无值字段

问题描述:

我需要使用某些映射器(例如对象映射器)将检索到的JSON对象保存到核心数据中。 我使用的REST API,检索该JSON:对象映射器/核心数据,对象映射器无值字段

[ 
{ 
    "event_id": "1", 
    "event_name": "Lungo il tevere", 
    "event_image_url": "https:\/\/www.dayroma.it\/wp-content\/uploads\/2016\/06\/event_fb-9400.jpg", 
    "event_content": "<b>Lungo il Tevere Roma 2016, bancarelle sulle banchine del Tevere<\/b>\r\n\r\n&nbsp;\r\n\r\n&nbsp;", 
    "event_start_date": "2016-07-29", 
    "event_end_date": "2016-07-30", 
    "event_start_time": "22:00:00", 
    "event_end_time": "03:00:00", 
    "location_name": "Lungotevere", 
    "location_address": "Piazza Navona 2, Roma", 
    "location_latitude": "41.897785", 
    "location_longitude": "12.472971" 
}, 
{ 
    "event_id": "8", 
    "event_name": "test 7 - VIlla BOrghese", 
    "event_image_url": "https:\/\/www.dayroma.it\/wp-content\/uploads\/2016\/06\/event_fb-9398.jpg", 
    "event_content": "TEst villa borghese", 
    "event_start_date": "2016-07-29", 
    "event_end_date": "2016-07-30", 
    "event_start_time": "22:00:00", 
    "event_end_time": "02:00:00", 
    "location_name": "Villa Borghese", 
    "location_address": "Villa Borghese 4, Roma", 
    "location_latitude": "41.912888", 
    "location_longitude": "12.485208" 
} 

]

没什么特别的,一个简单的JSON阵列。 我需要将其解析为数据对象并存储到核心数据中。 其实,我有关于将对象映射到核心数据对象的问题,因为只有字符串值被检索,其他都是零。

这里我DataController类

class DataController: NSObject { 

var managedObjectContext: NSManagedObjectContext 

override init() { 
    // This resource is the same name as your xcdatamodeld contained in your project. 
    guard let modelURL = NSBundle.mainBundle().URLForResource("DataModel", withExtension:"momd") else { 
     fatalError("Error loading model from bundle") 
    } 
    // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model. 
    guard let mom = NSManagedObjectModel(contentsOfURL: modelURL) else { 
     fatalError("Error initializing mom from: \(modelURL)") 
    } 
    let psc = NSPersistentStoreCoordinator(managedObjectModel: mom) 
    self.managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType) 
    self.managedObjectContext.persistentStoreCoordinator = psc 

    let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
    let docURL = urls[urls.endIndex-1] 
    /* The directory the application uses to store the Core Data store file. 
    This code uses a file named "DataModel.sqlite" in the application's documents directory. 
    */ 
    let storeURL = docURL.URLByAppendingPathComponent("DataModel.sqlite") 
    do { 
     try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil) 
    } catch { 
     fatalError("Error migrating store: \(error)") 
    } 

} 

}

我在这里的对象核心属性:

extension Event { 

@NSManaged var eventId: Int 
@NSManaged var eventName: String? 
@NSManaged var eventImageUrl: String? 
@NSManaged var eventContent: String? 
@NSManaged var eventStartTime: NSDate? 
@NSManaged var eventEndTime: NSDate? 
@NSManaged var eventStartDate: NSDate? 
@NSManaged var eventEndDate: NSDate? 
@NSManaged var locationName: String? 
@NSManaged var locationAddress: String? 
@NSManaged var locationLatitude: NSNumber? 
@NSManaged var locationLongitude: NSNumber? 

}

在这里,我的核心数据对象模型实现可映射:

class Event: NSManagedObject, Mappable { 


override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) { 
    super.init(entity: entity, insertIntoManagedObjectContext: DataController().managedObjectContext) 
} 

required init?(_ map: Map) { 
    let ctx = DataController().managedObjectContext 
    let entity = NSEntityDescription.entityForName("Event", inManagedObjectContext: ctx) 
    super.init(entity: entity!, insertIntoManagedObjectContext: ctx) 

    mapping(map) 
} 

func mapping(map: Map) { 

    eventId <- map["event_id"] 
    eventName <- map["event_name"] 
    eventImageUrl <- map["event_image_url"] 
    eventContent <- map["event_content"] 
    eventStartTime <- map["event_start_time"] 
    eventEndTime <- map["event_end_time"] 
    eventStartDate <- map["event_start_date"] 
    eventEndDate <- map["event_end_date"] 
    locationName <- map["location_name"] 
    locationAddress <- map["location_address"] 
    locationLatitude <- map["location_latitude"] 
    locationLongitude <- map["location_longitude"] 



} 

}

运行此:

let URL = "##### MY API ######" 
    Alamofire.request(.GET, URL).responseArray { (response: Response<[Event], NSError>) in 

     let eventsArray = response.result.value 

     for element in eventsArray! { 
      print(element) 
     } 

    } 

我找回这样的:

data: { 
eventContent = "TEst villa borghese"; 
eventEndDate = nil; 
eventEndTime = nil; 
eventId = 0; 
eventImageUrl = "https://www.dayroma.it/wp-content/uploads/2016/06/event_fb-9398.jpg"; 
eventName = nil; 
eventStartDate = nil; 
eventStartTime = nil; 
locationAddress = "Villa Borghese 4, Roma"; 
locationLatitude = nil; 
locationLongitude = nil; 
locationName = "Villa Borghese"; 

}

领域的

很大一部分是零, 你能帮助我理解问题是什么?

谢谢youy

+0

你的代码从字符串转换成日期在哪里?你的模型有'NSDate'属性,但JSON包含字符串。你在哪里转换成'NSDate'? –

+0

我不知道在哪里转换每个类型的表单JSON ....这是问题,对象ID是一个i​​nt32或int64,然后我有经度和纬度是双重和所有的日期...我可以在哪里转换他们? – dayroma

+0

将值分配给这些属性时。我想也许你的映射框架应该这样做?所以也许你应该看看框架代码并看看。尽管如此,代码并不难编写。 –

从你的JSON你只收到字符串,甚至当你在等待的NSNumber或NSDate的。

为了使这个地图的工作,你应该从ObjectMapper使用自定义转换和设置你的映射如:

birthday <- (map["birthday"], DateTransform()) 

或具有自定义转换,如:

private static let formatter: NSNumberFormatter = NSNumberFormatter() 
private let transform = TransformOf<NSNumber, String>(fromJSON: 
     { (value: String?) -> NSNumber? in 
      // transform value from String? to Int? 
      formatter.numberStyle = .DecimalStyle 
      return formatter.numberFromString(value!) 
    }, toJSON: 
     { (value: NSNumber?) -> String? in 
      // transform value from Int? to String? 
      if let value = value 
      { 
       return String(value) 
      } 
      return nil 
}) 

,并使用它:

people <- (map["people"], transform) 

希望得到这个帮助。