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

时间:2012-12-14 09:33:30

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

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

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

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

你知道吗?还有一种我完全失踪的简单方法吗?提前谢谢。

4 个答案:

答案 0 :(得分:5)

使用coredata的objectID作为标识符

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

helper sanitizeFilename:

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

答案 1 :(得分:1)

只需在CoreData模型实体描述中创建一个object_id数字属性,每次创建一个新对象时,将该属性递增1并将其分配给该对象,然后使用命名约定,如

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

并将其保存到NSDoctumentsDirectory

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

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

答案 2 :(得分:0)

感谢@ 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
}

}

答案 3 :(得分:-1)

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

userId-objectId-somesalt

将值保存到对象的路径