【问题标题】:Core Data and unique UIImage per object每个对象的核心数据和唯一 UIImage
【发布时间】:2012-12-14 09:33:29
【问题描述】:

我正在制作一个简单的应用程序,用户可以在其中创建多个使用 CoreData 保存的对象。

我的问题是,我希望每个对象都有一个链接到它的图像。图像是由 iphone 相机或用户个人相机胶卷带来的,因此图像的权重非常高(我认为每个图像 > 1MB)。 我读到当图像的权重很高时,处理这个问题的好方法是将图像保存在documentsDirectory文件夹中,并将路径保存到coreData。我很容易做到这一点。

但是如何找到要链接到唯一对象的图像的路径名? CoreData 并不能真正处理唯一的 ID,并且两个对象可以具有相同的名称...我搜索了 objectID,但它的工作并不好,我不确定这是处理这个问题的好方法。

你有什么想法吗?还有其他我完全想念的简单方法吗?提前谢谢你。

【问题讨论】:

  • 唯一组是什么意思?
  • 唯一对象。抱歉打错了。

标签: objective-c ios core-data uiimage save


【解决方案1】:

使用 coredata 的 objectID 作为标识符

id uri = [self sanitizeFilename:coreDataObject.objectID.URIRepresentation];
[NSString stringWithFormat:@"%@.png", uri];

帮助清理文件名:

- (NSString *)sanitizeFileNameString:(NSString *)fileName {
    NSCharacterSet* illegalFileNameCharacters = [NSCharacterSet characterSetWithCharactersInString:@"/\\?%*|\"<>"];
    return [[fileName componentsSeparatedByCharactersInSet:illegalFileNameCharacters] componentsJoinedByString:@""];
}

【讨论】:

  • 这样使用和更改 objectID 可以吗?我不敢做那样的事。
  • 好吧,我一直都在这样做,当然这个 ID 在多个设备上不稳定,但出于这样的目的,它可以工作
【解决方案2】:

只需在您的 CoreData 模型实体描述中创建一个 object_id 编号属性,每次创建新对象时将此属性加一并将其分配给对象,然后使用类似的命名约定

[NSString stringWithFormat:@"object_%d_img.png", idNumber];

并将其保存到NSDoctumentsDirectory

然后在对象的- (void)prepareForDeletion方法中删除图片。

至于如何增加 id 值,创建一个方法来获取具有最大 id 值的对象 - 只需按 id desc 获取所有具有排序描述符的对象,并在创建新实体时使用它 + 1。

【讨论】:

  • 手动唯一 ID。很好的答案,但我正在寻找更“官方”的东西。还是谢谢你。
【解决方案3】:

感谢@Daij-Djan。我为 Swift 创建了版本:

        var itemObjectId:String = item.objectID.URIRepresentation().absoluteString!
    var fileName = NSString(format:"%@.png", FileHelper.sanitizeFileNameString(itemObjectId)) as String

消毒助手:

struct FileHelper {
 static func sanitizeFileNameString(fileName:String) ->String {
    let illegalFileNameCharacters:NSCharacterSet = NSCharacterSet(charactersInString: "/\\?%*|\"<>")
    let components : [String] = fileName.componentsSeparatedByCharactersInSet(illegalFileNameCharacters)
    let joinedString = join("", components)
    return joinedString
}

}

【讨论】:

    【解决方案4】:

    我认为您需要自己生成唯一 ID。因为一个用户可以有多个对象。所以也许图像ID可以这样命名

    userId-objectId-somesalt
    

    将值保存到对象的路径

    【讨论】:

    • IMO 不够具体——基本上和尤金说的一样
    • @Daij-Djan 看看回答时间。当我试图回答它时没有答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多