我正在创建一个简单的应用程序,用户可以创建使用CoreData保存的多个对象。
我的问题是,我希望每个对象都有一个链接到它的图像。图像由iphone相机或用户个人相机胶卷带来,因此图像将具有相当高的重量(我认为每个> 1MB)。 我读到当图像的权重很高时,处理这个问题的好方法是将图像保存在documentsDirectory文件夹中,并保存到coreData的路径。我很容易实现这一点。
但是如何找到要链接到唯一对象的图像的路径名? CoreData并没有真正处理唯一的ID,并且两个对象可以具有相同的名称...我搜索了objectID,但它的工作效果并不好,我不确定这是处理这个问题的好方法。
你知道吗?还有一种我完全失踪的简单方法吗?提前谢谢。答案 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
将值保存到对象的路径