1

我正在使用一个核心数据库,它在 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方法。

任何人都可以帮我解决这个问题。我现在一直在寻找这个问题。

非常感谢。

史蒂夫

4

1 回答 1

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示例。看看

食谱AppDelegate.m

执行。

于 2012-10-22T09:55:10.973 回答