创建新文件而不是复制文件

时间:2012-08-20 11:54:59

标签: iphone ios sqlite nsfilemanager

编辑:现在看起来不像是在使用模拟器。

更多信息,似乎如果我安装了一个可以正常工作的存档版本,那么安装一个无法工作的版本,就在它上面,一切都很好。但当我删除存档版本并安装新版本时,那就是当一切都停止工作时。

我只是在我的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以检查数据库是否为空白,但事实并非如此。我不知道发生了什么。

1 个答案:

答案 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”)?您可能希望添加一条日志消息,以便您可以确定。