如何在应用更新上保留现有数据库?

时间:2010-11-11 17:22:57

标签: iphone

我有一个iPhone应用程序,它使用Sqlite数据库来存储一些数据和一些用户配置。我遇到的问题是,当我提交应用程序的更新时,用户安装的现有数据库将覆盖空数据库,用户将丢失其配置。我敢肯定避免这种情况并不太难,但我不知道该怎么办。

这是我创建db:

副本的方法代码
// Creates a writable copy of the bundled default database in the application Documents directory.
- (void)createEditableCopyOfDatabaseIfNeeded {
    // First, test for existence.
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSString *writableDBPath = [self databasePath];
    success = [fileManager fileExistsAtPath:writableDBPath];
    if (!success) {
        // The writable database does not exist, so copy the default to the appropriate location.
        //NSLog(dbName);
        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:dbName];
        success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
        if (!success) {
            NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
        }
    }
}

此方法称为表单:

- (BOOL)openDatabase {
    BOOL success = true;
    if (!database) {
        [self createEditableCopyOfDatabaseIfNeeded];
        if (sqlite3_open([[self databasePath] UTF8String], &database) != SQLITE_OK) {
            success = false;
            // Even though the open failed, call close to properly clean up resources.
            sqlite3_close(database);
            NSAssert1(0, @"Failed to open database with message '%s'.", sqlite3_errmsg(database));
        }
    }
    return success;
}


- (NSString*)databasePath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:dbName];
    return path;
}

也许我在代码中忘了一些东西?

有人可以帮我解决这个问题吗?谢谢!

3 个答案:

答案 0 :(得分:2)

如何将sqlite数据库从主包复制到应用程序的文档目录,但前提是它还不存在?

答案 1 :(得分:2)

如果您使用的是Core Data或使用sqlite,则可能是将数据存储在“Documents”目录中。更新您的应用时,不会会被删除。

答案 2 :(得分:0)

我对sqlite数据库知之甚少,除了它们是内存数据库。无法“保留”内存数据库。您有两种选择:

1)找到一种方法来配置你的sqlite使用一个文件而不是在内存中运行(我不知道这是否可能,我看起来却找不到快速的方法)

2)切换到其他数据库提供程序。如果你的电脑是你的,你可以安装xampp或wamp(linux上的灯),包含一个预先配置好的,可立即运行的MySql数据库。

最后一种方法是在退出时临时存储sqlite数据,然后在启动时重新加载,但这似乎不是最佳的!

如果您不需要数据库,还可以考虑替代存储,例如xml或flatfile