Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios CoreData和来自数据库服务器的外键_Ios_Sqlite_Core Data - Fatal编程技术网

Ios CoreData和来自数据库服务器的外键

Ios CoreData和来自数据库服务器的外键,ios,sqlite,core-data,Ios,Sqlite,Core Data,我有一个关于CoreData和与服务器数据库同步的问题。当我在服务器上用两个表(权限和客户)同步两个实体时,问题是如果服务器上有外键,我如何管理它?例如: //客户同步 NSLog(@"Value : %@", [[jsonDict valueForKey:@"Customers"] objectAtIndex:0]); for (id object in [[jsonDict valueForKey:@"Customers"] objectAtIndex:0]) {

我有一个关于CoreData和与服务器数据库同步的问题。当我在服务器上用两个表(权限和客户)同步两个实体时,问题是如果服务器上有外键,我如何管理它?例如:

//客户同步

    NSLog(@"Value : %@", [[jsonDict valueForKey:@"Customers"] objectAtIndex:0]);
    for (id object in [[jsonDict valueForKey:@"Customers"] objectAtIndex:0])
    {
        NSLog(@"%@", object);
        // if jsonDict.customers.id_customer pas présent dans table Customers
        //Recherche id_customer dans CoreData
        NSError *error = nil;

        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id_customer = %@", [object valueForKey:@"id_customer"]]; //create a filter
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Customers"]; //create a query
        request.predicate = predicate; //set the filter on the query
        NSArray *customerSearch = [[self managedObjectContext] executeFetchRequest:request error:&error]; //execute the query

        if ([customerSearch count] == 0)
        {
            NSManagedObject *customers = [NSEntityDescription
                                          insertNewObjectForEntityForName:@"Customers"
                                          inManagedObjectContext:context];
            [customers setValue:[NSNumber numberWithInt:[[object valueForKey:@"id_customer"] intValue]] forKey:@"id_customer"];
            [customers setValue:[object valueForKey:@"address"] forKey:@"address"];
            [customers setValue:[object valueForKey:@"firstname"] forKey:@"firstname"];
            [customers setValue:[object valueForKey:@"lastname"] forKey:@"lastname"];
        [customers setValue:[NSNumber numberWithInt:[[object valueForKey:@"id_right"] intValue]] forKey:@"id_right"];//Foreign Key problem
        }
        else if ([customerSearch count] == 1)
        {
            //Update the object
            Customers *customers = [[context executeFetchRequest:request error:&error] lastObject];

            customers.address = [object valueForKey:@"address"];
            customers.firstname = [object valueForKey:@"firstname"];
            customers.lastname = [object valueForKey:@"lastname"];
            customers.id_right = [NSNumber numberWithInt:[[object valueForKey:@"id_right"] intValue]];//Foreign Key problem
        }
        else
        {
            NSLog(@"WARNING - May be problems with duplicate id_customer in database"); //if > 1 then problem
        }

        if (![context save:&error])
        {
            NSLog(@"Whoops, couldn't save Customers: %@", [error localizedDescription]);
        }
    }
