0

ユーザーが CoreData で保存されるいくつかのオブジェクトを作成できる単純なアプリを作成しています。

私の問題は、各オブジェクトにリンクされた画像を持たせたいということです。画像はiPhoneカメラまたはユーザーの個人用カメラロールによってもたらされるため、画像の重量はかなり大きくなります(各1MBを超えると思います)。画像の重みが非常に高い場合、これを処理する良い方法は、画像を documentsDirectory フォルダーに保存し、パスを coreData に保存することです。私はこれをかなり簡単に達成しました。

しかし、一意のオブジェクトにリンクされる画像のパス名を見つけるにはどうすればよいでしょうか? CoreData は一意の ID を実際には処理せず、2 つのオブジェクトが同じ名前を持つ可能性があります... 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 数値プロパティを作成し、新しいオブジェクトが作成されるたびに、このプロパティを 1 ずつ増やしてオブジェクトに割り当て、次のような命名規則を使用します。

[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 に答える