2016-11-23 3 views
1

Я испытываю очень странное поведение с данными ядра iOS, я загружаю элементы из веб-службы и сохраняю их локально с использованием основных данных, у меня есть один UTTableViewController, который показывает, что такое сохраненный в локальном объекте, тот же tableController также позволяет удалять действие по выбранным элементам. У меня также есть ограничение на атрибут «Itemid», чтобы избежать дубликатов, и я использую поведение по умолчанию выдаст ошибку, если Itemid дубликатXcode 8.1 IOS10.1 CoreData delete на самом деле не удаляет

Проблема заключается в следующем

При загрузке элементов из webservice в первый раз, когда он работает точно так, как предполагалось.

Если я пытаюсь перезагрузить данные, то ограничение корректно показывает мне ошибки, в которых есть конфликты.

Затем я перехожу в UITableViewController, и я удаляю один из элементов, это работает, как и ожидалось, ViewCOntroller показывает оставшиеся элементы.

Теперь я перезагружаю элементы из веб-службы, и теперь он не может добавить обратно тот, который был удален, ограничение говорит мне, что есть конфликт.

Это как если бы предмет не был удален и все еще висит вокруг в фоновом режиме, но не отображается.

отлаживает показать мне, что все выглядит хорошо

Может кто-то помочь мне объяснить, почему я получаю ошибку ограничение, когда я перезагружать же Itemid, что я удален.

Это метод загрузки