NSLog(@"Value : %@", [[jsonDict valueForKey:@"Rights"] objectAtIndex:0]);
for (id object in [[jsonDict valueForKey:@"Rights"] objectAtIndex:0])
{
    NSLog(@"%@", object);
    // if jsonDict.customers.id_customer pas présent dans table Customers
    //Recherche id_customer dans CoreData
    NSError *error = nil;

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id_right = %@", [object valueForKey:@"id_right"]]; //create a filter
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Rights"]; //create a query
    request.predicate = predicate; //set the filter on the query
    NSArray *customerSearch = [[self managedObjectContext] executeFetchRequest:request error:&error]; //execute the query

    if ([customerSearch count] == 0)
    {
        NSManagedObject *rights = [NSEntityDescription
                                      insertNewObjectForEntityForName:@"Rights"
                                      inManagedObjectContext:context];
        [rights setValue:[NSNumber numberWithInt:[[object valueForKey:@"id_right"] intValue]] forKey:@"id_right"];
        [rights setValue:[object valueForKey:@"name"] forKey:@"name"];
    }
    else if ([customerSearch count] == 1)
    {
        //Update the object
        Rights *rights = [[context executeFetchRequest:request error:&error] lastObject];

        rights.name = [object valueForKey:@"name"];
    }
    else
    {
        NSLog(@"WARNING - May be problems with duplicate id_customer in database"); //if > 1 then problem
    }
    if (![context save:&error])
    {
        NSLog(@"Whoops, couldn't save Rights : %@", [error localizedDescription]);
    }
}
//权限同步

    NSLog(@"Value : %@", [[jsonDict valueForKey:@"Customers"] objectAtIndex:0]);
    for (id object in [[jsonDict valueForKey:@"Customers"] objectAtIndex:0])
    {
        NSLog(@"%@", object);
        // if jsonDict.customers.id_customer pas présent dans table Customers
        //Recherche id_customer dans CoreData
        NSError *error = nil;

        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id_customer = %@", [object valueForKey:@"id_customer"]]; //create a filter
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Customers"]; //create a query
        request.predicate = predicate; //set the filter on the query
        NSArray *customerSearch = [[self managedObjectContext] executeFetchRequest:request error:&error]; //execute the query

        if ([customerSearch count] == 0)
        {
            NSManagedObject *customers = [NSEntityDescription
                                          insertNewObjectForEntityForName:@"Customers"
                                          inManagedObjectContext:context];
            [customers setValue:[NSNumber numberWithInt:[[object valueForKey:@"id_customer"] intValue]] forKey:@"id_customer"];
            [customers setValue:[object valueForKey:@"address"] forKey:@"address"];
            [customers setValue:[object valueForKey:@"firstname"] forKey:@"firstname"];
            [customers setValue:[object valueForKey:@"lastname"] forKey:@"lastname"];
        [customers setValue:[NSNumber numberWithInt:[[object valueForKey:@"id_right"] intValue]] forKey:@"id_right"];//Foreign Key problem
        }
        else if ([customerSearch count] == 1)
        {
            //Update the object
            Customers *customers = [[context executeFetchRequest:request error:&error] lastObject];

            customers.address = [object valueForKey:@"address"];
            customers.firstname = [object valueForKey:@"firstname"];
            customers.lastname = [object valueForKey:@"lastname"];
            customers.id_right = [NSNumber numberWithInt:[[object valueForKey:@"id_right"] intValue]];//Foreign Key problem
        }
        else
        {
            NSLog(@"WARNING - May be problems with duplicate id_customer in database"); //if > 1 then problem
        }

        if (![context save:&error])
        {
            NSLog(@"Whoops, couldn't save Customers: %@", [error localizedDescription]);
        }
    }
NSLog(@"Value : %@", [[jsonDict valueForKey:@"Rights"] objectAtIndex:0]);
for (id object in [[jsonDict valueForKey:@"Rights"] objectAtIndex:0])
{
    NSLog(@"%@", object);
    // if jsonDict.customers.id_customer pas présent dans table Customers
    //Recherche id_customer dans CoreData
    NSError *error = nil;

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id_right = %@", [object valueForKey:@"id_right"]]; //create a filter
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Rights"]; //create a query
    request.predicate = predicate; //set the filter on the query
    NSArray *customerSearch = [[self managedObjectContext] executeFetchRequest:request error:&error]; //execute the query

    if ([customerSearch count] == 0)
    {
        NSManagedObject *rights = [NSEntityDescription
                                      insertNewObjectForEntityForName:@"Rights"
                                      inManagedObjectContext:context];
        [rights setValue:[NSNumber numberWithInt:[[object valueForKey:@"id_right"] intValue]] forKey:@"id_right"];
        [rights setValue:[object valueForKey:@"name"] forKey:@"name"];
    }
    else if ([customerSearch count] == 1)
    {
        //Update the object
        Rights *rights = [[context executeFetchRequest:request error:&error] lastObject];

        rights.name = [object valueForKey:@"name"];
    }
    else
    {
        NSLog(@"WARNING - May be problems with duplicate id_customer in database"); //if > 1 then problem
    }
    if (![context save:&error])
    {
        NSLog(@"Whoops, couldn't save Rights : %@", [error localizedDescription]);
    }
}
如果答案是我必须通过在iPad上写下这是一种关系这一事实来管理这一点,我很抱歉地说CoreData似乎比使用SQLite的经典SQL管理提供了更多的工作。 如果我没有错的话:

  • 使用SQL,您只需从服务器下载表 包含外键,就完成了

  • 使用CoreData,您必须管理以下事实:如果它是 外键,您必须创建关系

编辑: 供您参考: 概念数据模型: 我使用Sqlite处理自己的表,并直接从服务器将数据复制到表中(检索主键和外键)。这比使用CoreData要好十倍。我曾经用SQLite的DB浏览器创建过我的schéma,就是这样。无需使用2000行代码来编写使应用程序复杂化的关系


结论:我放弃CoreData

如果您喜欢SQLite,请使用SQLite。核心数据并不是所有数据持久性问题的答案。这很遗憾,因为每个人都对我说要使用核心数据。我想我失去了很多时间去理解它。。。