为iPhone和iPad模拟器创建不同的sqlite数据库的路径

时间:2012-01-10 13:40:54

标签: ios core-data ios-simulator

我这里有一个奇怪的问题。我们最近在现有的iPhone应用程序中添加了iPad功能。有一天,应用程序没有在iPad模拟器中启动。原因是:在iPad模拟器中,SQLite数据库的路径不同。

以下方案有效:我在iPhone 5.0模拟器中启动应用程序,让数据库被创建。然后我在iPad模拟器中启动相同的目标,检查数据库文件是否存在并且应用程序启动。

当我从iPhone模拟器中删除应用程序并首先在iPad上启动它时,它崩溃了,因为persistentStoreCoordinator没有被创建。

数据库路径在[MyAppAppDelegate persistentStoreCoordinator]内检索,如下所示:

NSString *databasePath = [[MyApplication sharedApplication] databaseFilePath];

该行的相应方法是:

- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; // objectAtIndex:0 didn't make any difference
}

- (NSString *)databaseFilePath {
    NSString *databasePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MyApp_v3.sqlite"];
    return databasePath;
}

打印数据库路径显示以下内容 iPad和iPhone:

/Users/swramba/Library/Application Support/iPhone Simulator/5.0/Applications/ABF391C4-FCFF-4274-8FD1-E560C2FB58D9/Documents/MyApp_v3.sqlite

现在真正的问题......

但是,当我让iPad创建数据库时,sqlite文件不在此路径下,而是在_Content文件夹的Documents子目录中。

为什么iPad模拟器将它放在那里而iPhone模拟器没有?当两个模拟器中databaseFilePath完全相同时,为什么他甚至会这样做?

任何帮助都非常感谢!

祝你好运, 塞巴斯蒂安

编辑1:

这是应该创建persistentStoreCoordinator 的地方,但应用程序永远不会在iPad模拟器上访问此代码。 (因为它首先检查文件是否存在=>否,然后它检查数据库是否正在创建=>否,将isCreatingDatabase设置为YES(切换到显示警报视图)。下次,getter of persistentStoreCoordinator被调用,文件仍然不存在但它已创建它,而不是它应该在的位置(_Content subdir)

if (persistentStoreCoordinator != nil) {
    return persistentStoreCoordinator;
}

NSURL *storeUrl = [NSURL fileURLWithPath:databasePath];
NSLog(@"SB Store URL: %@", storeUrl);

NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}    

return persistentStoreCoordinator;

0 个答案:

没有答案