+ (void)fetchTillData:(int)tillId; { 

if ([NWTillHelper isDebug] == 1) { 
    NSLog(@"WebServices:fetchTillData:tillId = %d", tillId); 
} 

NSString *finalURL = [NSString stringWithFormat:@"https://foo.bar.com:5443/api/till/tilldata/%d?StartAtRow=0&TakeNoOfRows=10",tillId]; 

[[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:finalURL] 
          completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

           if (error != nil) { 
            if ([NWTillHelper isDebug] == 1) { 
             NSLog(@"WebServices:fetchTillData:Transport error %@", error); 
            } 
           } else { 
            NSHTTPURLResponse *responseHTTP; 
            responseHTTP = (NSHTTPURLResponse *) response; 

            if(responseHTTP.statusCode != 200) { 
             if ([NWTillHelper isDebug] == 1) { 
              NSLog(@"WebServices:fetchTillData:Server Error %d", (int) responseHTTP.statusCode); 
             } 
            } else { 
             NSArray *tillBasicDataArray = [NSJSONSerialization JSONObjectWithData:data 
                             options:0 
                             error:NULL]; 
             if ([NWTillHelper isDebug] == 1) { 
              NSLog(@"WebServices:fetchTillData:tillBasicDataArray count = %lu", (unsigned long)[tillBasicDataArray count]); 
              NSLog(@"WebServices:fetchTillData:tillBasicDataArray looks like %@",tillBasicDataArray); 
             } 

             NSDictionary *tillBasicDataDict = Nil; 

             //Loop through the array and for each dictionary insert into local DB 
             for (id element in tillBasicDataArray){ 
              tillBasicDataDict = element; 

              NSString *itemId = [tillBasicDataDict objectForKey:@"itemId"]; 
              NSString *companyId = [tillBasicDataDict objectForKey:@"companyId"]; 
              NSString *languageId = [tillBasicDataDict objectForKey:@"languageCode"]; 
              NSString *colorCode = [tillBasicDataDict objectForKey:@"colorCode"]; 
              NSString *discountable = [tillBasicDataDict objectForKey:@"discountable"]; 
              NSString *exchangeable = [tillBasicDataDict objectForKey:@"exchangeable"]; 
              NSString *noos14 = [tillBasicDataDict objectForKey:@"noos14"]; 
              NSString *sizeCode = [tillBasicDataDict objectForKey:@"sizeCode"]; 
              NSString *taxGroup = [tillBasicDataDict objectForKey:@"taxGroupId"]; 
              NSString *taxRegion = [tillBasicDataDict objectForKey:@"taxRegion"]; 
              NSString *tradeItemDesc = [tillBasicDataDict objectForKey:@"tradeItemDesc"]; 
              NSString *withTax = [tillBasicDataDict objectForKey:@"withTax"]; 
              NSString *status = [tillBasicDataDict objectForKey:@"status"]; 

              // Use Core Data FMD 
              AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate]; 

              //AppDelegate *appDelegate = 
              //[[UIApplication sharedApplication] delegate]; 

              NSManagedObjectContext *context = 
              appDelegate.persistentContainer.viewContext; 
              NSManagedObject *newPimItem = Nil; 
              newPimItem = [NSEntityDescription 
                  insertNewObjectForEntityForName:@"TillData" 
                  inManagedObjectContext:context]; 

              [newPimItem setValue:itemId forKey:@"itemId"]; 
              [newPimItem setValue:companyId forKey:@"companyId"]; 
              [newPimItem setValue:languageId forKey:@"languageCode"]; 
              [newPimItem setValue:colorCode forKey:@"colorCode"]; 
              [newPimItem setValue:discountable forKey:@"discountable"]; 
              [newPimItem setValue:exchangeable forKey:@"exchangeable"]; 
              [newPimItem setValue:noos14 forKey:@"noos14"]; 
              [newPimItem setValue:sizeCode forKey:@"sizeCode"]; 
              [newPimItem setValue:[NSNumber numberWithInt:[taxGroup intValue]] forKey:@"taxGroup"]; 
              [newPimItem setValue:taxRegion forKey:@"taxRegion"]; 
              [newPimItem setValue:tradeItemDesc forKey:@"tradeItemDesc"]; 
              [newPimItem setValue:[NSNumber numberWithInt:[withTax intValue]] forKey:@"withTax"]; 
              [newPimItem setValue:[NSNumber numberWithInt:[status intValue]] forKey:@"status"]; 

              NSError *error = Nil; 
              [context save:&error]; 

              if ([NWTillHelper isDebug] == 1) { 
               NSLog(@"WebServices:fetchTillData:ItemId in loop = %@", itemId); 
               NSLog(@"WebServices:fetchTillData:newPimItem = %@", newPimItem); 
               NSLog(@"WebServices:fetchTillData:CoreData error = %@", error); 
              } 

              if(error != nil) { 
               // Do something here 
              } else { 
               NSUserDefaults *tillUserDefaults = [NSUserDefaults standardUserDefaults]; 
               [tillUserDefaults setInteger:1 forKey:@"hasTillData"]; 
               [tillUserDefaults synchronize]; 
              } 
             } 
            } 
           } 
          }] resume]; 
} 

В покажите мне отладка, что у меня нет каких-либо/NULL значения NIL в любом

В также показывает отладка мне, что каждая переменная содержит ожидаемое значение

Ниже массив JSON из веб-сервиса с использованием NSLog, все значения являются правильными

WebServices:fetchTillData:tillBasicDataArray looks like (
    { 
    colorCode = 95; 
    companyId = "BE_HM"; 
    discountable = 1; 
    exchangeable = 1; 
    itemId = 101064025138010; 
    languageCode = eng; 
    noos14 = "09258384374953,09258387354952"; 
    sizeCode = "163-010"; 
    status = 1; 
    taxGroupId = 1; 
    taxRegion = BE; 
    tradeItemDesc = "Jersey basic"; 
    withTax = 1; 
}, 
    { 
    colorCode = 95; 
    companyId = "BE_HM"; 
    discountable = 1; 
    exchangeable = 1; 
    itemId = 101064025138011; 
    languageCode = eng; 
    noos14 = "09258384394951,09258387434951"; 
    sizeCode = "163-011"; 
    status = 1; 
    taxGroupId = 1; 
    taxRegion = BE; 
    tradeItemDesc = "Jersey basic"; 
    withTax = 1; 
}, 
    { 
    colorCode = 95; 
    companyId = "BE_HM"; 
    discountable = 1; 
    exchangeable = 1; 
    itemId = 101064025138012; 
    languageCode = eng; 
    noos14 = "09258385254957,09258389874953"; 
    sizeCode = "163-012"; 
    status = 1; 
    taxGroupId = 1; 
    taxRegion = BE; 
    tradeItemDesc = "Jersey basic"; 
    withTax = 1; 
} 
) 

