核心数据:如何使用默认数据库?

时间:2011-12-13 08:31:13

标签: objective-c core-data

我在Xcode中使用Core Data创建了一个默认的iOS应用程序。我在我的项目中放置了一个默认的myDatabase.sqllite文件,我想在第一次启动应用程序时使用它 - 所以每个用户都不必获取所有新项目。

如何在应用程序启动时更改AppDelegate.m中的代码以使用我的默认myDatabase.sqllite?

2 个答案:

答案 0 :(得分:4)

我通常创建我的持久存储并在模拟器中预先播种它,与在设备上相比,这是非常好的和快速的,特别是如果数据来自网络或XML。然后我将该文件的输出(.sqlite)复制到项目包中。

然后当你启动应用程序时,检查一下,如果数据库不存在于持久性存储协调器所在的位置,那么将预先插入的数据库从包中复制到正确的位置。

我相信这就是@simon谈到的文档所指的是什么时候它会创建一个单独的持久存储并将其复制到位。

<强>更新
看看NSFileManager它有以下方法

- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error
  

<强>讨论
  ...如果dstPath上已存在同名文件,则此方法将中止复制尝试并返回相应的错误。

由于之前的事实,您可能只是使用该方法而不是尝试做任何

- (BOOL)fileExistsAtPath:(NSString *)path

哪种寒冷可能会导致竞争条件。

因此,在加载NSPersistentStoreCoordinator之前,您需要执行以下操作:

NSString *seededDatabasePath = [[NSBundle mainBundle] pathForResource:@"myDB" ofType:@"sqlite"];

NSError *error = nil;
BOOL didCopy = [[NSFileManager defaultManager] copyItemAtPath:seededDatabasePath
                                                       toPath:fileDatabasePath
                                                        error:&error];

if (!didCopy) {
    // .. make sure that the error isn't something bad
}

答案 1 :(得分:1)

我不确定你能做到这一点。通常的方法是在运行时从XML或PLists填充Core Data表。我个人在用户默认值中有一个版本标记,我在应用程序启动时检查。如果找不到(或版本错误),我会运行XML解析器来提取默认数据。

我很想看到这个结果,看看是否有人找到了更好的方法。

编辑:刚刚在mac编程指南中找到了这个,并假设它与iPhone类似......

  

您可以创建包含默认值的单独持久性存储   数据并将商店包含为应用程序资源。当你想要的时候   要使用它,您必须将整个商店复制到合适的商店   位置,或将对象从默认存储区复制到现有存储区   存储。

     

对于小型数据集,您可以直接在其中创建托管对象   代码。

     

您可以创建属性列表 - 或其他一些基于文件的列表   表示数据,并将其存储为应用程序资源。   当您想要使用它时,您必须打开文件并解析   用于创建托管对象的表示。

     

你不应该在iOS上使用这种技术,并且只有绝对使用   在Mac OS X上必需。解析文件以创建商店   不必要的开销创建Core Data存储更好   离线并直接在您的应用程序中使用它。

此外,我也发现了这个......

  

如何将现有的SQLite数据库与Core Data一起使用?

     

你没有。虽然Core Data支持SQLite作为其持久存储之一   类型,数据库格式是私有的。您无法创建SQLite   数据库使用本机SQLite API并直接与Core Data一起使用   (也不应该使用现有的Core Data SQLite存储来操作   原生SQLite API)。如果您有现有的SQLite数据库,则需要   将其导入Core Data存储(请参阅“高效导入”   数据”)。