2010-01-25 9 views
6

Ich frage mich, ob seine eine kluge Wahl Bilder mit Kerndaten in binäre Eigenschaft speichernCoredata (für iphone) Speichern von Bildern

sagen, dass ich eine Sammlung von Filmen haben, und ich möchte das Bild DVD Cover in eine Eigenschaft speichern die avg Größe einer Abdeckung 20/30kb (320x480px)

der Grund, warum ich dies für das Speichermanagement tun wollen, sobald ich den Film löschen weiß, dass ich das Bild auch

ich bin gelöscht wird nur noch nicht ganz sicher, wenn es eine gute Idee ist, Datenlast, Geschwindigkeit?

hat jemand Erfahrung damit?

+0

Dies ist ein Duplikat von http://stackoverflow.com/questions/1168954/storing-large-eg-image-movie-files-in-core-data-on-the-iphone und http: // stackoverflow. com/questions/2090028/core-data-storing-images-iphone –

Antwort

11

Es scheint mir, dass das Speichern von Bildern in Kerndaten keine gute Idee ist, und ich bin mir ziemlich sicher, dass ich es auch in einem der Programmierhandbücher von Apple gelesen habe. Bedenken Sie, dass beim Abrufen Ihrer Sammlung alle Bilder ebenfalls in den Speicher geladen werden. Selbst wenn Sie nur 8 Bilder anzeigen, wird Ihre gesamte Bildsammlung mit den Kerndaten geladen.

Wenn Sie sicherstellen möchten, dass Sie die Bilddateien löschen, wenn ein Umzug Datensatz gelöscht wurde ich schlage vor, Sie zu Mitteilungen der managedObjectContext hören und Dateien löschen, wenn ein Film gelöscht wurde:

Sie können entweder registrieren Sie sich für den willSave oder didSave Benachrichtigung, jede mit eigenen Vor-/Nachteilen.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:managedObjectContext]; 

bekommen die gelöschten Objekte:

- (void) contextDidSave:(NSNotification *)notification 
{ 
    NSDictionary *userInfo = [notification userInfo]; 
    for (NSManagedObject *currObject in [userInfo objectForKey:NSDeletedObjectsKey]) 
    { 
     // Code for deleting file associated with the NSManagedObject, you can still 
     // access the managed object's properties. 
    } 
} 
+2

Es ist nichts Falsches daran, binäre Daten in Core Data zu speichern, besonders bei den Bildgrößen, mit denen das OP arbeitet. Überprüfen Sie die zwei Links, die als Notiz zur Frage gepostet wurden. Alles unter 100KB kann einfach direkt in Core Data gespeichert werden. –

+1

Natürlich kann es gemacht werden, aber meiner Meinung nach ist es nicht der beste Weg, es zu tun, es sei denn, Sie können kontrollieren, ob die Binärdaten tatsächlich abgerufen und in den Speicher geladen werden. Andernfalls wird das Laden von 100 Datensätzen ohne Angabe von Gründen 2/3 MB in den Speicher laden. –

+0

Speichern Sie einfach Dateipfade als Zeichenfolgen in Coredata und laden Sie sie so? – powerj1984

1

Es fiel mir ein, dass Sie einen anderen Ansatz verwenden kann, die besser sein könnte, wenn Sie bereits NSManagedObject für Ihren Film Einheit Subklassen.

Sie können die Methode didSave oder willSave für NSManagedObject implementieren und die Eigenschaft isDeleted überprüfen. Wenn es gelöscht wird, löschen Sie das Bild von der Festplatte.

7

Die beste Methode besteht darin, den Pfad zum Bild im verwalteten Objekt zu speichern und anschließend die Datei in der Methode prepareForDeletion des Objekts zu löschen.

0

Siehe meine Antwort in:

Can I access the files used for external binary storage in Core Data?

Sie große Dateien in Core Data die Verwendung jetzt speichern können 'Erlaubt External Storage' Option. Das einzige Problem dabei ist, dass nicht mehr nur die reinen Binärdaten auf die eigentlichen Dateien per Pfad zugreifen können. Ich habe eine "kreative" Lösung (ob es die beste Vorgehensweise ist, rät jeder), aber es ermöglicht Ihnen, Core-Daten zu verwenden, um Ihre Dateien zu verwalten, während Sie trotzdem auf die REAL-Dateien zugreifen können.