如何在我的项目中创建第二个目标,以便为iOS创建预先填充的数据库

时间:2011-08-17 16:19:39

标签: objective-c ios cocoa-touch cocoa core-data

我目前有一个iOS应用程序,可以从一堆pList文件(我在开发时使用数据库更改时使用它)来“引导”它的数据库,或者在设备上首次运行时复制预先存在的数据库(I使用在模拟器中创建的数据库。

这变得越来越混乱:我必须翻转标志以决定我是否自举,我不想意外分发'bootstrap'版本,我也不想分发plist(然后目标设备将有3个数据副本:捆绑的数据库,plists和数据库的可写副本。

我想要做的是创建一个使用相同对象模型的单独桌面应用程序。桌面应用程序将使用plists,我将运行它来生成数据库(或者甚至可以为数据库调整提供GUI!)。 iPhone和桌面应用程序将共享相同的数据模型。桌面应用程序会写入与iOS应用程序捆绑在一起的数据库,因此我不必记得从模拟器中复制。

到目前为止,我已经能够找到一些帖子,说明这样做是微不足道的......但是教程或提示会有所帮助。

4 个答案:

答案 0 :(得分:1)

萨沙,

我在现有项目中创建了一个新目标,并且能够创建我的自举Core Data DB。这根本不难。您可以重复使用现有的大部分代码。

安德鲁

答案 1 :(得分:0)

你有很多选择。您可以创建一个并排应用程序,其唯一的职责是在主应用程序中预先填充数据库。或者,您可以使用脚本直接填充DB文件。我正在包含一个描述后一种方法的精彩教程的链接。

http://www.raywenderlich.com/980/core-data-tutorial-how-to-preloadimport-existing-data

答案 2 :(得分:0)

我在项目中看到这个问题的方式很简单。制作两个目标,并使用适当的标志配置每个目标。你会有“旗帜翻转”,但不会那么复杂,你可以很容易地分辨出你正在建造哪一个。

答案 3 :(得分:0)

从您的问题来看,听起来好像您可以在桌面上创建Core Data Persistent Store。 (这里需要注意的是确保您使用共享的核心数据模型。)

鉴于此,您应该将数据库捆绑为应用程序资源,并在应用程序启动时找不到它并将其复制到位。

这样的事情应该对你有用:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    if (![self persistentStoreExists]) { // First run.
        [self copyPersistentStoreFromBundleResources];
    }

    // ... continue here.

}

#pragma mark -
#pragma mark First Run Core Data Import 

- (BOOL)persistentStoreExists
{
    NSString *storePath = [[[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite" ] path]; 
    NSFileManager *fileManager = [NSFileManager defaultManager];

    return [fileManager fileExistsAtPath:storePath];
}

- (void)copyPersistentStoreFromBundleResources
{
    NSLog(@"Installing default DB from bundle.");

    NSString *storePath = [[[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite" ] path];

    NSString *defaultStorePath = [[NSBundle mainBundle] 
                                  pathForResource:@"MyApp" ofType:@"sqlite"];

    if (defaultStorePath == nil) {
        NSLog(@"Error finding default store");
        return;
    } else {
        BOOL copiedDefaultStore = [[NSFileManager defaultManager]
                                   copyItemAtPath:defaultStorePath
                                   toPath:storePath
                                   error:nil];
        if (! copiedDefaultStore) {
            NSLog(@"Error copying default store");
            return;
        }
    }
}

#pragma mark -
#pragma mark Application's Documents directory

/**
 Returns the URL to the application's Documents directory.
 */
- (NSURL *)applicationDocumentsDirectory {
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}