2009-11-12 3 views

Antwort

9

Ich fand this answer on the Apple Dev Forums als nützlich für das Auffinden von Speicherplatz auf der Home-Verzeichnispartition der Anwendungen (beachten Sie, dass derzeit zwei Partitionen auf jedem Gerät vorhanden sind).

Verwenden Sie NSPersistentStoreCoordinator, um Ihre Geschäftskollektion zu erhalten.

Verwenden NSFileManager auf jede Größe speichert erhalten in Bytes (unsigned long long)

NSArray *allStores = [self.persistentStoreCoordinator persistentStores]; 
unsigned long long totalBytes = 0; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
for (NSPersistentStore *store in allStores) { 
    if (![store.URL isFileURL]) continue; // only file URLs are compatible with NSFileManager 
    NSString *path = [[store URL] path]; 
    DebugLog(@"persistent store path: %@",path); 
    // NSDictionary has a category to assist with NSFileManager attributes 
    totalBytes += [[fileManager attributesOfItemAtPath:path error:NULL] fileSize]; 
} 

Beachten Sie, dass der Code oben in einem Verfahren meiner AppDelegate ist, und es hat eine Eigenschaft persistentStoreCoordinator.

+0

Vielen Dank :-) – Nic

9

Ihr persistenter Speicher in Core Data ist nur eine Datei im Dateisystem. Sie greifen auf diese Datei zu und erstellen sie möglicherweise, wenn Sie Ihren Core Data-Stack erstellen. Der folgende Code wird die Größe eines persistenten Speicher und den freien Speicherplatz des Dateisystems, in Bytes drucken:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *persistentStorePath = [documentsDirectory stringByAppendingPathComponent:@"persistentstore.sqlite"]; 

NSError *error = nil; 
NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:persistentStorePath error:&error]; 
NSLog(@"Persistent store size: %@ bytes", [fileAttributes objectForKey:NSFileSize]); 

NSDictionary *fileSystemAttributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:persistentStorePath error:&error]; 
NSLog(@"Free space on file system: %@ bytes", [fileSystemAttributes objectForKey:NSFileSystemFreeSize]); 

Dies setzt voraus, dass Ihr persistenten Speicher wird persistentstore.sqlite genannt und ist im Dokumentenverzeichnis für Ihre Anwendung gespeichert. Wenn Sie sich bezüglich des Namens Ihres persistenten Speichers unsicher sind, suchen Sie nach dem Ort, an dem Sie Ihren NSPersistentStoreCoordinator zuweisen und initalisieren. Der Name des Geschäfts sollte irgendwo in dem Code dort angegeben werden.

Beachten Sie, dass die von den Datei- und Dateisystemattribut-Wörterbüchern zurückgegebenen Werte NSNumbers sind. Sie müssen sie daher in Skalartypen konvertieren, wenn Sie auf diese Weise mit den Dateigrößen arbeiten möchten. Eine Sache, auf die Sie achten sollten, ist, dass diese Werte in Bytes angegeben sind. Bei Multi-Gigabyte-Dateisystemen könnten Sie daher mit 32-Bit-Ganzzahl-Datentypen auf Größenbeschränkungen stoßen.

+0

Danke Brad. Es ist hilfreich ... – Nic

+0

@Brad: Wissen Sie, ob das System einer App erlaubt, die volle (oder nahe) Nutzung des freien Speicherplatzes im Dateisystem zu nutzen? Oder gibt der freie Speicherplatz das Maximum zurück, das das System der App zuweist? – mahboudz

+0

Auf einem Gerät scheint es, den gesamten Speicherplatz im internen Flash-Speicher freizugeben (der zurückgegebene Wert entspricht dem von iTunes gemeldeten freien Speicherplatz). Ich nehme an, dass die Anwendung so viel Platz zum Arbeiten hat. –

1

Nicht sicher, wo ich es sah, aber ich glaube,, dass das Entfernen von Einträgen aus der Datenbank wird nicht unbedingt die Datenbankdatei verkleinern. SQLite lädt den Speicher intern zurück und verwendet ihn erneut. (Dies ist typisch für RDBMS.) Ich glaube, irgendwo gibt es ein Befehlszeilendienstprogramm, das es komprimieren wird, aber das wird Ihnen nicht helfen, wenn Ihre App die Datei auf das Dataset verkleinern möchte (um beispielsweise Speicherplatz für das Betriebssystem freizugeben). .

Während die Dateigrößenmethode Ihnen einen Eindruck von der High-Water-Mark-Größe der Datenbank vermittelt, wird Ihnen nicht unbedingt die Speichermenge mitgeteilt, die von Ihrem Dataset verwendet wird.

Verwandte Themen