IOS5无法使用核心数据库
Posted
技术标签:
【中文标题】IOS5无法使用核心数据库【英文标题】:Can't use core database in IOS5 【发布时间】:2012-10-22 08:44:09 【问题描述】:我正在使用一个核心数据库,它在 ios 6 中运行,但是当我尝试在 IOS 5 上对其进行测试时。它什么也没做。让我解释一下我在做什么。
首先,我在 viewWillAppear 中执行此操作。
- (void)viewWillAppear:(BOOL)animated
NSLog(@"view appeared");
[super viewWillAppear:animated];
if (!self.genkDatabase)
NSLog(@"comes to here");
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"Default appGenk Database2"];
// url is now "<Documents Directory>/Default Photo Database"
self.genkDatabase = [[UIManagedDocument alloc] initWithFileURL:url]; // setter will create this for us on disk
NSLog(@"database created on disk");
然后是UseDocument方法。
- (void)useDocument
NSLog(@"Comses in the use document");
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.genkDatabase.fileURL path]])
// does not exist on disk, so create it
[self.genkDatabase saveToURL:self.genkDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success)
NSLog(@"create");
[self setupFetchedResultsController];
[self fetchGenkDataIntoDocument:self.genkDatabase];
];
else if (self.genkDatabase.documentState == UIDocumentStateClosed)
NSLog(@"closed news");
// exists on disk, but we need to open it
[self.genkDatabase openWithCompletionHandler:^(BOOL success)
[self setupFetchedResultsController];
];
else if (self.genkDatabase.documentState == UIDocumentStateNormal)
NSLog(@"normal");
// already open and ready to use
[self setupFetchedResultsController];
最后进入 setDatabase 方法。
- (void)setGenkDatabase:(UIManagedDocument *)genkDatabase
if (_genkDatabase != genkDatabase)
_genkDatabase = genkDatabase;
[self useDocument];
NSLog(@"Comes in the setdatabase methode.");
执行所有这些操作会生成以下日志。
2012-10-22 10:42:47.444 RacingGenk[4786:c07] view appeared
2012-10-22 10:42:47.445 RacingGenk[4786:c07] comes to here
2012-10-22 10:42:47.459 RacingGenk[4786:c07] Comses in the use document
2012-10-22 10:42:47.460 RacingGenk[4786:c07] Comes in the setdatabase methode.
2012-10-22 10:42:47.461 RacingGenk[4786:c07] database created on disk
如您所见,它不会在我的使用文档中打印创建日志。所以它无法执行方法FetchDataIntoDocument。
谁能帮我解决这个问题。我一直在寻找这个问题。
非常感谢您。
史蒂夫
【问题讨论】:
【参考方案1】:您是在模拟器上还是在设备上进行测试? 模拟器不区分大小写 - 设备在文件访问时区分大小写,记住这一点!
但除此之外,NSFileManager 的文档建议不要检查文件是否存在,而只是尝试读取文件并优雅地处理任何错误(例如,找不到文件错误)。所以只需尝试加载文件而不是检查它是否存在。
我没有看到您的数据库文件的任何文件扩展名!它只是声明“默认appGenk Database2”。 到目前为止,这已经是文件名还是只是另一个子目录?
编辑:
你可以试试下面的代码:
- (void) setupStore
NSString* storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"mydatabase.sqlite"];
// Set up the store.
NSFileManager* fileManager = [NSFileManager defaultManager];
// If the expected store doesn't exist, create one.
if (![fileManager fileExistsAtPath: storePath])
// create your store here!
- (NSString*) applicationDocumentsDirectory
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
“mydatabase.sqlite”是您希望出现在文档目录中的数据库文件的名称。
如果您想查看有关如何设置核心数据持久存储的完整示例,您可以查看苹果自己的 iPhoneCoreDataRecipes 示例。看看吧
RecipesAppDelegate.m
实施。
【讨论】:
我在模拟器上测试。 Default appGenk Database2 应该有哪些扩展?你能有一些代码吗? 嗨莎拉!我添加了一些可能有帮助的代码,否则请查看链接示例!以上是关于IOS5无法使用核心数据库的主要内容,如果未能解决你的问题,请参考以下文章
Core Data - 无法在 iOS 5.1 上创建持久存储
无法上传由 ios5 构建的应用程序 - 与 UIRequiredDeviceCapabilities 问题有关