2016-10-05 3 views
0

Я разрабатываю приложение, которое сохраняет медицинские записи. Я использую основные данные с одним контекстом и одним физическим хранилищем. Несмотря на вызов [managedObjectContext save: & ошибка], если я извлечу контейнер через Xcode, sqlite db не отображает самые последние данные.данные ядра не сохраняются, когда я хочу

Пробовал что-то вроде предложенного здесь: Core data not saving my data, но не сработал для меня. Чтобы ухудшить ситуацию, данные DO появляются через некоторое время: приложение может отправлять sqlite через FTP, чтобы сбрасывать данные для аварийного восстановления. Бывает, что работа на прошлой неделе не всегда появляется, но через неделю обычно присутствует.

Что я не понимаю: [managedObjectContext save: & ошибка] записывает данные НЕМЕДЛЕННО в физическом магазине? (мое предположение было бы НЕТ) Как я могу указать основные данные Я хочу, чтобы мои данные записывались на месте (при условии, что это действительно возможно)? Закрывает ли приложение приложение и/или перезагружает устройство, чтобы данные ядра записывались в sqlite?

Редактировать 1 - добавить код Ошибка [managedObjectContext save: &] называется в [CommonHelper SaveData: true]; только в начале блока @try.

_FollowUp.bMI=[NSNumber numberWithFloat: [TextBMI.text floatValue]]; 
    _FollowUp.karfnosky=[NSNumber numberWithInt: [TextKarfnosky.text intValue]]; 
    _FollowUp.charlson=[NSNumber numberWithInt: [TextCharlson.text intValue]]; 
    _FollowUp.alimentazione=ButtonAlimentazione.titleLabel.text; 
    _FollowUp.farmaci=TextFarmaci.text; 
    _FollowUp.dolore=ButtonDolore.titleLabel.text; 


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


    @try { 
     [CommonHelper SaveData:true];    


     UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@“Data saved” message: @“Record saved successfully” delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
     [alert show]; 


     float height = self.view.bounds.size.height; 
     float width = self.view.bounds.size.width; 
     lblSincro = [[UILabel alloc]initWithFrame:CGRectMake(width/2-200 ,height/2+30, 400, 20)]; 
     lblSincro.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
     lblSincro.font = [UIFont boldSystemFontOfSize:16.0f]; 
     lblSincro.numberOfLines = 1; 
     [lblSincro setTextAlignment:NSTextAlignmentCenter]; 
     lblSincro.backgroundColor = [UIColor clearColor]; 
     lblSincro.textColor = [UIColor whiteColor]; 
     lblSincro.text = @"Uploading in progress"; 

     UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge] ; 
     spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge] ; 
     spinner.frame = CGRectMake(0, 0, width,height); 
     spinner.tag = 3; 
     UIColor *color = [[UIColor alloc] initWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]; 
     spinner.backgroundColor =color; 

     lblSincroDet = [[UILabel alloc]initWithFrame:CGRectMake(width/2-200 ,height/2+70, 400, 20)]; 
     lblSincroDet.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
     lblSincroDet.font = [UIFont boldSystemFontOfSize:16.0f]; 
     lblSincroDet.numberOfLines = 1; 
     [lblSincroDet setTextAlignment:NSTextAlignmentCenter]; 
     lblSincroDet.backgroundColor = [UIColor clearColor]; 
     lblSincroDet.textColor = [UIColor whiteColor]; 

     [self.view addSubview:lblSincro]; 
     [self.view addSubview:lblSincroDet]; 
     [self.view addSubview:spinner]; 

     [spinner addSubview:lblSincro]; 
     [spinner addSubview:lblSincroDet]; 

     [spinner startAnimating]; 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 

      SyncHelper *sync=[SyncHelper alloc]; 
      BOOL result=sync.Sincronize; 

      dispatch_async(dispatch_get_main_queue(), ^(void){ 
       [spinner stopAnimating]; 
       [lblSincro removeFromSuperview]; 
       [lblSincroDet removeFromSuperview]; 

       [lblSincro removeFromSuperview]; 
       if(result){ 
        _SaveView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"successSincro", @"") message:NSLocalizedString(@"successSincroMessage", @"") delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
        [_SaveView show]; 
       }else{ 
        _SaveView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"failedSincro", @"") message:NSLocalizedString(@"failedSincroMessage", @"") 
                  delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
        [_SaveView show]; 
       } 
      }); 
     }); 
     _FollowUpLoad=_FollowUp; 
     _isNew=false; 
    }@catch (NSException *ex) 
    { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message: @“Failed to save data” delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
     [alert show]; 
    } 
+0

вы делаете некоторые некоторый процесс в фоновом режиме очереди? –

+0

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

+0

Вы показываете метод вставки, в котором вы делаете сохранение? –

ответ

0

По умолчанию CoreData использует Write-Ahead Logging, поэтому файл .sqlite не всегда будет содержать все ваши данные, если вы не отключите его.

Как так ...

NSDictionary *options = @{ 
    NSMigratePersistentStoresAutomaticallyOption : @YES, 
    NSInferMappingModelAutomaticallyOption : @YES, 
    NSSQLitePragmasOption: @{@"journal_mode": @"DELETE"} 
}; 
[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error] 
+0

Прошу прощения за опоздание, я изучал сам, и я узнал, что SQLite использует WAL. Data IS сохраняется, мне просто нужно экспортировать .sqlite-shm и .sqlite-wal, а также файл .sqlite. – RandomDev

0

Вы должны получить доступ к NSManagedObjectContext в соответствии с нитями, которые они сохраняют. Прочтите эту ссылку.

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Concurrency.html

вставить свои данные в основную очередь

  dispatch_async(dispatch_get_main_queue(), ^{ 

      [CommonHelper SaveData:true]; 

      }); 

надеюсь, что это работа.

Смежные вопросы