2013-02-12 3 views
6

Quando aggiorno la mia app iOS, desidero eliminare tutti i database sqlite esistenti nella directory . In questo momento, su un aggiornamento dell'applicazione, copio il database dal pacchetto alla directory dei documenti e lo denomino aggiungendo la versione del pacchetto. Quindi, nell'aggiornamento, voglio anche eliminare tutte le versioni precedenti che potrebbero esistere.iOS: come eliminare tutti i file esistenti con estensione specifica dalla directory dei documenti?

Voglio solo essere in grado di eliminare tutti i file sqlite, senza dover scorrere e cercare quelli delle versioni precedenti. C'è un modo per usare il jolly nel metodo removeFileAtPath:?

+3

Risposta breve: No. Perché non si desidera eseguire il ciclo? È divertente. – trojanfoe

+1

È necessario utilizzare NSFileManager per ottenere un array di corrispondenze. [Esempio di codice qui] [1]. [1]: http://stackoverflow.com/a/4764532/1445366 –

+0

Che cosa dice la NSFileManager spec dire? –

risposta

13

Quindi, si desidera eliminare tutti i file *.sqlite? Non è possibile evitare il looping, ma è possibile limitarlo utilizzando un NSPredicate per filtrare prima i file non-sql e garantire prestazioni veloci utilizzando l'enumerazione rapida. Ecco un metodo per farlo:

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

Grazie - Il codice sembra funzionare ma il file non viene mai effettivamente eliminato quando esamino l'app in Organizer. È solo una 'caratteristica' di correre in modalità sviluppo? – Michaela

+0

@ Michaela Era un bug nel codice. Non ho fornito il percorso completo a 'removeItemAtPath' in modo che i file non venissero trovati ed eliminati. Risolto ora. – memmons

+0

Suggerirei di usare 'NSError * error = nil;' 'error: & error' invece di' error: nil' per 'removeItemAtPath:' quindi è possibile registrare l'errore se esiste per aiutare a risolvere eventuali problemi. – Robert