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

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

最佳答案

您不应该在应用程序中对目录路径进行硬编码 - Apple 提供了获取它们的函数:

当您想在 bundle 中查找该文件时,可以通过以下方式获取:

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)使用您的标准默认值,您是否在应用程序委托(delegate)的初始化方法中注册它们?您在更新值后同步它们(所以实际上“didLaunchFirstTime”是第二次设置的)?您可能需要添加一条日志消息,以便您可以确定。

关于iphone - 创建新文件而不是复制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12037176/

相关文章:

ios - SpriteKit - physicsBody 不尊重边缘

iOS Metal 计算管道比搜索任务的 CPU 实现慢

android - “%”附近的SQLite语法错误

node.js - 使用 Webpack 捆绑 Sqlite3 导致编译错误

android - 父子关系的SQL查询

iphone - iPhone 上的 Fork()

iphone - 创建一个将用户重定向到移动/HTML5 网站的 iPhone 应用程序

iphone - AdWhirl(AdMob、iAd)广告未在已发布的 iPhone 应用程序中显示

ios - 无法在 iOS 模拟器中缩放设备窗口

IOS - 模态 UIView 在内存警告后丢失委托(delegate)