2015-10-19 2 views
0

У меня возникла проблема с приложением Swift (2.0), которое я пишу в Xcode 7. В принципе, я хочу сохранить строку в Core Data, а затем получить ее. Звучит очень просто, но у меня есть некоторые проблемы. Приложение представляет собой смоделированную бомбу, поэтому я пишу время, которое оно должно «детонировать» как строку для Core Data. Затем я хочу получить эту строку и сделать с ней что-то.Передача и извлечение основных данных - проблема элемента NSArray в Swift

Вот мой код, чтобы сохранить строку в Core Data:

let dteTime:NSDate = NSDate(timeIntervalSinceNow: 60*60*12) //Generate time 12 hours from now 
    let formatter:NSDateFormatter = NSDateFormatter() 
    formatter.timeStyle = NSDateFormatterStyle.LongStyle 
    formatter.dateStyle = NSDateFormatterStyle.LongStyle 
    let strStringValue:String = formatter.stringFromDate(dteTime) 
    print(strStringValue) //Prints 'October 20, 2015 at 5:53:18 AM GMT+11' as expected 

    let newTime = NSEntityDescription.insertNewObjectForEntityForName("Time", inManagedObjectContext: context) 
    newTime.setValue(strStringValue, forKey: "dateTimeExplode") 

    do { 
     try context.save() 
    } catch _ { 
     print("Error saving core data") 
    } 

Я подтвердил, что расчет времени 12 часов с этого времени работает, и он отформатирован в строку правильно.

Ниже приведен код, чтобы получить запись из основных данных:

let request = NSFetchRequest(entityName: "Time") 
    request.returnsObjectsAsFaults = false 

    var results:[TimeCoreData] = [TimeCoreData]() 
    results = (try! context.executeFetchRequest(request)) as! [TimeCoreData] 

    if results.count > 0 {   // Data retrieved 
     var dteTimeExplode:String = String() 
     for res in results { //CRASHES 

      dteTimeExplode = res.dteTimeDateExplode 
     } 
} 

Вы должны простить меня за путаницу здесь, но dteTimeExplode на самом деле является строка, а не дата. Первоначально это NSDate(), но я столкнулся с проблемами, поэтому, чтобы временно упростить его, я сменил его на строку. Во всем коде может быть несколько таких случаев.

Как вы можете видеть, я извлекаю данные ядра в пользовательский объект, который определен ниже. Я скопировал весь быстрый файл.

import UIKit 
import CoreData 
import Foundation 

@objc(TimeCoreData) 

class TimeCoreData: NSManagedObject { 
    @NSManaged var dteTimeDateExplode:String 
} 

В данный момент происходит сбой приложения, когда он попадает в for res in results { (маркированы во втором фрагменте кода выше) с сообщением об ошибке

fatal error: NSArray element failed to match the Swift Array Element type

Я понимаю, что это сообщение об ошибке принимается потому, что Swift пытается сделать массив одного типа из данных другого типа, и он не может этого сделать, но я не понимаю, почему это так. Я сохраняю строку в Core Data, поэтому мне нужно получить строку. Мой пользовательский объект (TimeCoreData) имеет только одну переменную и имеет строку типа.

Ниже приведен скриншот моей базовой модели данных: Core Data Model

Что я здесь делаю неправильно?

+0

Почему вы переставляете разные значения в строку 'dteTimeExplode' на каждой итерации цикла? – Mundi

+0

@Mundi Я переопределяю значения, потому что хочу последнее значение, которое хранится, поэтому я прохожу до тех пор, пока в Core Data больше нет строк. Это должно быть только 1, потому что я усекаю объект перед сохранением, но я просто уверен, что у меня были проблемы в предыдущем проекте. –

ответ

0

Похоже, вы не сказали своей модели, что объект Time должен использовать класс TimeCoreData. Я бы посоветовал вам взять простейший маршрут и рефакторинг, изменив имя подкласса NSManagedObject на Time.

Смежные вопросы