2011-12-13 77 views
2

我已经使用Core Data在Xcode中创建了一个默认的iOS应用程序。我在我的项目中放置了一个默认的myDatabase.sqllite文件,我希望在应用程序第一次启动时使用它 - 因此每个用户都不必获取所有新项目。核心数据:如何使用默认数据库?

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

回答

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

我认为这几乎是什么雷Wenderlich这里覆盖:http://www.raywenderlich.com/980/core-数据教程如何对preloadimport存在的数据。你能给我的代码示例,如何确定如果数据库中存在的AppDelegate当应用程序加载,如果没有,复制预先播种的数据库(sqllite)? – dhrm

1

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

我很想看看这个结果,但看看有没有人找到更好的方法。

编辑:刚刚发现这个在Mac编程指南,并假设它是iPhone相似...

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

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

您可以创建数据的属性列表(或其他基于文件的 表示形式),并将其存储为应用程序资源。 当你想使用它时,你必须打开文件并解析 表示来创建管理对象。

你不应该在iOS上使用这种技术,并且只能在Mac OS X上完全需要 。解析文件以创建商店会导致不必要的开销。自己离线创建核心数据存储 要好得多,并直接在您的应用程序中使用它。

而且,我发现这太....

如何使用核心数据我现有的SQLite数据库?

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