2013-02-12 12 views
6

Po aktualizacji aplikacji na iOS, chcę usunąć wszystkie istniejące bazy danych sqlite w katalogu Documents. W tej chwili, na aktualizacji aplikacji, kopiuję bazę danych z pakietu do katalogu dokumentów i nadaj jej nazwę, dołączając wersję pakietu. Tak więc, na aktualizacji, chcę również usunąć wszelkie stare wersje, które mogą istnieć.iOS: Jak usunąć wszystkie istniejące pliki z określonym rozszerzeniem z katalogu dokumentów?

Po prostu chcę mieć możliwość usunięcia wszystkich plików sqlite, bez konieczności przechodzenia przez nie i szukania tych z poprzednich wersji. Czy istnieje sposób na wildcard metody removeFileAtPath:?

+3

Krótka odpowiedź: Nie. Dlaczego nie chcesz zapętlić? To zabawne. – trojanfoe

+1

Musisz użyć NSFileManager, aby uzyskać tablicę dopasowań. [Przykładowy kod tutaj] [1]. [1]: http://stackoverflow.com/a/4764532/1445366 –

+0

Czego NSFileManager spec powiedzieć? –

Odpowiedz

13

Czy chcesz usunąć wszystkie pliki *.sqlite? Nie ma sposobu na uniknięcie zapętlenia, ale można go ograniczyć, używając NSPredicate, aby odfiltrować pliki inne niż pliki sql i zapewnić szybką wydajność przy użyciu szybkiego wyliczenia. Oto metoda, aby to zrobić:

- (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

Dzięki - kod wydaje się działać, ale plik nie zostanie faktycznie usunięty po sprawdzeniu aplikacji w Organizatorze. Czy to tylko "funkcja" uruchamiania w trybie deweloperskim? – Michaela

+0

@Michaela To był błąd w kodzie. Nie podałem pełnej ścieżki do 'removeItemAtPath', aby pliki nie zostały znalezione i usunięte. Naprawiono teraz. – memmons

+0

Proponuję użyć 'NSError * error = nil;' 'error: & error' zamiast' error: nil' dla 'removeItemAtPath:' następnie możesz zarejestrować błąd, jeśli istnieje, aby pomóc Ci w debugowaniu problemów. – Robert

Powiązane problemy