7

Core Data に保存したい画像が約 60 枚あります。そのうち 30 枚はアバターで、プレフィックスが avt_filename_00X.png で、そのうちの 30 枚は小さく、別のプレフィックスが付いています。

すべての画像を BLOB として Core Data/SQLite に保存するのではなく、見つかった各画像のパスを保存したいと考えています (MySQL データベースの画像パスを保存するのと同じ方法で)。

ただし、NSBundle にある画像のパスを取得する方法がわかりません。

次の方法で NSDocumentDirectory へのパスを取得できます。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager fileExistsAtPath:documentsDirectory];

NSLog(@"documentsDirectory = %@", documentsDirectory);

そして、画像を読み込んで配列に追加できます。

if (qty == 0)
{
    //NSLog(@"fileToLoad = %@", fileToLoad);

    UIImage *img = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileToLoad ofType:fileExt]];

    [self.avtList addObject:img];

    [img release];

} else {

    // load multiple image into an array
    // not coded yet
}

しかし、私が確信していないのは次のとおりです。

  1. NSBundle 内でコンピュータがイメージを見つけたパスを取得するにはどうすればよいですか?

  2. アプリがデバイス上にあるときにパスが機能することを確認するにはどうすればよいですか?

アイデアは、配列に保存されているすべての画像を取得し、後でそれらを Core Data/SQLite にプッシュすることです。

4

2 に答える 2

26

メインバンドル内のリソースへのフルパスを取得する正しい方法は次のとおりです。

[[NSBundle mainBundle] pathForResource:@"avt_filename_00X" ofType:@"png"]

(または、リソース名に拡張子を含める場合は、「ofType」に空の文字列を指定できます)

ただし、ドキュメントのどこにも、デバイス間、オペレーティングシステムの反復などで同じであることが保証されているパスはありません。これは、現在の環境のアプリケーションバンドルからそのファイルへのパスであり、アプリケーションのこの実行中は有効であることが保証されています。それだけ。

アプリケーションへのパス、つまりそのリソースへのパスが同じであることが保証されていないため、SQLデータベースにアプリケーションを配置することは明らかに安全ではないと思います。

/で始まるファイル名が完全なパスであり、先頭に/がないファイル名がバンドル内にあると想定されるスキームを採用できますか?つまり、データベースの外部でロジックを適用できますか?

于 2010-10-28T16:17:43.493 に答える
2

アプリがデバイス上にあるときにパスが機能することをどのように確認できますか?

そこに摩擦があります:あなたはできません。パスをオンザフライで処理し、代わりにファイル名を保存するのが最善です。

于 2010-10-28T16:12:49.727 に答える