, но я все еще получаю эту ошибку, даже после того, как я удалил все записи и tableViewController показывает, что мой DB пуст

2016-11-23 15:07:36.714 NWMobileTill[674:9231] WebServices:fetchTillData:ItemId in loop = 101064025138010 
2016-11-23 15:07:36.715 NWMobileTill[674:9231] WebServices:fetchTillData:newPimItem = <TillData: 0x6000002ce9a0> (entity: TillData; id: 0x600000624620 <x-coredata:///TillData/t7807C999-528C-4616-A012-592A3D77D28D15> ; data: { 
    colorCode = 95; 
    companyId = "BE_HM"; 
    discountable = 1; 
    exchangeable = 1; 
    itemId = 101064025138010; 
    languageCode = eng; 
    noos14 = "09258384374953,09258387354952"; 
    sizeCode = "163-010"; 
    status = 1; 
    taxGroup = 1; 
    taxRegion = BE; 
    tradeItemDesc = "Jersey basic"; 
    withTax = 1; 
}) 
2016-11-23 15:07:36.717 NWMobileTill[674:9231] WebServices:fetchTillData:CoreData error = Error Domain=NSCocoaErrorDomain Code=133021 "(null)" UserInfo={conflictList=(
    "NSConstraintConflict (0x60000086dcc0) for constraint (\n itemId\n): database: (null), conflictedObjects: (\n \"<TillData: 0x6000000de4c0> (entity: TillData; id: 0x600000435500 <x-coredata:///TillData/t7807C999-528C-4616-A012-592A3D77D28D7> ; data: {\\n colorCode = 95;\\n companyId = \\\"BE_HM\\\";\\n discountable = 1;\\n exchangeable = 1;\\n itemId = 101064025138012;\\n languageCode = eng;\\n noos14 = \\\"09258385254957,09258389874953\\\";\\n sizeCode = \\\"163-012\\\";\\n status = 1;\\n taxGroup = 1;\\n taxRegion = BE;\\n tradeItemDesc = \\\"Jersey basic\\\";\\n withTax = 1;\\n})\",\n \"<TillData: 0x6000002ce3f0> (entity: TillData; id: 0x60000023bda0 <x-coredata:///TillData/t7807C999-528C-4616-A012-592A3D77D28D13> ; data: {\\n colorCode = 95;\\n companyId = \\\"BE_HM\\\";\\n discountable = 1;\\n exchangeable = 1;\\n itemId = 101064025138012;\\n languageCode = eng;\\n noos14 = \\\"09258385254957,09258389874953\\\";\\n sizeCode = \\\"163-012\\\";\\n status = 1;\\n taxGroup = 1;\\n taxRegion = BE;\\n tradeItemDesc = \\\"Jersey basic\\\";\\n withTax = 1;\\n})\",\n \"<TillData: 0x6080002cfc00> (entity: TillData; id: 0x60800022f920 <x-coredata:///TillData/t7807C999-528C-4616-A012-592A3D77D28D4> ; data: {\\n colorCode = 95;\\n companyId = \\\"BE_HM\\\";\\n discountable = 1;\\n exchangeable = 1;\\n itemId = 101064025138012;\\n languageCode = eng;\\n noos14 = \\\"09258385254957,09258389874953\\\";\\n sizeCode = \\\"163-012\\\";\\n status = 1;\\n taxGroup = 1;\\n taxRegion = BE;\\n tradeItemDesc = \\\"Jersey basic\\\";\\n withTax = 1;\\n})\"\n)", 
    "NSConstraintConflict (0x60000067fd40) for constraint (\n itemId\n): database: (null), conflictedObjects: (\n \"<TillData: 0x6080002d0760> (entity: TillData; id: 0x608000233320 <x-coredata:///TillData/t7807C999-528C-4616-A012-592A3D77D28D6> ; data: {\\n colorCode = 95;\\n companyId = \\\"BE_HM\\\";\\n discountable = 1;\\n exchangeable = 1;\\n itemId = 101064025138011;\\n languageCode = eng;\\n noos14 = \\\"09258384394951,09258387434951\\\";\\n sizeCode = \\\"163-011\\\";\\n status = 1;\\n taxGroup = 1;\\n taxRegion = BE;\\n tradeItemDesc = \\\"Jersey basic\\\";\\n withTax = 1;\\n})\",\n \"<TillData: 0x6080002cfb20> (entity: TillData; id: 0x60800022f9e0 <x-coredata:///TillData/t7807C999-528C-4616-A012-592A3D77D28D3> ; data: {\\n colorCode = 95;\\n companyId = \\\"BE_HM\\\";\\n discountable = 1;\\n exchangeable = 1;\\n itemId = 101064025138011;\\n languageCode = eng;\\n noos14 = \\\"09258384394951,09258387434951\\\";\\n sizeCode = \\\"163-011\\\";\\n status = 1;\\n taxGroup = 1;\\n taxRegion = BE;\\n tradeItemDesc = \\\"Jersey basic\\\";\\n withTax = 1;\\n})\",\n \"<TillData: 0x6080002d3be0> (entity: TillData; id: 0x608000221ea0 <x-coredata:///TillData/t7807C999-528C-4616-A012-592A3D77D28D12> ; data: {\\n colorCode = 95;\\n companyId = \\\"BE_HM\\\";\\n discountable = 1;\\n exchangeable = 1;\\n itemId = 101064025138011;\\n languageCode = eng;\\n noos14 = \\\"09258384394951,09258387434951\\\";\\n sizeCode = \\\"163-011\\\";\\n status = 1;\\n taxGroup = 1;\\n taxRegion = BE;\\n tradeItemDesc = \\\"Jersey basic\\\";\\n withTax = 1;\\n})\"\n)", 
    "NSConstraintConflict (0x60000067fc00) for constraint (\n itemId\n): database: (null), conflictedObjects: (\n \"<TillData: 0x6080002cecb0> (entity: TillData; id: 0x6080002218e0 <x-coredata:///TillData/t7807C999-528C-4616-A012-592A3D77D28D5> ; data: {\\n colorCode = 95;\\n companyId = \\\"BE_HM\\\";\\n discountable = 1;\\n exchangeable = 1;\\n itemId = 101064025138010;\\n languageCode = eng;\\n noos14 = \\\"09258384374953,09258387354952\\\";\\n sizeCode = \\\"163-010\\\";\\n status = 1;\\n taxGroup = 1;\\n taxRegion = BE;\\n tradeItemDesc = \\\"Jersey basic\\\";\\n withTax = 1;\\n})\",\n \"<TillData: 0x6080002cf2d0> (entity: TillData; id: 0xd000000000180002 <x-coredata://6A608EA5-F8C8-4272-8C10-8621BB730066/TillData/p6> ; data: {\\n colorCode = 95;\\n companyId = \\\"BE_HM\\\";\\n discountable = 1;\\n exchangeable = 1;\\n itemId = 101064025138010;\\n languageCode = eng;\\n noos14 = \\\"09258384374953,09258387354952\\\";\\n sizeCode = \\\"163-010\\\";\\n status = 1;\\n taxGroup = 1;\\n taxRegion = BE;\\n tradeItemDesc = \\\"Jersey basic\\\";\\n withTax = 1;\\n})\",\n \"<TillData: 0x6000002ce9a0> (entity: TillData; id: 0x600000624620 <x-coredata:///TillData/t7807C999-528C-4616-A012-592A3D77D28D15> ; data: {\\n colorCode = 95;\\n companyId = \\\"BE_HM\\\";\\n discountable = 1;\\n exchangeable = 1;\\n itemId = 101064025138010;\\n languageCode = eng;\\n noos14 = \\\"09258384374953,09258387354952\\\";\\n sizeCode = \\\"163-010\\\";\\n status = 1;\\n taxGroup = 1;\\n taxRegion = BE;\\n tradeItemDesc = \\\"Jersey basic\\\";\\n withTax = 1;\\n})\",\n \"<TillData: 0x6080002d1e20> (entity: TillData; id: 0x608000229160 <x-coredata:///TillData/t7807C999-528C-4616-A012-592A3D77D28D11> ; data: {\\n colorCode = 95;\\n companyId = \\\"BE_HM\\\";\\n discountable = 1;\\n exchangeable = 1;\\n itemId = 101064025138010;\\n languageCode = eng;\\n noos14 = \\\"09258384374953,09258387354952\\\";\\n sizeCode = \\\"163-010\\\";\\n status = 1;\\n taxGroup = 1;\\n taxRegion = BE;\\n tradeItemDesc = \\\"Jersey basic\\\";\\n withTax = 1;\\n})\"\n)" 
)} 

