每个对象的核心数据和唯一 UIImage

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

唯一组是什么意思? 唯一对象。抱歉打错了。 【参考方案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 看看回答时间。当我试图回答它时没有答案

以上是关于每个对象的核心数据和唯一 UIImage的主要内容,如果未能解决你的问题,请参考以下文章

如何查询按核心数据中唯一值分组的值?

从核心数据中检索特定对象

获取核心数据对象的唯一日历日期

iOS核心数据对象的唯一标识符?

如何在核心数据中检索实体的唯一关系

核心数据删除所有对象有没有更快的方法