2013-08-07 6 views
0

Je souhaite enregistrer la photo dans les données de base. Je lève les yeux sur Internet et trouve de nombreuses ressources sur les données de base, mais je ne peux pas trouver celle que je veux accomplir. Je veux utiliser les données de base pour enregistrer les images que l'utilisateur a prises, puis je souhaite que l'utilisateur sélectionne la catégorie dans laquelle il souhaite l'enregistrer. C'est comme il est de trier les images dans les catégories de viande ou de légumes par exemple ou etc. Pour ce faire, j'ai fait une entité appelée photo et mettre 6 attributs nom des catégories pour les légumes de la viande par exemple. Je n'ai pas encore sélectionné le type. Je pense que l'utilisateur choisit la catégorie et en enregistre un attribut. Voici la question. Je veux faire ceci mais je ne peux pas trouver des ressources qui répondent à ce que je veux faire. Est-ce que je fais aussi la bonne idée d'utiliser plusieurs attributs?Enregistrement de photos dans des données de base

Répondre

0

Non. Ce n'est pas un bon moyen. Pour l'instant, vous avez un six attributes pour chaque entity. Cela va conduire à créer 5 attributs inutiles pour chaque ligne de votre base de données.

Au lieu de cela, vous pouvez créer un enum pour votre Category et stocker la valeur enum dans votre coreData.

Alors que vous pouvez ajouter un certain nombre de catégories dans votre enum pour l'amélioration future trop et vous n'avez pas besoin de se soucier de ce que vous stockez dans coreData.

Juste comme ceci.

typedef enum imageType { 
    vegetables = 0, 
    fruits = 1, 
    animals = 2, 
    scenaries = 3, 
    Nature = 4, 
    Home = 5, 
    Architecture = 6 
} 

et votre entité coreData être comme ceci.

ImageEntity

NSData *imageData; 
NSNumber *typeEnum; 

Vous pouvez avoir un tableau avec les noms de la catégorie et de l'utiliser partout dans votre application pour correspondre à la enum avec le nom exact d'une catégorie dans votre UIPickerView ou dans un autre Composants.

Votre tableau pourrait ressembler à ceci.

NSArray *categoryArray = [NSArray arrayWithObjects:@"vegetables", @"fruits", @"animals", @"scenaries", @"Nature", @"Home", @"Architecture", nil]; 

Et vous pouvez accéder aux objets du tableau comme ceci.

NSString *imageCategory = [categoryArray objectAtIndex:imageType.animals]; 
1

Faites défiler la liste pour stocker des données UIImage dans les données de base, mais tout d'abord un peu de données de base des attributs: vous ne devriez pas utiliser plusieurs attributs pour différentes catégories, vous devriez avoir un seul attribut appelé « catégorie ». Cela peut être un entier ou une chaîne, selon votre implémentation. Je recommande d'utiliser un entier et définissant un ENUM pour elle comme suit:

typedef NS_ENUM(NSUInteger, MyFoodCategory){ 
    MyFoodCategoryVegetable = 0, 
    MyFoodCategoryMeat = 1, 
    MyFoodCategoryFish = 2, 
    MyFoodCategorySweet = 3, 
}; 

Lorsque vous imprimez ceci à la vue, faire quelque chose comme ce qui suit:

-(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; 
    } 
} 

Cela signifie que si vous changez attention au test que vous souhaitez imprimer pour chaque catégorie, il vous suffit de le changer à cet endroit, et vous n'avez pas besoin de changer ce qui est dans la base de données principale. Par exemple, vous pouvez utiliser la localisation pour afficher une langue ou une variante différente du même mot.

Le stockage des données UIImage dans les données de base

de OK, afin de répondre à votre question principale. J'éviterais personnellement de stocker des données d'image dans les données de base, je l'enregistrerais plutôt sur le disque. Regardez dans l'utilisation de la classe NSFileManager ou convertissez UIImage en NSData et écrivez dans un fichier, par ex.

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); 
} 

Cependant, si vous préférez enregistrer l'image directement aux données de base, puis créer un attribut appelé « imageData » et définir le type d'attribut de « données binaires ». Enregistrez ensuite l'objet NSData dans l'entité de données principale. Lorsque vous lisez l'objet NSData, vous pouvez reconvertir en UIImage comme suit:

UIImage *imageLoadedFromDiskOrCoreData = [UIImage imageWithData:imageData]; 
+0

Il est également agréable d'utiliser une coutume 'NSValueTransformer' pour les attributs non standard comme des images. Apple propose même un exemple d'implémentation de cette application dans son exemple d'application ** PhotoLocations **. –

+0

Je veux que l'utilisateur sélectionne la catégorie à enregistrer en utilisant un 'UIPickerView' mais je ne peux pas le faire fonctionner. Quel sera un bon point de départ pour moi de le faire? – AppleDevram

Questions connexes