2011-01-17 8 views
4

Ich versuche zu sehen, wie der beste Weg, um große Mengen an Text (mehr als 255 Zeichen) in Cocoa zu speichern wäre. Da ich ein großer Fan von Core Data bin, würde ich davon ausgehen, dass es einen effektiven Weg dafür gibt. Ich denke jedoch, dass "String" der falsche Datentyp für diese Art von Sache ist. Hat jemand irgendwelche Infos dazu? Ich sehe keine Option für BLOB in Core DataSpeichern großer Textmengen in Core Data

+0

Ist dies auf iOS oder Mac OS X? –

+0

Haben Sie schon versucht, NSString zu verwenden? NSString und Core Data sollten kein Problem mit Zeichenfolgen haben, die viel größer als 255 Zeichen sind. – kubi

+0

@Joe Blow Core Daten werden von SQLite unterstützt. d. h. Core Data ist "ein Datenbankjob". –

Antwort

5

Nun, Sie können den Text nicht sehr gut komprimieren oder als eine binäre Datei speichern, die übersetzt werden muss, ansonsten müssen Sie die SQLite Abfragegeschwindigkeit (weil alle Text gespeichert als binärcodierte Daten) Datensätze sein in den Speicher einlesen, übersetzt/dekomprimiert, dann gesucht). Andernfalls müssten Sie die Nur-Text-Darstellung in Ihrem Core Data Store neben den umfangreicheren Funktionen spiegeln (und beibehalten).

Wie wäre es mit einer Hybridlösung? Core Data speichert alle außer dem eigentlichen Text; Der Text selbst wird auf dem Dateisystem als Ein-Datei-pro-Eintrag-in-Core-Daten archiviert. Jede Datei wird im Core Data Store nach ihrer eindeutigen Kennung benannt. Auf diese Weise könnte eine Suche zwei Dinge tun (natürlich im Hintergrund): Durchsuchen Sie den Core Data Store nach Titeln, Daten usw. Durchsuchen Sie die Dateien (vielleicht sogar mit Spotlight) für die Inhaltssuche. Wenn eine Übereinstimmung mit der Dateisuche besteht, wird der Dateiname verwendet, um den übereinstimmenden Datensatz in den Stammdaten zur Anzeige auf der Benutzeroberfläche Ihrer App zu finden.

Damit können Sie Ihre anwendungsspezifischen internen Suchkriterien und Spotlight die programmatische asynchrone Suche nutzen. Es ist ein bisschen mehr Arbeit, selbstverständlich, aber wenn Sie über eine Menge Text sprechen, kann ich mir keinen besseren Weg vorstellen.

+0

danke für das Feedback josh! Ich bin nur neugierig - die Dokumentation beschreibt die Verwendung von Binärdateien für große Mengen (KB- zu mehreren MB) also würde es weh tun, das zu verwenden? Es scheint einfach praktischer zu sein, die Daten in Core Data zum Suchen und Indizieren zu speichern, und nur Zuverlässigkeit? – Zakman411

+0

Sie können nicht direkt im SQLite-Speicher nach Text in binären Informationen suchen. Jeder "Datensatz" (jede Instanz der gegebenen Entität) müsste eingelesen werden, decodiert werden (ist jedoch angemessen, um Ihre Textinformationen zu erhalten) und dann im Speicher gesucht. Sehr ineffizient. –

+0

Als ein Bonus minimiert der Link-to-External-Files-Ansatz das Risiko, dass ein schlechtes Byte Ihr gesamtes Dokument/Ihre gesamte Datenbank zerstört. Ein beträchtlicher Brocken Fleisch (der Text) ist immer noch sicher, selbst wenn die Datenbank durcheinander gebracht wird. –

0

Ich würde empfehlen, lesen Sie die Core Data Programming Guide von Apple (speziell die "Core Data Performance" Abschnitt). Dies erwähnt speziell BLOBs (siehe Abschnitt "Large Data Objects (BLOBs)") und gibt einige, wenn auch vage, Richtlinien.

2

Der BLOB-Datentyp wird in Core Data als "Binärdaten" bezeichnet. Wie Middaparka darauf hingewiesen hat, bietet die Core Data Programming Guide eine Anleitung zum Umgang mit binären Daten in Core Data. Abhängig von Ihren Anforderungen wäre eine Alternative zur Verwendung von BLOBs, nur Verweise auf Dateien auf der Festplatte zu speichern.

+0

Erwähnte die Option "on disk, reference in DB", aber er muss manuell sicherstellen, dass die Ressourcen auf dem Datenträger gelöscht werden, wenn das Objekt gelöscht wird, da Core Data den Verweis natürlich nur löschen wird. –

+0

Einfache Handhabung mit einer grundlegenden NSManagedObject-Unterklasse für die Entität, die auf die Methoden insert/save/delete ... reagiert. Ich verwende diesen Ansatz, um durch Spotlight durchsuchbare "Stubs" einer iTunes-ähnlichen zentralen Datenbank zu erstellen, die vom Core Data + SQLite-Speichertyp verwaltet wird. –