2016-08-05 11 views
0

Ich habe eine iOS-App, die in seiner Datenbank findet, was ich glaube, dass eine ziemlich Standard-Weise ist, nämlich:Datei in iOS fehlt

+ (NSString *)dbPath 
{ 
    NSArray *a = 
     NSSearchPathForDirectoriesInDomains(NSCachesDirectory, 
              NSUserDomainMask, YES); 

    NSString *dir = [a objectAtIndex:0]; 
    return [dir stringByAppendingPathComponent:[self dbFile]]; 
} 

Hier dbfile ist eine Funktion, die nur den Namen der Datenbankdatei zurückgibt.

In letzter Zeit haben sich Benutzer darüber beschwert, dass die App manchmal ihre Datenbank nicht findet. Was mache ich falsch? Ich habe mich nicht über die neuesten Änderungen in iOS informiert.

+4

Alles, was Sie im 'NSCachesDirectory' speichern, kann vom System gelöscht werden. – dan

+2

Verwenden Sie das Verzeichnis Caches niemals für alles, was nicht ersetzt werden kann. – rmaddy

+0

Danke Jungs, siehe meine eigene Antwort für weitere Informationen. –

Antwort

0

Jetzt erinnere ich mich.

Ein App-Store-Überprüfer sagte mir, dass ich die Datenbank nicht in dem Verzeichnis speichern konnte, das ich ursprünglich verwenden wollte, da der Inhalt aus dem Internet heruntergeladen wurde. Er hatte natürlich Unrecht, aber ich hatte zu dieser Zeit viel Ärger mit ihnen, also habe ich die Datenbank wie gewünscht in den Cache-Bereich verschoben.

Deshalb wird manchmal gelöscht.

0

Ich speichere auch db in Caches im aktuellen Projekt.Wenn Benutzer die App ausführen, findet es db korrekt.Hauptsächlich verwende ich mit FMDB.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory , NSUserDomainMask, YES); 
NSString *documentsDir = [paths objectAtIndex:0]; 
NSString *documentsDirectory = [documentsDir stringByAppendingPathComponent:strFileName]; 

if (![[NSFileManager defaultManager] fileExistsAtPath:documentsDirectory]) 
{ 
    NSString *backupDbPath = [[NSBundle mainBundle] pathForResource:@"DBName" ofType:@"sqlite"]; 

    NSLog(@"Test backuppath %@",backupDbPath); 
    if (backupDbPath == nil) 
    { 
     NSLog(@"Database path is nil"); 
    } 
    else 
    { 
     BOOL copiedBackupDb = [[NSFileManager defaultManager] copyItemAtPath:backupDbPath toPath:documentsDirectory error:nil]; 
     if (!copiedBackupDb) NSLog(@"Copying database failed"); 
    } 
} 
+0

Dies scheint nicht sinnvoll. Wenn die DB schreibgeschützt ist, muss sie nicht in den Ordner Caches kopiert werden. Lies es einfach aus dem Bündel. Wenn die DB beschreibbar ist, warum sollten Sie sie im Caches-Ordner speichern, wo sie gelöscht werden kann und Änderungen verloren gehen? – rmaddy