2016-07-29 2 views
1

일부 매퍼 (예 : Object Mapper)를 사용하여 코어 데이터에 JSON 개체를 저장해야합니다. 특별한개체 매퍼/코어 데이터, 개체 매퍼 nil 값 필드

[ 
{ 
    "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 배열 : 나는이 JSON를 검색 휴식 API를 사용하고 있습니다. 데이터 개체로 구문 분석하고 핵심 데이터에 저장해야합니다. 실제로 String 값만 검색되기 때문에 Object를 Core Data Object로 매핑하는 문제가 있습니다. 나머지는 무효입니다. 여기

내 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"; 

}

필드의

큰 부분은 전무, 당신이 날 이해하는 데 도움이 될 수 있습니다 문제가 무엇입니까? 당신은 당신의 NSNumber 나있는 NSDate을 기다리고 있습니다 때 당신은 심지어 문자열을받을 JSON에서

는 youy

+0

문자열을 날짜로 변환하는 코드는 어디에 있습니까? 모델에는 NSDate 속성이 있지만 JSON에는 문자열이 들어 있습니다. NSDate로 어디로 변환합니까? –

+0

모든 유형의 양식을 json ...으로 변환 할 수 있는지 모르겠다.이 문제는 개체 ID가 int32 또는 int64 인 경우 위도와 경도가 이중이고 모든 날짜가 ... 어디에서 변환 할 수 있습니까? 그들? – dayroma

+0

이러한 속성에 값을 할당 할 때. 아마 당신의 매핑 프레임 워크가 이것을하기로되어 있다고 생각하십니까? 아마 프레임 워크 코드를보고보아야 할 것입니다. 그러나 코드는 자신을 쓰는 것이 어렵지 않습니다. –

답변

0

감사드립니다.

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

및 사용 :

이지도는 ObjectMapper에서 사용자 지정 변환을 사용하고 있습니다 당신에게 매핑을 설정해야 작동하는지 확인하려면
people <- (map["people"], transform) 

희망 도움말.