Функция удаления код выглядит, как показано ниже, и он не показывает ошибку, когда удаление делается

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSManagedObjectContext *context = self.persistentContainer.viewContext; 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     // Delete object from database 
     [context deleteObject:[self.pimItems objectAtIndex:indexPath.row]]; 

     NSError *error = nil; 
     if (![context save:&error]) { 
      if([NWTillHelper isDebug] == 1) { 
      NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]); 
      return; 
      } 
     } 

     // Remove device from table view 
     [self.pimItems removeObjectAtIndex:indexPath.row]; 
     [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
    } 

Любая помощь будет очень полезно

------ EDIT ------

После того как я удалить из Tableview и с потерять приложение, перезагрузить приложение. Я могу загрузить данные снова, как ожидалось, но не так долго, как я остаюсь в приложении, перемещаясь в разные части приложения, а затем обратно. Я не могу этого сделать, хотя debugs сообщает, что когда я вхожу Tableview его пустым, но когда я пытаюсь загружать данные я получаю ошибку

отлаживает, показывающий, что постоянное хранилище пусто

2016-11-23 16:09:04.106 NWMobileTill[1554:32365] pimItemsArray holds (
) 
2016-11-23 16:09:04.106 NWMobileTill[1554:32365] fetchReuestError holds (null) 

