我有一个利用Core Data SQLITE3的应用程序,可以在模拟器中完美运行。但是我不明白如何更新设备上的数据库,我猜这与app-store中的相同。
我从应用程序中的.txt文件更新数据库并创建数据库,此功能仅用于创建数据库,并将在最终版本中删除。我的想法是在模拟器中创建数据库,锁定代码的更新部分,然后使用更新的数据库分发包。
但是,当我在设备上重建我的应用程序时,它仍然拥有数据库中的旧数据。
我一直在四处寻找,但我担心我不完全明白如何解决这个问题。我找到了这个帖子:Can't refresh iphone sqlite3 database
如果一个好人能够分享一些有关这方面的信息并帮助我解决这个问题,我将非常感激。
干杯
答案 0 :(得分:0)
您是否已将db文件从bundle目录(只读)复制到可写文件? (比如每个应用程序的文档目录?)。
当尝试保存在设备中时,你得到像这样的sqlite错误吗?
SQLITE_READONLY 8 /* Attempt to write a readonly database */
编辑:
主包中的所有文件都是只读的,因此如果您需要修改其中一个/部分文件,则需要将文件复制到可写的位置。假设你已经调用了db mydb.sqlite,这里有一些代码可以将db(只有它不存在)复制到文档目录。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDirectory = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSFileManager *fm = [NSFileManager defaultManager];
NSString *docPath = [docDirectory stringByAppendingPathComponent:@"mydb.sqlite"];
if (![fm fileExistsAtPath:docPath]) { // file does not exists, copy it
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"mydb" ofType:@"sqlite"];
NSError *error = nil;
BOOL res = [fm copyItemAtPath:bundlePath toPath:docPath error:&error];
if (!res) {
// do something with error
}
}
答案 1 :(得分:0)
实际上在Bundle中使用.db文件 - 这是一个非常糟糕的主意。 每个时候,当我使用.db文件时,我正在检查,如果它已经存在于我的Application文档目录中,那么我将重写它。
#define DB_SHOULD_BE_REWRITTEN YES //You should update database and change allready existing db file to file from bundle
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"];
BOOL success = [fileManager fileExistsAtPath:writableDBPath];
if (!success || DB_SHOULD_BE_REWRITTEN)
{
// The writable database does not exist, so copy the default to the appropriate location.
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"db.sqlite"];
success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if (!success) {
NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
}
}
dbPath = writableDBPath;