写真を Core Data に保存したい。インターネットで調べると、コア データに関する多くのリソースが見つかりますが、達成したいリソースが見つかりません。Core Data を使用して、ユーザーが撮影した画像を保存し、保存するカテゴリをユーザーに選択してもらいたいと考えています。彼が写真を肉や野菜などのカテゴリに分類しているようです。これを行うために、写真と呼ばれる 1 つのエンティティを作成し、肉野菜などのカテゴリの 6 つの属性名を付けました。タイプはまだ選びません。ユーザーがカテゴリを選択して属性に保存すると考えています。これが質問です。これをやりたいのですが、やりたいことを満たすリソースが見つかりません。また、複数の属性を使用するという正しい考え方をしていますか?
2 に答える
UIImage データをコア データに格納するために下にスクロールしますが、最初にコア データ属性について少し説明します。異なるカテゴリに複数の属性を使用しないでください。「カテゴリ」と呼ばれる単一の属性を使用する必要があります。これは、実装に応じて、整数または文字列になります。整数を使用し、次のように列挙型を定義することをお勧めします。
typedef NS_ENUM(NSUInteger, MyFoodCategory){
MyFoodCategoryVegetable = 0,
MyFoodCategoryMeat = 1,
MyFoodCategoryFish = 2,
MyFoodCategorySweet = 3,
};
これをビューに出力するときは、次のようにします。
-(void)setLabelTextForCategory:(MyFoodCategory)category
{
switch(category) {
case MyFoodCategoryVegetable:
self.categoryLabel.text = @"Vegetable";
break;
case MyFoodCategoryMeat:
self.categoryLabel.text = @"Meat";
break;
case MyFoodCategoryFish:
self.categoryLabel.text = @"Poisson"; //French
break;
case MyFoodCategorySweet:
self.categoryLabel.text = @"Dessert";
break;
}
}
これは、各カテゴリに対してどのテストを印刷するかについて気が変わった場合、この場所で変更するだけでよく、コア データベースの内容を変更する必要がないことを意味します。たとえば、ローカリゼーションを使用して、同じ単語の別の言語またはバリアントを表示できます。
UIImage データをコアデータに保存する
さて、あなたの主な質問に答えます。個人的には、画像データをコア データに格納することは避け、代わりにディスクに保存します。NSFileManager クラスの使用を検討するか、UIImage を NSData に変換してファイルに書き込みます。
UIImage *image = ...
NSData *imageData = UIImagePNGRepresentation(image); // or use UIImageJPEGRepresentation if it's a jpeg image
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *fileName = @"imageWhatever1";
NSString *filePath = [documentsPath stringByAppendingPathComponent:fileName];
NSError *writeError = nil;
if (![data writeToFile:filePath options:NSDataWritingAtomic error:&writeError]) {
NSLog(@"Failed to write file: %@", writeError);
}
ただし、画像をコア データに直接保存する場合は、「imageData」という属性を作成し、属性タイプを「バイナリ データ」に設定します。次に、NSData オブジェクトをコア データ エンティティに保存します。NSData オブジェクトを読み取ると、次のように変換して UIImage に戻すことができます。
UIImage *imageLoadedFromDiskOrCoreData = [UIImage imageWithData:imageData];
いいえ、これは良い方法ではありません。今のところ、six attributes
for eachがありentity
ます。これにより、データベースの各行に無用な 5 つの属性が作成されます。
その代わりに、enum
forを作成し、値を にCategory
保存できます。enum
coreData
enum
そのため、将来の機能強化のためにカテゴリをいくつでも追加でき、 に何を保存するかを気にする必要はありませんcoreData
。
ちょうどこのような。
typedef enum imageType {
vegetables = 0,
fruits = 1,
animals = 2,
scenaries = 3,
Nature = 4,
Home = 5,
Architecture = 6
}
あなたのcoreData
エンティティはこのようになります。
ImageEntity
NSData *imageData;
NSNumber *typeEnum;
カテゴリの名前を含む配列を作成し、それをアプリ全体で使用して、自分または他のコンポーネントenum
のカテゴリの正確な名前と一致させることができます。UIPickerView
配列は次のようになります。
NSArray *categoryArray = [NSArray arrayWithObjects:@"vegetables", @"fruits", @"animals", @"scenaries", @"Nature", @"Home", @"Architecture", nil];
そして、このように配列オブジェクトにアクセスできます。
NSString *imageCategory = [categoryArray objectAtIndex:imageType.animals];