【问题标题】:new file is created instead of copying file创建新文件而不是复制文件
【发布时间】:2012-08-15 18:06:45
【问题描述】:

编辑:看起来它现在也不能与模拟器一起使用。

更多信息,似乎如果我安装了一个有效的存档版本,然后安装一个不起作用的版本,就在它上面,一切都很好。但是当我删除存档版本并安装新版本时,一切都停止了。

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

【问题讨论】:

  • 您是否尝试从设备中删除该应用并重新安装?
  • @SPVarma 是的,甚至重启了我的手机
  • @SPVarma 实际上,有些有趣。这次我从模拟器中删除了应用程序,当它开始构建时,它和我的 iPhone 做同样的事情。新的 ios6 测试版是否对目录进行了任何更改?
  • @Mukhi:你在哪里实现这个代码?我希望它在 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator ?
  • @mvb no.. 它只是在 viewDidLoad 方法中。它以前工作过,有什么具体原因需要在那里吗?

标签: iphone ios sqlite nsfilemanager


【解决方案1】:

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

当你想在你的包中找到文件时,你可以这样得到:

NSString *dbPathOld = [[NSBundle mainBundle] pathForResource:@"database" ofType:@"sql"];

现在您有了应用程序提供的 sql 文件的路径。

当你想复制它时,你使用这个代码:

NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *dbPathNew = [docDir stringByAppendingPathComponent:@"database.sql"];

其他cmets:

1) 为什么不使用 NSFileManager *fm = [NSFileManager defaultManager];?

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

【讨论】:

  • 我不确定出了什么问题,但没有一个代码对我有用。即使我尝试从它通常所在的只读位置读取数据库,在这种情况下为 dbPathOld,它甚至不会给我无法打开的错误。
  • 那么您是否测试过该文件确实存在?拼写完全正确(大写等)?您是否查看了应用程序包以验证其存在(在 ipa 中?)。您可以使用文件管理器来测试是否存在、验证可读性等。很多人都在做您想做的事情,这与您的应用有关。
  • 我知道文件在那里,而且它被复制了,但我不知道复制的文件中有什么。我唯一能想到的是,由于某种原因,复制的文件是空白的。是的,我意识到很多人都这样做,而且它只是为我工作。但是当我删除旧应用程序并安装新应用程序时,它不起作用,但是当我在旧应用程序上安装新应用程序时,它工作正常。这意味着它与复制的版本有关,对吧?
  • 你有很多事情要做 - 如果你的应用程序第一次运行,你想要复制文件,并且你希望 Core Data 在它移动后打开该文件(但不是之前)。您是否记录了所有这些以便知道操作顺序是正确的?与其在默认值中使用标志,不如直接在文档文件夹中测试复制的文件?如果它在那里,你已经复制了它 - 如果它不在那里,你需要复制它。几乎听起来顺序是错误的,您确实复制了它,但 Core Data 试图过早打开它。第二次启动,找到文件,看起来很神奇。
  • 好吧,由于某种原因,文件一开始就存在,但该文件是空白的。所以我需要检查它是否是第一次运行,如果是,我删除那里的文件,复制正确的文件,最后,打开带有文件路径的数据库。
猜你喜欢
  • 2013-05-27
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多