0

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

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

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

你有什么主意吗?还有其他我完全想念的简单方法吗?先感谢您。

4

4 回答 4

5

使用 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:@""];
}
于 2012-12-14T10:04:20.703 回答
1

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

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

并将其保存到NSDoctumentsDirectory.

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

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

于 2012-12-14T09:49:44.777 回答
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
}

}

于 2014-12-23T21:27:01.183 回答
-1

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

userId-objectId-somesalt

将值保存到对象的路径

于 2012-12-14T09:50:24.557 回答