2010-12-06 10 views

Antwort

15

Speicher von Video in einer SQLite-Datenbank legen sie einfach eine schreckliche Idee. Tu es nicht.

Stellen Sie keine großen BLOBs in einer Datenbank. Setzen Sie sie in das Dateisystem neben Ihrer Datenbankdatei und schreiben Sie dann die Dateinamen oder eine URL in die Datenbank. Dies wird eine Tonne schneller sein, wird die Datenbank viel effizienter nutzen, wird I/O minimieren (dadurch, dass das Video nicht in das Paging-Schema der Datenbank aufgespalten werden muss, und wird die Verwaltung der Videos erleichtern (ein Dateisystem delete eine Datei ist eine Tonne schneller als eine Datenbank, die eine Reihe von Seiten auszuschneiden aufweist, die das BLOB enthält).

BLOBs in der Datenbank Putting schrecklich ineffizient ist und, möglicherweise, wird Ihre App ausblasen Speicherverbrauch auch (es sei denn, Sie haben eine Möglichkeit gefunden, Daten von der Datenbank zum Videodecoder zu streamen)

Es wird zusätzliche I/O, mehr Leistung, und Leistung wird in der Regel zur Hölle gehen, wie Sie speichern mehr Einträge in der Datenbank, wenn y Wenn Sie BLOBs mit kleinen Daten in der Datenbank mischen, können Sie leicht mit einer pathologisch fragmentierten Datenbank landen. Auto-Staubsaugen wird helfen, aber es ist noch mehr Ineffizienz, mehr I/O und mehr Akkulaufzeit verbraucht.


Ja, es gibt Datenbanken, die BLOBs ziemlich gut im Griff. Und sie sind für diese Frage völlig irrelevant, deren einziges Kennzeichen "iPhone" ist.

Beachten Sie, dass die Antwort auf die Frage "behandelt BLOBs und Streaming Media besser als das Dateisystem" ziemlich immer erfordert, dass Sie eine Datenbank verwenden, die zu/von einem unformatierten Gerät liest/schreibt - eine Partition auf einem Hard Laufwerk, das ist nichts als Datenbankinhalte. Jede andere Lösung wird notwendigerweise eine Schicht über einem vorhandenen Dateisystem sein, und es wird Kosten geben, selbst wenn der Datenbankhersteller die gesamte Engineering-Arbeit (und es ist riesig) ausgeführt hat, um den Datenbankzugriffs-I/O so gut wie möglich zu entsprechen zugrundeliegende Dateisystem-Semantik.

+0

Außerdem sind die Vorteile, sie als Blobs zu speichern, fast nicht existent. Für diese Art von Blob-Speicher in Enterprise-Systemen mit riesigen systemübergreifenden Datenbanken, die verrückte Backup-Schemata und globale Datenreplikation erfordern, mag es möglicherweise gültige Argumente geben - vielleicht - aber keines dieser Dinge trifft auf einem iOS-Gerät zu. –

+0

FWIW, es gibt ein DBMS, das Videodaten gut speichert, und der Hersteller (FrontBase) hat sich die Mühe gemacht, mit dem Quicktime-Team zusammenzuarbeiten, um die Daten reibungslos abzurufen. – NSResponder

+0

Ihre Antwort ist implementierungsabhängig. SQLite ist zwar bei BLOBs schlecht, aber man kann sich leicht eine Datenbank vorstellen, die es nicht gibt, und es gibt offensichtliche Vorteile beim Speichern von Daten in der Datenbank. Zum Beispiel, einfachere Updates und integrierte Unterstützung für die Replikation. Sie müssen ein Urteil treffen, das auf der von Ihnen verwendeten Implementierung und Ihren spezifischen Anforderungen basiert.Denken Sie daran, dass Ihr Dateisystem auch als Datenbank betrachtet werden kann und genau die gleichen Probleme mit der Fragmentierung hat. –

2

Der Datentyp Blob kann beliebige binäre Daten zu speichern, verwendet werden. Insbesondere steht es für B (inary) L (arge) Ob (ject) (http://en.wikipedia.org/wiki/Blob_(computing))

+0

Übersetzung: ja. +1 :-) – Thilo

+0

@Thilo, danke fürs übersetzen meiner müden antwort ;-) –

-2

Ich benutze Blog, um Video in meiner SQLite DataBase zu speichern und seine Arbeit gut, ich habe mehr als 100 Video in meiner Datenbank zu speichern Zeit zu speichern, das Video

+0

kannst du mir bitte einen überblick geben wie man das video und image auch im blob datentyp speichert? –

-1
NSData *imageData; 
NSURL *imageURL = [[NSURL alloc] initWithString:[[videolistArray objectAtIndex:[number intValue]] valueForKey:@"video"] ]; 
if (imageURL) { 
    imageData = [NSData dataWithContentsOfURL:imageURL]; 
} 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

if (!documentsDirectory) { 
    NSLog(@"Documents directory not found!"); 
} 
NSArray *myWords = [[NSString stringWithFormat:@"%@",[[videolistArray objectAtIndex:[number intValue]] valueForKey:@"video"]] componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]]; 

NSString *appFile = [documentsDirectory stringByAppendingPathComponent:[myWords lastObject]]; 

[imageData writeToFile:appFile atomically:YES]; 

in diesem i speichert Video in iphone Dokumentenverzeichnis u es in SQLite Datenbank ist w