我目前有一个iOS应用程序,可以从一堆pList文件(我在开发时使用数据库更改时使用它)来“引导”它的数据库,或者在设备上首次运行时复制预先存在的数据库(I使用在模拟器中创建的数据库。
这变得越来越混乱:我必须翻转标志以决定我是否自举,我不想意外分发'bootstrap'版本,我也不想分发plist(然后目标设备将有3个数据副本:捆绑的数据库,plists和数据库的可写副本。
我想要做的是创建一个使用相同对象模型的单独桌面应用程序。桌面应用程序将使用plists,我将运行它来生成数据库(或者甚至可以为数据库调整提供GUI!)。 iPhone和桌面应用程序将共享相同的数据模型。桌面应用程序会写入与iOS应用程序捆绑在一起的数据库,因此我不必记得从模拟器中复制。
到目前为止,我已经能够找到一些帖子,说明这样做是微不足道的......但是教程或提示会有所帮助。
答案 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];
}