我已经创建一个列表中的应用程序,并支持它的核心数据。

我想有一个默认的列表说,10个机场的项目,使用户不必从头开始。

是否有任何方式做到这一点?

任何帮助表示赞赏。在此先感谢。

有帮助吗?

解决方案

这里是最好的方式(并且不需要SQL知识):点击 创建使用相同的对象模型的应用程序列表快速核心数据的iPhone应用程序(甚至是Mac应用程序)。写的几行代码,以节省您想以到店默认的管理对象。然后,运行在模拟器应用程序。现在,到〜/库/应用程序支持/ iPhone模拟器/用户/应用。找到的GUID中您的应用程序,然后只要复制sqlite的商店出来到您的列表应用程序的项目文件夹。

然后,存储负载像他们在CoreDataBooks例子做。

其他提示

是的那实际上是在CoreDataBooks例这样做,你可以下载这里的代码: 代码样本

你要做的就是创建内部商店(数据库),使用正常程序初始化你的店就像任何其他的商店,然后你只需运行你的代码,让它执行代码中所描述的CoreDataBooks例(代码段以下)。一旦将储存已经被初始化你会想要创建一个 NSManagedObjectContext 和初始化与创建持久性储存,插入的所有实体需要,并保存上下文。

一旦方面已经成功地保存,你可以停止你的应用程序,然后去取景器和走到文件夹: ~/Library/Developer 类型的搜索。源码和看下/开发人员,按日期排序会给你的最近一些。源码数据库,其中应相匹配的时间,执行代码,然后可以采取这种存储和增加它作为一种资源的项目。这一文件,然后可以读通过的持久性存储协调员。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

if (persistentStoreCoordinator) {
    return persistentStoreCoordinator;
}


NSString *storePath = [[self applicationDocumentsDirectory]      stringByAppendingPathComponent: @"CoreDataBooks.sqlite"];
 /*
  Set up the store.
 For the sake of illustration, provide a pre-populated default store.
 */
NSFileManager *fileManager = [NSFileManager defaultManager];
// If the expected store doesn't exist, copy the default store.
if (![fileManager fileExistsAtPath:storePath]) {
  NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"CoreDataBooks"      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]; 
  persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

 NSError *error;
 if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
  // Update to handle the error appropriately.
  NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
 exit(-1);  // Fail
}    

return persistentStoreCoordinator;
}

希望这有所帮助。

-奥斯卡

使用这种方法,你不必做一个单独的应用程序或有任何SQL知识。你只需要能够做出一个JSON文件为您的初始数据。

我使用我解析为对象JSON文件,然后在核心数据插入。我这样做时,应用程序初始化。我还让我的核心数据中的一个实体,表明如果这一初步数据已经被插入,我插入初始数据后,我把这个实体,以便在下一次脚本运行它看到的初始数据已经被初始化。

要读JSON文件为对象:

NSString *initialDataFile = [[NSBundle mainBundle] pathForResource:@"InitialData" ofType:@"json"];
NSError *readJsonError = nil;
NSArray *initialData = [NSJSONSerialization
                        JSONObjectWithData:[NSData dataWithContentsOfFile:initialDataFile]
                        options:kNilOptions
                        error:&readJsonError];

if(!initialData) {
    NSLog(@"Could not read JSON file: %@", readJsonError);
    abort();
}

然后你就可以像这样为它的实体对象:

[initialData enumerateObjectsUsingBlock:^(id objData, NSUInteger idx, BOOL *stop) {

    MyEntityObject *obj = [NSEntityDescription
                          insertNewObjectForEntityForName:@"MyEntity"
                          inManagedObjectContext:dataController.managedObjectContext];

    obj.name = [objData objectForKey:@"name"];
    obj.description = [objData objectForKey:@"description"];

    // then insert 'obj' into Core Data

}];

如果你想在如何做到这一点更详细的描述,看看这个教程: http://www.raywenderlich.com/12170/core-数据教程如何到preloadimport存在数据更新的

有关10个项目,你可以做到这一点applicationDidFinishLaunching:内的应用程序委托。

定义的方法,说insertPredefinedObjects,创建并填充负责管理您的机场项目的实体的情况下,节省您的上下文。您既可以从文件中读取的属性或干脆硬连线它们在你的代码。然后,调用内部applicationDidFinishLaunching:此方法。

铭记,当下的CoreDataBooks例码,它可能打破iOS数据存储准则:

https://developer.apple.com/icloud/documentation/data-storage/

我有一个应用程序拒绝复制(read-only)预先填充数据库的文献目录的,因为它然后得到备份的选择和苹果只希望这种情况发生,用户生成的文件。

