Iphone iOS NSFileManager正在复制,但文件不存在';直到下一次加载才响应
我让我们的应用程序将其只读数据库移动到应用程序支持目录,以便内容更新也可以更新它(通过有线更新,而不是应用程序更新)。下面的代码在要通过db复制的应用程序委托中,但是在第一次运行NSFileManager时,在以下尝试中(在该运行期间)查看它是否存在或加载它时,看不到复制的文件。但是,它正在复制它,因为如果我关闭应用程序并重新启动它,一切都会正常工作。我不知所措Iphone iOS NSFileManager正在复制,但文件不存在';直到下一次加载才响应,iphone,ios,sqlite,nsfilemanager,fmdb,Iphone,Ios,Sqlite,Nsfilemanager,Fmdb,我让我们的应用程序将其只读数据库移动到应用程序支持目录,以便内容更新也可以更新它(通过有线更新,而不是应用程序更新)。下面的代码在要通过db复制的应用程序委托中,但是在第一次运行NSFileManager时,在以下尝试中(在该运行期间)查看它是否存在或加载它时,看不到复制的文件。但是,它正在复制它,因为如果我关闭应用程序并重新启动它,一切都会正常工作。我不知所措 NSFileManager *fm = [[[NSFileManager alloc] init] autorelease]; NSE
NSFileManager *fm = [[[NSFileManager alloc] init] autorelease];
NSError *err = nil;
NSURL *ASD = [fm URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&err];
if (!err) {
NSURL* path = [NSURL URLWithString:DATABASE_NAME relativeToURL:ASD];
NSString *bundle = [[ NSBundle mainBundle] pathForResource:@"datafiles/data_main" ofType:@"sqlite"];
if ([fm fileExistsAtPath:[path path]]) {
if([DatabaseManager isBundledDBNewerThenInUse]){
NSLog(@"bundled db is newer");
[DatabaseManager close];
[fm removeItemAtURL:path error:&err];
if (err) {
NSLog(@"Error deleting old DB:%@",err);
}
else {
[fm copyItemAtPath:bundle toPath:[path path] error:&err];
if (err) {
NSLog(@"Error in copying over DB:%@",err);
}
else
{
NSLog(@"db should have been copied over correctly");
}
}
}
}
else{
[fm copyItemAtPath:bundle toPath:[path path] error:&err];
if (err) {
NSLog(@"Error in copying over DB:%@",err);
}
}
}
else
{
NSLog(@"Error in opening AS for DB copy:%@",err);
}
“[DatabaseManager IsBundledBNewertheniuse]”如果应用程序支持目录中的数据库不存在或版本比捆绑包中的版本旧,则返回“是”。在尝试删除数据库之前,它会打开应用程序支持目录中的数据库,从而关闭[DatabaseManager]。如果有帮助的话,我正在数据库管理器中使用FMDB。但正如我在初始加载后所说的,如果你关闭应用程序并重新使用它,它会工作得很好。(在您进行数据库更新时,数据库也不会在第一次加载时更新。)任何帮助都会很好,如果您需要更多信息,请询问!谢谢 从您描述的行为(即,您重新启动应用程序,然后它会找到复制的数据库)听起来有点像您可能错过了某个关键的数据库打开/关闭调用
我会仔细检查您在哪里对数据库进行任何打开和关闭调用,并确保它是合理的。您是否错过了数据库打开呼叫?在复制发生后,如果数据库从应用程序包复制到应用程序支持目录,上述代码中是否应该有一个数据库打开调用?答案是在主线程上进行dispatch_async,然后仔细检查缓存的数据,并在需要时重新加载它。更正代码:
dispatch_async(dispatch_get_main_queue(),^(){
NSFileManager *fm = [[[NSFileManager alloc] init] autorelease];
NSError *err = nil;
NSURL *ASD = [fm URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&err];
if (!err) {
NSURL* path = [NSURL URLWithString:DATABASE_NAME relativeToURL:ASD];
NSString *bundle = [[ NSBundle mainBundle] pathForResource:@"datafiles/data_main" ofType:@"sqlite"];
if ([fm fileExistsAtPath:[path path]]) {
if([DatabaseManager isBundledDBNewerThenInUse]){
NSLog(@"bundled db is newer");
[DatabaseManager close];
[fm removeItemAtURL:path error:&err];
if (err) {
NSLog(@"Error deleting old DB:%@",err);
}
else {
[fm copyItemAtPath:bundle toPath:[path path] error:&err];
if (err) {
NSLog(@"Error in copying over DB:%@",err);
}
else
{
NSLog(@"db should have been copied over correctly");
}
}
}
}
else{
[fm copyItemAtPath:bundle toPath:[path path] error:&err];
if (err) {
NSLog(@"Error in copying over DB:%@",err);
}
else
NSLog(@"DB Copied");
}
}
else
{
NSLog(@"Error in opening AS for DB copy:%@",err);
}
});
将一些日志记录到打开和关闭函数中,发现它们甚至没有被调用。“fileExistsAtPath:”测试在达到这个程度之前就失败了。所以这个想法很好(我自己也有过),但恐怕不是这样(还有其他想法吗?