2016-01-13 121 views
2

我正在研究Cocktailapp并希望将我的图像数据保存到Core Data。 我看了一些教程并做了相同的工作,但仍然无法正常工作,我不知道为什么。从核心数据获取图像

我有所有的标题为图像阵列:

let imagesAperitif: [String] = ["americano.jpg", "daiquiri.jpg", 
     "frozen daiquiri.jpg", 
     "banana frozen daiquiri.jpg", "bronx.jpg", "kir.jpg", 
     "hugo.jpg", "Manhattann.jpg", "manhattan dry.jpg", "manhattan medium.jpg", "margarita.jpg", 
     "martini dry.jpg",... 

多数民众赞成在我把我的方法的图像保存到核心数据:

setCocktails(nameInsert, zutaten: zutatenInsert, zubereitung: zubereitungInsert, dekoration: dekorationInsert, stil: stilInsert, bild: UIImage(named: imagesAperitif[index])!) 

这是从代码的一部分saveCocktails方法:

let imageData = NSData(data: UIImageJPEGRepresentation(bild, 1.0)!) 
eintrag.setValue(imageData, forKey: "bild") 

do { 
    try managedContext.save() 

这是获取方法的一部分:

let fetchRequest = NSFetchRequest(entityName: "Cocktail") 

do { 
    let results = 
    try managedContext.executeFetchRequest(fetchRequest) 
    cocktails = results as! [NSManagedObject] 

在这里,我想从NSData的让我像回到:

imagesAperitif.append(UIImage(data: eintrag.valueForKey("bild") as! NSData)!) 

,但应用程序与该行崩溃,我得到一个“致命错误:意外发现零而展开的可选值”错误。

是否有人能够向我解释这一点,因为我不知道要改变什么。我尝试过的所有东西也都错了。

+0

尝试打印从coredata.App崩溃阅读,因为它不能够创建UIImage对象的值。 –

+0

对非英语名称有些混淆。 :(你可能想要检查'UIImage(data:eintrag.valueForKey(“bild”)as!NSData)'是否被正确初始化' – zcui93

+1

@AnilSanto你打印这个值是什么意思? –

回答

0

你可能想情况下,之前检查nileintrag.valueForKey("bild")NSData

由于 FUNC valueForKey(_键:字符串) - > AnyObject?

它总是保存检查nil你追加UIImage(data: eintrag.valueForKey("bild") as! NSData)

+0

但是,这并不能解决我的问题,因为必须有一个图像 –

+0

你正在编写你的代码,说你的演员到NSData将总是成功,但它并不明显,你使用的一个值是零,这就是为什么它会崩溃,使用“!”禁用xcode,要求你检查零,但值可能仍然是零。 zcui93试图告诉你,你是否应该检查你所需的值是否为零。 eintrag.valueForKey(“bild”)没有值,或者您的转换为NSData失败或UIImage对象为零。 – Orion

+0

我知道现在有一个值是零,但我不知道为什么,这就是为什么我发布了我的问题 –

0

之前(我喜欢用后卫所以这里去:))

所以,我会在这里做的,因为它看起来像NSData对象的插入失败:

// We are simultaniously unwrapping objects and checking if objects are nil. 
guard let imgAsNSData: NSData = UIImageJPEGRepresentation(bild, 1.0), 
    let entity: Cocktail = eintrag as? Cocktail else { 
     // Stop executing the method here, there is no point in going further. Handle any errors here! Either imgAsNSData is nil, or could not cast to your class. A guard statement handles it's errors here. 
     return 
} 

// At this point we know we have an NSData object. Assign it to the entity. 
entity.bild = imgAsNSData 

do { 
    // Save our entity. 
    try managedContext.save() 
} catch { 
    // Handle error 
} 

撷取:

let fetchRequest = NSFetchRequest(entityName: "Cocktail") 

do { 
    let results: [NSManagedObject] = try managedContext.executeFetchRequest(fetchRequest) 
guard let cocktails = results as? [Cocktail] else { 
    // Could not cast to an array of Cocktail objects. 
    return 
} 

// Do stuff with the cocktails object. 

添加到您的数组:

// 1: Check if entity not is nil 
// 2: Check if entity's bild property not is nil. 
// 3: Check if we can create an image using the NSData 
guard let cocktail: Cocktail = eintrag as? Cocktail, 
    let imgAsNSData: NSData = cocktail.bild, 
    let image: UIImage = UIImage(data: imgAsNSData) else { 
     // Required values are nil. Cannot proceed. 
     return 
} 

imagesAperitif.append(image) 

未经测试的代码,所以要小心:)

+0

好吧,我的代码有些问题,但它仍然不能正常工作,但是我测试了guard语句,既保存图像以从NSData获取图像,并且两个守卫语句似乎都是真实的,其他块不起作用。但追加图像仍然得到了零误差 –

+0

那么是不是图像开胃零呢? – Orion

+0

后卫让的imageData:UIImage的=的UIImage(数据:eintrag.valueForKey( “图片报”)作为NSData的) 其他 { 回报 } imagesAperitif.append(为imageData) 我这个说法测试它,因为它是唯一的办法,我得到它的工作,瓜尔语声明不去到其他块,但追加get仍然是错误 –