我有一个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;
}
也许我在代码中忘了一些东西?
有人可以帮我解决这个问题吗?谢谢!
答案 0 :(得分:2)
如何将sqlite数据库从主包复制到应用程序的文档目录,但前提是它还不存在?
答案 1 :(得分:2)
如果您使用的是Core Data或使用sqlite,则可能是将数据存储在“Documents”目录中。更新您的应用时,不会会被删除。
答案 2 :(得分:0)
我对sqlite数据库知之甚少,除了它们是内存数据库。无法“保留”内存数据库。您有两种选择:
1)找到一种方法来配置你的sqlite使用一个文件而不是在内存中运行(我不知道这是否可能,我看起来却找不到快速的方法)
2)切换到其他数据库提供程序。如果你的电脑是你的,你可以安装xampp或wamp(linux上的灯),包含一个预先配置好的,可立即运行的MySql数据库。
最后一种方法是在退出时临时存储sqlite数据,然后在启动时重新加载,但这似乎不是最佳的!
如果您不需要数据库,还可以考虑替代存储,例如xml或flatfile