2010-08-20 134 views
3

当使用核心数据模型创建了SQLite数据库,在这一行:Xcode的SQLite数据库创建无Z_METADATA

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 
+0

你可以显示你的代码来创建PSC('initWithManagedObjectModel:') – falconcreek 2010-08-20 20:02:24

+2

SQLite持久存储数据库是如何创建的?您不能只使用任何旧的SQLite数据库,它需要采用Core Data生成的确切格式。 – 2010-08-20 21:23:45

+0

我加了我的代码。我正在使用由核心数据创建的数据库。感谢您的关注和帮助Brad,falcon和MPelletier。 – Bryan 2010-08-20 21:50:30

回答

0

请与此基本健全检查启动:将数据库到Mac,与sqlite3.exe打开它,看看表是否存在。

如果是,那么你的程序指向错误的数据库。 如果不是,那么你的表从未被创建过(或者数据库像地狱一样腐败,但这会令人惊讶)。

+0

我可以将数据库从我的设备传输到我的Mac,并用Firefox的SQLite Manager打开它,没有任何问题。我不确定Core Data创建数据库时如何指向错误的数据库,并将其成功复制到文档文件夹(通过浏览我的设备文件进行验证)。 – Bryan 2010-08-20 21:46:19

0

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

我建议:

  1. 开商店的应用程序包,即作为只读而不复制它,看看它是否打开罚款。如果是这样,那么问题在于复制。
  2. 给复制方法提供一个错误并记录它的返回值。副本可能会巧妙地失败。
  3. 获取复制文件的大小。该文件可能在目录中结束,但是为空。
  4. 通过一个nil选项字典,以确保这不是问题。
+0

1.应用程序包商店给出相同的结果 2.副本完美工作 3.复制文件和默认文件的大小都是8kb 4.我最初通过零,我得到相同的错误。 感谢您的建议。任何其他? – Bryan 2010-08-21 16:55:46

0

首先,你需要捕捉这些错误,至少他们报告:

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

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

除此之外,假设sqlite文件有效,代码没有任何明显的错误。你可以在示例应用程序中复制它吗?如果是这样,你可以在你的问题中发布一个链接,我会很高兴为它修补。如果事实证明这是一个苹果的bug,那么你将会准备好测试用例。如果它在测试中不重复,那么您可以比较差异以查看原始应用程序中的错误。