2013-02-12 16 views
6

Wenn ich meine iOS-App aktualisiere, möchte ich alle vorhandenen sqlite-Datenbanken im Verzeichnis Documents löschen. Im Moment, bei einem Anwendungsupdate, kopiere ich die Datenbank aus dem Bundle in das Dokumentenverzeichnis und benenne sie durch Anhängen der Bundle-Version. Daher möchte ich beim Update auch eventuell vorhandene alte Versionen löschen.iOS: Wie lösche ich alle vorhandenen Dateien mit einer bestimmten Erweiterung aus dem Dokumentverzeichnis?

Ich möchte nur in der Lage sein, alle sqlite Dateien zu löschen, ohne Schleife durchlaufen und nach denen aus früheren Versionen suchen. Gibt es eine Möglichkeit, die Methode removeFileAtPath: mit einem Platzhalter zu versehen?

+3

Kurze Antwort: Nein. Warum willst du nicht Schleife? Es macht Spaß. – trojanfoe

+1

Sie müssen NSFileManager verwenden, um ein Array der Übereinstimmungen zu erhalten. [Beispielcode hier] [1]. [1]: http://stackoverflow.com/a/4764532/1445366 –

+0

Was bedeutet die NSFileManager spec sagen? –

Antwort

13

Sie möchten also alle *.sqlite Dateien löschen? Es gibt keine Möglichkeit, das Schleifen zu vermeiden, aber Sie können es begrenzen, indem Sie eine NSPredicate verwenden, um zuerst non-sql-Dateien herauszufiltern und eine schnelle Leistung durch schnelle Aufzählung sicherzustellen. Hier ist eine Methode, um es zu tun:

- (void)removeAllSQLiteFiles  
{ 
    NSFileManager *manager = [NSFileManager defaultManager]; 

    // the preferred way to get the apps documents directory 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    // grab all the files in the documents dir 
    NSArray *allFiles = [manager contentsOfDirectoryAtPath:documentsDirectory error:nil]; 

    // filter the array for only sqlite files 
    NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.sqlite'"]; 
    NSArray *sqliteFiles = [allFiles filteredArrayUsingPredicate:fltr]; 

    // use fast enumeration to iterate the array and delete the files 
    for (NSString *sqliteFile in sqliteFiles) 
    { 
     NSError *error = nil; 
     [manager removeItemAtPath:[documentsDirectory stringByAppendingPathComponent:sqliteFile] error:&error]; 
     NSAssert(!error, @"Assertion: SQLite file deletion shall never throw an error."); 
    } 
} 
+0

Danke - Der Code scheint zu funktionieren, aber die Datei wird nie wirklich gelöscht, wenn ich die App im Organizer untersuche. Ist das nur ein Feature im Entwicklungsmodus? – Michaela

+0

@Michaela Es war ein Fehler im Code. Ich habe nicht den vollständigen Pfad zu 'removeItemAtPath' angegeben, so dass die Dateien nicht gefunden und gelöscht wurden. Jetzt behoben. – memmons

+0

Ich würde vorschlagen, 'NSError * error = nil;' 'error: & error' statt' error: nil' für 'removeItemAtPath:' zu verwenden, dann können Sie den Fehler protokollieren, wenn er vorhanden ist, um Probleme zu beheben. – Robert