dfinki
dfinki

Reputation: 342

sqlite3 database strangely disappears from NSDocumentDirectory

Problem: After long time running with no issues, my database is giving me a headache, it just wont stay at its place in the NSDocumentDirectory. The Database strangely disappears.

I never clear the documents-folder or delete anything. It only contains the database and saves some images in there which get downloaded if the user wants to keep them.

Has anybody an idea what could be going on?

after 3 days of struggling with this problem I can't come up with a possible solution, so please help me! :(

in my Database-Singleton I have the following init-Method

- (id)initWithName{
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];

    databasePath = [documentsDir stringByAppendingPathComponent:kDatabaseName];
    //kDatabaseName = nameOfDatabase.db
    [self checkAndCreateDatabase];
    return self;
}

and the checkAndCreateDatabase - method:

- (void) checkAndCreateDatabase{
    // Check if the SQL database has already been saved to the users phone, if not then copy it over
    BOOL success;

    // Create a FileManager object, we will use this to check the status
    // of the database and to copy it over if required
    NSFileManager *fileManager = [NSFileManager defaultManager];

    // Check if the database has already been created in the users filesystem
    NSURL *urlpath = [NSURL fileURLWithPath:databasePath];
    NSError *error = nil;
    [urlpath setResourceValue: [NSNumber numberWithBool: YES]
                       forKey: NSURLIsExcludedFromBackupKey error: &error];
    success = [fileManager fileExistsAtPath:databasePath];

    // If the database already exists then return without doing anything
    if(success && sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
    {
        NSLog(@"database opened");
        sqlite3_close(database);
        return;
    }
    else{
        sqlite3_close(database);
        NSLog(@"Database was created");
    }

    // If not then proceed to copy the database from the application to the users filesystem

    // Get the path to the database in the application package
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
    //NSString *databasePathFromApp = [[NSBundle mainBundle] pathForResource:databaseName ofType:@"sqlite3"];

    // Copy the database from the package to the users filesystem
    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];

    if ([self createTables]){ //creates tables of DB, works fine
        NSLog(@"Tables were created");    
    } else {
        NSLog(@"Database failed to create and open");
    }
}

This code worked for a year straight. and suddenly when i needed to do some updates, the database was not saved anymore. After a lot of troubleshooting I found out the database is being created in the Documents folder, but when i try to access the exact same path (cause i don't touch the variables) it disappears, with it's tables.

I tried different versions of my repository, all of them seem to have the problem. I really am getting mad. :(

Upvotes: 0

Views: 76

Answers (1)

Zack Liston
Zack Liston

Reputation: 220

Are you persisting the databasePath between app launches? In iOS 8 the DocumentsDirectory (and all the others, Caches, tmp, etc) became dynamic - - their name changes in between every app launch. So if you're storing the absolute path anywhere in your app it will be invalid the next time the app launches. If this is the case, a good way to fix it is to store the path relative to the DocumentsDirectory and whenever you need it just call

NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

and append your path to that.

Help this helps.

Upvotes: 1

Related Questions