, как вы можете увидеть массив, который подпирает TableView пуст и запрос выборки имеет NULL, поэтому постоянное хранилище пустое, если оно пустое, почему я не могу перезагрузить данные?

Это код, который заполнит Tableview

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

NSError *error = nil; 

// Fetch the devices from persistent data store 
NSManagedObjectContext *context = self.persistentContainer.viewContext; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"TillData"]; 
self.pimItems = [[context executeFetchRequest:fetchRequest error:&error] mutableCopy]; 

if([NWTillHelper isDebug] == 1) { 
    NSLog(@"pimItemsArray holds %@", self.pimItems); 
    NSLog(@"fetchReuestError holds %@", error); 
} 

[self.tableView reloadData]; 
} 
+0

Извините, я не уверен, что вы имеете в виду, я прочитал ссылку, и я делаю то же самое, просто не перебирая NSManagedObject, так как я беспокоюсь только о одной строке в таблице. поэтому я вызываю deleteObject, а затем сохраняю контекст, который должен удалить объект из постоянного хранилища. –

+0

Если я сделаю удаление в таблице, закройте приложение, запустите приложение, затем оно будет работать, но если я останусь в приложении и вернусь в главное меню и обратно в меню администратора, чтобы загрузить данные, они не работают. –

+0

Я не могу их прочитать, их нет там, насколько я могу видеть, следующий отладочный файл подтверждает, что при загрузке Tableview и чтения из хранилища Persistent его пустой –

ответ

1

Проблема, что я не использовал AppDelegate во всех местах последовательно

Следующая строка из класса WebServices нужно быть во всех местах

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate]; 

Благодаря Vinodh и Flexicoder за указание, что из