【问题标题】:xCode Sqlite Database Creation Without Z_METADATA没有 Z_METADATA 的 xCode Sqlite 数据库创建
【发布时间】:2011-04-01 19:46:05
【问题描述】:

当我的 sqlite 数据库使用核心数据模型创建时,在这一行:

 if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])

我收到一个错误:

 NSUnderlyingException=I/O SQLite error code:1, 'no such table: Z_METADATA'                

知道如何解决这个问题吗?这几天我一直在努力。数据库已创建并复制到我设备上的文档目录中。

注意:

如果我在我的设备上删除、重建和安装应用程序 - .sqlite 文件的日期是两天前,而 .mom 文件的日期是昨天。如有必要,是否在编译时不重新创建数据库?我的项目中没有 .sqlite 文件,只有 .xcdatamodel。

感谢您的宝贵时间。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator_ != nil) {
        return persistentStoreCoordinator_;
    }
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [documentPaths objectAtIndex:0];

    //\MOVES DATABASE TO NEW LOCATION
    NSString *storePath = [documentsDirectory stringByAppendingPathComponent:@"myShoeDatabase.sqlite"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    // If the expected store doesn’t exist, copy the default store.
    if (![fileManager fileExistsAtPath:storePath]) {
        NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"myShoeDatabase" ofType:@"sqlite"];
        if (defaultStorePath) {
            [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
        }
    }

    NSURL *storeURL = [NSURL fileURLWithPath:storePath];
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    NSError *error = nil;
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return persistentStoreCoordinator_;
}

enter code here

【问题讨论】:

  • 您能否展示您创建 PSC 的代码 (initWithManagedObjectModel:)
  • SQLite 持久存储数据库是如何创建的?您不能只使用任何旧的 SQLite 数据库,它需要采用 Core Data 生成的确切格式。
  • 我添加了我的代码。我正在使用由核心数据创建的数据库。感谢您对 Brad、falcon 和 MPelletier 的关注和帮助。
  • 从命令行使用 sqlite> .schema 进行检查后,我只能看到:"CREATE TABLE "locations" ("id" INTEGER PRIMARY KEY NOT NULL ,"name" varchar(50), "lon" FLOAT,"lat" FLOAT);"
  • 这看起来根本不像一个核心数据存储。您的 MOM 中有位置实体吗?

标签: iphone sqlite core-data metadata


【解决方案1】:

请从这个基本的健全性检查开始:将数据库带到您的 Mac,用 sqlite3.exe 打开它,然后查看该表是否存在。

如果是,那么您的程序指向了错误的数据库。 如果不是,那么您的表从未创建过(或者数据库已损坏,但这会令人惊讶)。

【讨论】:

  • 我可以将数据库从我的设备传输到我的 Mac 并使用 Firefox 的 SQLite 管理器毫无问题地打开它。我不确定当 Core Data 创建数据库并成功将其复制到文档文件夹(通过浏览我的设备文件进行验证)时,我如何指向错误的数据库。
【解决方案2】:

Core Data 在打开商店时似乎首先查找元数据,因此有关 Z_METADATA 的投诉通常表明文件损坏或文件格式错误。我怀疑复制的文件有问题(权限、损坏等)或商店的options 有问题。

我建议:

  1. 在应用程序包中以只读方式打开商店,即不复制它,看看它是否可以正常打开。如果是这样,那么问题出在复制中。
  2. 向复制方法提供错误并记录其返回。副本可能会巧妙地失败。
  3. 获取复制文件的大小。该文件可能最终在目录中但为空。
  4. 传递 nil 选项字典以确保这不是问题。

【讨论】:

  • 1.应用程序包商店给出了相同的结果 2. 副本运行良好 3. 复制文件和默认文件的大小均为 8kb 4. 我最初通过 nil 并得到相同的错误。感谢您的建议。还有其他人吗?
【解决方案3】:

首先,您需要捕获这些错误并至少报告它们:

[fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];

此外,该方法返回成功或失败的 BOOL,您也应该注意这一点。

除此之外,假设 sqlite 文件是有效的,那么代码并没有明显的错误。您可以在示例应用程序中复制它吗?如果是这样,您可以在您的问题中发布指向它的链接,我很乐意修改它。如果它被证明是一个 Apple 错误,那么您将为您的雷达准备好测试用例。如果它在测试中没有重复,那么您可以比较差异以查看原始应用程序中的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2015-07-26
    • 1970-01-01
    相关资源
    最近更新 更多