У меня возникла проблема с приложением 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
) имеет только одну переменную и имеет строку типа.
Ниже приведен скриншот моей базовой модели данных:
Что я здесь делаю неправильно?
Почему вы переставляете разные значения в строку 'dteTimeExplode' на каждой итерации цикла? – Mundi
@Mundi Я переопределяю значения, потому что хочу последнее значение, которое хранится, поэтому я прохожу до тех пор, пока в Core Data больше нет строк. Это должно быть только 1, потому что я усекаю объект перед сохранением, но я просто уверен, что у меня были проблемы в предыдущем проекте. –