上述准则提供一些解决方案,但他们主要归结于:

  • 储存数据库在缓存目录,并正常处理的情况下,OS清除缓存-你将要重建的数据库,这可能规则,它为我们中的大多数。

  • 设置一个'不高速缓存的属性'在数据库文件,该文件是一点神秘的,因为它需要做的事情以不同的方式对不同的操作系统版本。

我不认为这太棘手的,但要知道,你有一点的额外要做,例码一起工作iCloud...

因此,我已经开发出从字典(可能来自JSON)加载并填充数据库的通用方法。 它应该只与信任的数据使用(从一个安全通道),它不能处理循环引用和架构迁移可能会出现问题......但对于简单的用例像我这应该是罚款。

下面它去

- (void)populateDBWithDict:(NSDictionary*)dict
               withContext:(NSManagedObjectContext*)context
{
    for (NSString* entitieName in dict) {

        for (NSDictionary* objDict in dict[entitieName]) {

            NSManagedObject* obj = [NSEntityDescription insertNewObjectForEntityForName:entitieName inManagedObjectContext:context];
            for (NSString* fieldName in objDict) {

                NSString* attName, *relatedClass, *relatedClassKey;

                if ([fieldName rangeOfString:@">"].location == NSNotFound) {
                    //Normal attribute
                    attName = fieldName; relatedClass=nil; relatedClassKey=nil;
                } else {
                    NSArray* strComponents = [fieldName componentsSeparatedByString:@">"];
                    attName = (NSString*)strComponents[0];
                    relatedClass = (NSString*)strComponents[1];
                    relatedClassKey = (NSString*)strComponents[2];
                }
                SEL selector = NSSelectorFromString([NSString stringWithFormat:@"set%@:", attName ]);
                NSMethodSignature* signature = [obj methodSignatureForSelector:selector];
                NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature];
                [invocation setTarget:obj];
                [invocation setSelector:selector];

                //Lets set the argument
                if (relatedClass) {
                    //It is a relationship
                    //Fetch the object
                    NSFetchRequest* query = [NSFetchRequest fetchRequestWithEntityName:relatedClass];
                    query.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:relatedClassKey ascending:YES]];
                    query.predicate = [NSPredicate predicateWithFormat:@"%K = %@", relatedClassKey, objDict[fieldName]];

                    NSError* error = nil;
                    NSArray* matches = [context executeFetchRequest:query error:&error];


                    if ([matches count] == 1) {
                        NSManagedObject* relatedObject = [matches lastObject];
                        [invocation setArgument:&relatedObject atIndex:2];
                    } else {
                        NSLog(@"Error! %@ = %@ (count: %d)", relatedClassKey,objDict[fieldName],[matches count]);
                    }


                } else if ([objDict[fieldName] isKindOfClass:[NSString class]]) {

                    //It is NSString
                    NSString* argument = objDict[fieldName];
                    [invocation setArgument:&argument atIndex:2];
                } else if ([objDict[fieldName] isKindOfClass:[NSNumber class]]) {

                    //It is NSNumber, get the type
                    NSNumber* argument = objDict[fieldName];
                    [invocation setArgument:&argument atIndex:2];

                }
                [invocation invoke];


            }

            NSError *error;
            if (![context save:&error]) {
                NSLog(@"%@",[error description]);
            }
        }
    }   
}

和从JSON ...

的负载
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"initialDB" ofType:@"json"];
NSData *jsonData = [NSData dataWithContentsOfFile:filePath];

NSError* error;
NSDictionary *initialDBDict = [NSJSONSerialization JSONObjectWithData:jsonData
                                                           options:NSJSONReadingMutableContainers error:&error];

[ self populateDBWithDict:initialDBDict withContext: [self managedObjectContext]];

JSON实例

    {
    "EntitieA": [ {"Att1": 1 }, {"Att1": 2} ],
    "EntitieB": [ {"Easy":"AS ABC", "Aref>EntitieA>Att1": 1} ]
    }

{
    "Country": [{"Code": 55, "Name": "Brasil","Acronym": "BR"}],
    "Region": [{"Country>Country>code": 55, "Code": 11, "Name": "Sao Paulo"},
               {"Country>Country>code": 55, "Code": 31, "Name": "Belo Horizonte"}]
}

如何检查是否存在任何对象,如果没有,创建一个有一些数据?

NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Settings"];
_managedObjectSettings = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];

if ([_managedObjectSettings count] == 0) {
    // first time, create some defaults
    NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Settings" inManagedObjectContext:managedObjectContext];

    [newDevice setValue:[NSNumber numberWithBool: YES ] forKey:@"speed"];
    [newDevice setValue:[NSNumber numberWithBool: YES ] forKey:@"sound"];
    [newDevice setValue:[NSNumber numberWithBool: NO ] forKey:@"aspect"];
    [newDevice setValue:[NSNumber numberWithBool: NO  ] forKey: @"useH264"];
    [newDevice setValue:[NSNumber numberWithBool: NO ] forKey: @"useThumbnail"];

    NSError *error = nil;
    // Save the object to persistent store
    if (![managedObjectContext save:&error]) {
        NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
    }
}

