重置SQLite数据库为默认值

3

我正在编写一个重置函数,目的是将我的SQLite数据库恢复到初始状态,并填入一些预加载数据。下面的代码从文件夹中删除数据库并从绑定中复制数据库,但仍然显示来自旧数据库的数据?

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"MoneyMonthly.sqlite"];

 if([[NSFileManager defaultManager] fileExistsAtPath:filePath]){ 

    [[NSFileManager defaultManager]      removeItemAtPath:filePath error:nil]; 

}

BOOL success; 
NSFileManager *fileManager = [NSFileManager defaultManager]; NSError *error;

NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"MoneyMonthly.sqlite"]; 
 NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"MoneyMonthly.sqlite"]; 

 success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 

if (!success) {

    NSAssert1(0, @"Failed to create writable   database file with message '%@'.", [error localizedDescription]); 
}
2个回答

2

只需关闭现有的sqlite数据库,然后再次从捆绑包中复制它,覆盖您现有的数据库。这基本上与您第一次复制时所做的方式相同。


谢谢,我在关闭数据库后尝试以下操作:NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"MoneyMonthly.sqlite"];if([[NSFileManager defaultManager] fileExistsAtPath:filePath]){ [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil]; } - Carl
BOOL 成功; NSFileManager *文件管理器 = [NSFileManager defaultManager]; NSError *错误; NSString *可写DB路径 = [documentsDirectory stringByAppendingPathComponent:@"MoneyMonthly.sqlite"]; NSString *默认DB路径 = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"MoneyMonthly.sqlite"];成功 = [文件管理器 copyItemAtPath:默认DB路径 toPath:可写DB路径 error:&错误]; if (!成功) { NSAssert1(0, @"无法创建可写数据库文件,错误信息为 '%@'.", [错误 localizedDescription]); } - Carl
还有,它能正常工作吗?如果不能,请告诉我们错误信息,我们会尽力帮助你。另外,如果你将代码添加到你的问题中并将其格式化为代码,那么它将更易读,并且每个人都可以看到并提供帮助。 - lnafziger
抱歉,我尝试过格式化,没有出现任何错误,但还是保留了一些原始数据库中输入的数据。 - Carl
看起来应该可以工作。尝试在if语句内部添加一个NSLog语句,在删除原始数据库后立即查看是否被调用。你是否可能使用了错误的现有数据库路径? - lnafziger
显示剩余6条评论

2
我在我的一个应用程序中这样做。我在应用程序的包中保留了一个预先构建好的数据库文件。该数据库具有所有表和示例数据。
当我需要重置用户的数据库时,我关闭它,然后使用来自包的干净副本覆盖数据库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接