Domanda

Ho un modello di dati che contiene diverse entità, ognuna con diversi attributi che memorizzano i dati delle immagini. Queste saranno tutte piccole immagini e devo memorizzarle nell'archivio persistente anziché come file esterni.

Mentre posso semplicemente archiviare i dati dell'immagine in un attributo binario o trasformabile, è molto probabile che l'utente specifichi immagini identiche per due o più di questi attributi, quindi preferirei archiviare una copia di ogni immagine unica anziché duplicazione dei dati dell'immagine.

Ho sbagliato a creare un " ImageBlob " entità per archiviare i dati di immagine e utilizzare le relazioni per fare questo, ma io sono un principiante con i dati di base e non mi è immediatamente chiaro se questa è la strada giusta da percorrere. In particolare, come posso gestire le seguenti situazioni?

  • Voglio che tutti i miei attributi di immagine in più entità utilizzino lo stesso "archivio dati immagini" in modo che sia archiviata solo un'istanza di ciascun BLOB di immagini
  • Devo assicurarmi che, se nessun oggetto utilizza un'immagine nell'archivio dati, questa venga rimossa

Quale sarebbe il modo migliore di gestirlo?

È stato utile?

Soluzione

La mia prima domanda sarebbe come pensi di identificare quando due oggetti stanno usando la stessa immagine? C'è una proprietà sull'immagine che puoi archiviare ed eseguire una query per determinare se l'immagine che stai impostando esiste già? E quanto è costoso, dal punto di vista computazionale? Se impiega molto tempo, potresti finire per ottimizzare l'archiviazione e influire sulle prestazioni.

Tuttavia, se hai un modo per farlo in modo efficiente, puoi creare un'entità ImageBlob per fare ciò che descrivi. L'entità che utilizza ImageBlob dovrebbe avere una relazione imageBlob o imageBlobs con ImageBlob . ImageBlob dovrebbe avere una relazione inversa con un nome come, ad esempio, utenti .

Nel tuo codice, quando vuoi riutilizzare un ImageBlob , è semplice come fare qualcosa del genere:

NSManagedObject *blob = // get the image blob
NSManagedObject *user = // get the user
[user setValue:blob forKey:@"imageBlob"]; // do this if it uses a single image
[[user mutableSetValueForKey:@"imageBlobs"] addObject:blob]; // do this if it uses multiple images

Un'altra considerazione a cui dovresti pensare è cosa fare con i BLOB che non sono più necessari. Presumibilmente, si desidera eliminare tutte le immagini che non vengono utilizzate. Per fare ciò, è possibile iscriversi al delegato dell'applicazione o alla sottoclasse NSPersistentDocument (a seconda che l'app sia basata su documenti o meno) per la NSManagedObjectContextObjectsDidChangeNotification . Ogni volta che cambia il contesto dell'oggetto gestito, è possibile eliminare qualsiasi immagine non necessaria come questa:

- (void)managedObjectContextObjectsDidSave:(NSNotification *)notification {
    NSManagedObjectContext *managedObjectContext = [notification object];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:[NSEntity entityWithName:@"ImageBlob" inManagedObjectContext:managedObjectContext]];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"users.@count == 0"];
    NSArray *unusedBlobs = [managedObjectContext executeFetchRequest:fetchRequest error:nil]; // Don't be stupid like me; catch and handle the error
    [fetchRequest release];

    for (NSManagedObject *blob in unusedBlobs) {
        [managedObjectContext deleteObject:blob];
    }
}

Altri suggerimenti

Puoi aggiungere una proprietà unica chiamata md5 all'entità Image per assicurarti di archiviare le stesse immagini una sola volta.

Per quanto riguarda il Core Data, penso che qualcosa del genere potrebbe funzionare: Quindi, crea un'entità padre astratta ( Parent ). Aggiungi una relazione da Parent a Image chiamata image e imposta " Cascade " per il metodo di eliminazione in modo che quando si elimina Parent , anche Image venga eliminato. Aggiungi una relazione da Image a Parent chiamata parent o qualsiasi altra cosa e imposta " Annulla " per il metodo di eliminazione in modo che quando si elimina Image , l'immagine per Parent è impostata su nil . Quindi, aggiungi le altre entità e imposta il loro genitore su Parent .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top