这答案是唯一的人是谁

  • 其中包括一个预先填充数据库在你的程序
  • 使用多平台(iOS,机,等等。)

我做了一个预先填充源码数据库应用程序。然后当我是一个iOS版本的应用程序,我认为这将是最好使用核心数据。所以我花了很长时间学习的核心数据,然后重写代码,以预填充数据库。学习如何做到的每一个步骤,在这两个平台所需要的大量的研究和试验和错误。有多少重叠比我会有希望。

在结束我只是决定使用同样的源码数据库从我的机器人项目。然后我用FMDB包装以直接访问数据库在内部监督事务办公室的。好处:

  • 只需要使数据库预先填充一次。
  • 并不需要一个模式转变。该法在和FMDB,而不同,仍然是相当类似的。
  • 有更多的控制如何查询进行。
  • 允许全文搜索。

虽然我不感到遗憾的学习核心数据,如果我这样做过我可以挽救很多的时间只要坚持到源码.

如果你们开始在iOS,然后规划的移动机器人,我仍然使用源码包装喜欢FMDB或一些其他的软件,以预填充数据库。尽管技术上可以提取源码数据库预先填充核心数据,该模式(表和列名称、等等)。 会很奇怪的名字命名。

顺便说一句,如果您不需要修改预填充数据库,然后不要复制它的文件目录应用程序后被安装。只要访问它直接从束。

// get url reference to databaseName.sqlite in the bundle
let databaseURL: NSURL = NSBundle.mainBundle().URLForResource("databaseName", withExtension: "sqlite")!

// convert the url to a path so that FMDB can use it
let database = FMDatabase(path: databaseURL.path)

这使得它如此,你没有两个副本。

更新

我现在使用的 源码.swift 而不是FMDB,因为它将更好地与迅速的项目。

,用于存储默认值的另一种方法是通过的NSUserDefaults的方式找到。 (惊喜!) 和它的容易。

通过一些建议,它放入applicationDidFinishLaunching

在10个默认给定的情况下,Airport0至9

设置

NSUserDefaults *nud = [NSUserDefaults standardUserDefaults];
[nud setString:@"MACADDRESSORWHY" forKey:@"Airport0"];
    ...
[nud setString:@"MACADDRESSORWHY" forKey:@"Airport9"];
[nud synchronize];

[[NSUserDefaults standardUserDefaults] setString:@"MACADDRESSORWHY" forKey:@"Airport9"]];
     ...
[[NSUserDefaults standardUserDefaults] synchronize];

然后,得到的默认值。

NSString *air0 = [[NSUserDefaults standardUserDefaults] stringForKey:@"Airport0"];

这为我工作。这是一个修改这个 答案 通过 安德烈ソ 灵感来自这个 博客.唯一的问题的答案是,有一个机会的数据损失时移动源码文件与文件管理器.我保存了大约500行的数据,通过使用replacePersistentStore而不是文件管理器.默认。copyItem

步骤1
填充核心数据,在另一个程序,并获取文件的路径,使用这个代码:

let paths = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
print(documentsDirectory)

步骤2
将你的3个文件。源码扩展到您的模式的项目。(一定要选择加入的目标选择)。

步骤3
建立功能检查应用程序第一个运行在如.swift

func isFirstLaunch() -> Bool {
    let hasBeenLaunchedBeforeFlag = "hasBeenLaunchedBeforeFlag"
    let isFirstLaunch = !UserDefaults.standard.bool(forKey: hasBeenLaunchedBeforeFlag)
    if (isFirstLaunch) {
        UserDefaults.standard.set(true, forKey: hasBeenLaunchedBeforeFlag)
        UserDefaults.standard.synchronize()
    }
    return isFirstLaunch
}

第4步
复制这种功能在如.迅速获得url源码数据库应该被移动:

func getDocumentsDirectory()-> URL {
    let paths = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
    let documentsDirectory = paths[0]
    return documentsDirectory
}

步骤5
替代宣言》的persistentContainer与这一:

// MARK: - Core Data stack

lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "ProjectName")

    let storeUrl = self.getDocumentsDirectory().appendingPathComponent("FileName.sqlite")

    if UserDefaults.isFirstLaunch() {
        let seededDataUrl = Bundle.main.url(forResource: "FileName", withExtension: "sqlite")
        try! container.persistentStoreCoordinator.replacePersistentStore(at: storeUrl, destinationOptions: nil, withPersistentStoreFrom: seededDataUrl!, sourceOptions: nil, ofType: NSSQLiteStoreType)
    }

    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top