编辑:现在看起来不像是在使用模拟器。
更多信息,似乎如果我安装了一个可以正常工作的存档版本,那么安装一个无法工作的版本,就在它上面,一切都很好。但当我删除存档版本并安装新版本时,那就是当一切都停止工作时。
我只是在我的iPhone上测试我的应用程序,它运行得很好,当我存档它,并在我的手机上安装了ipa时,数据库停止工作。加载数据库时没有错误,就像我之前说的那样,它只是工作。我没有更改任何代码。它仍然可以在模拟器上运行,所以我知道它与复制数据库有关。这是相关的代码:
dbPath=[NSString stringWithFormat:@"%@/Documents/database.sql", NSHomeDirectory()];
// Get the documents directory
NSFileManager *fmngr = [[NSFileManager alloc] init];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"database.sql" ofType:nil];
NSError *error;
if(![[NSUserDefaults standardUserDefaults] boolForKey:@"didLaunchFirstTime"])
{
[[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"didLaunchFirstTime"];
[fmngr removeItemAtPath:[NSString stringWithFormat:@"%@/Documents/database.sql", NSHomeDirectory()] error:&error];
if(![fmngr copyItemAtPath:filePath toPath:[NSString stringWithFormat:@"%@/Documents/database.sql", NSHomeDirectory()] error:&error])
{
// handle the error
NSLog(@"Error creating the database: %@", [error description]);
}
}
我的查询看起来像这样,因为我正在使用FMDB来查询数据库。它是在用户按下搜索按钮时调用的单独方法。
FMResultSet *s = [db executeQueryWithFormat:@"SELECT Gurmukhi, ShabadID, FirstLetterStr FROM Shabad WHERE FirstLetterStr LIKE %@", searchString];
我还解压缩了ipa以检查数据库是否为空白,但事实并非如此。我不知道发生了什么。
答案 0 :(得分:1)
您不应该在应用程序中硬编码目录路径 - Apple提供了获取它们的功能:
如果要在捆绑包中找到该文件,可以这样理解:
NSString * dbPathOld = [[NSBundle mainBundle] pathForResource:@“database”ofType:@“sql”];
现在您有了一个通过应用程序提供的sql文件的路径。
如果要复制它,请使用以下代码:
NSString * docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject]; NSString * dbPathNew = [docDir stringByAppendingPathComponent:@“database.sql”];
其他评论:
1)为什么不使用NSFileManager * fm = [NSFileManager defaultManager];?
2)使用标准默认值,您是在app delegate中的initialize方法中注册它们吗?您在更新值后正在同步它们(所以实际上第二次设置了“didLaunchFirstTime”)?您可能希望添加一条日志消息,以便您可以确定。