Objective c 目标c-预填充复合数据库的建议流程

Objective c 目标c-预填充复合数据库的建议流程,objective-c,core-data,Objective C,Core Data,我想澄清一下使用多个实体预填充(复杂)DB的正确方法 这是我想要使用的方法: 创建一个单独的项目,关注数据库填充 对于没有关系的实体:解析.json文件以收集实体信息 如果实体与其他实体有关系(1:N关系): 每个实体都有一个.json文件 我为涉及实体之间关系的每个元素分配一个托管对象,并填充它们的属性 请考虑下面的例子以更好地解释:< /强> 让我们考虑DB包含两个实体:拥有和(1:n)关系的所有者和房屋。 要预填充DB I,请执行以下操作: configurea owner.js

我想澄清一下使用多个实体预填充(复杂)DB的正确方法

这是我想要使用的方法:

  • 创建一个单独的项目,关注数据库填充
  • 对于没有关系的实体:解析.json文件以收集实体信息
  • 如果实体与其他实体有关系(1:N关系):
    • 每个实体都有一个.json文件
    • 我为涉及实体之间关系的每个元素分配一个托管对象,并填充它们的属性
  • <强>请考虑下面的例子以更好地解释:< /强>

    让我们考虑DB包含两个实体:拥有和(1:n)关系的所有者和房屋。 要预填充DB I,请执行以下操作:

    • configurea owner.json文件和house.json文件
    • 解析owner.json并收集并创建ManagedOwnerObject
    • 解析house.json并创建一组ManagedHouseObject,这些对象与创建的第一个对象有关系
    • 使用刚刚创建的NSSet填充ManagedHouseObject的属性,该属性描述与ManagedHouseObject的关系
    • 迭代所有house.json的过程
    现在,在我看来,这个过程有点复杂,因为我的应用程序大约有10个实体与1:N关系相连。 你能告诉我我做得对还是可以考虑其他更好的解决方案吗

    问候


    Nicolò

    您可以使用应用程序手动填充数据库,并随应用程序一起发送生成的SQLite文件,而不是在用户首次打开应用程序时创建一个空文件

    编辑:

    使用KVC可以简化对象的创建。建立关系可能不是那么容易。我会把所有的数据检查两次。在第一次运行中创建没有关系的对象,并在第二次运行中设置关系

    下面是一个类似的方法,但没有关系:

    -(void)createEntities:(NSString *)entityName fromFile:(NSString *)filePath inManagedObjectContext:(NSManagedObjectContext *)managedObjectContext {
        // Remove all existing objects of this entity.
        [self removeExistingEntriesForEntityName:entityName managedObjectContext:managedObjectContext];
    
        // Read all data from file path.
        NSArray *newObjects = [self readTestDataFromFilePath:filePath];
    
        // Insert new object for all existing keys.
        for (NSDictionary *no in newObjects) {
            NSManagedObject *managedObject = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:managedObjectContext];
            for (NSString *key in no.keyEnumerator) {
                [managedObject setValue:[no valueForKey:key] forKeyPath:key];
            }
        }
    
        [(AppDelegate *)[[UIApplication sharedApplication] delegate] saveContext];
    }
    

    “使用应用程序手动填充数据库”是什么意思?1) 我的应用程序只是从数据库中读取数据,没有写入数据2)我有超过1K的记录要填充抱歉,我误解了你的问题。我相应地更新了我的答案。谢谢你,保罗。我尝试了你的解决方案,它简化了程序。问候