Основные данные не сохраняют мои данные

Я использую основные данные, чтобы сохранить некоторое целое число (скорость), а затем я вызываю сохранить в контексте:

HeartRateBeat * beat = [HeartRateBeat heartRateWithHeartRate:rate
                            ofRecordTitle:self.recordTitle
                   inManagedObjectContext:document.managedObjectContext];

NSError * error;
[document.managedObjectContext save:&error];

Внутри этого удобного метода я создаю объект с помощью NSEntityDescription следующим образом:

heartRateBeat = [NSEntityDescription insertNewObjectForEntityForName:@"HeartRateBeat" inManagedObjectContext:context];

(Я только скопировал некоторый важный код, просто чтобы показать, что я сделал.)

Я немедленно выполняю запрос на выборку после каждого вставленного сердечного сокращения и сохранения контекста управляемого объекта (я сохраняю немедленно), и этот запрос показывает, что сердцебиение, похоже, хранится в Базовых данных (с растущим массивом сердечных сокращений), но если я перезапустите мое приложение (я использую симулятор BTW) Я знаю, что на самом деле вещи не сохраняются на диск, потому что он начинается заново. Проверка с помощью командной строки SQLite3 показывает пустые таблицы. Что мне здесь не хватает?

2 ответа

Решение

У меня та же проблема, но я думаю, что это просто потому, что, как я полагаю, вы, как и я, просто останавливаете приложение через xcode, а не закрываете его. Я использую этот код для принудительной записи. Я использую UIManagedDocument, общий доступ через appdelegate, вместо того, чтобы настраивать все вручную.

NSError *error = nil;

if (![self.managedObjectContext save:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

[[AppDelegate sharedAppDelegate].userDatabase saveToURL:[AppDelegate sharedAppDelegate].userDatabase.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:nil];

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

Вот код, который наверняка сохранит все ваши основные данные.

-(void)forceSave {
        NSManagedObjectContext * context = self.managedObjectContext; //Get your context here. 
    if (!context) {
        NSLog(@"NO CONTEXT!");
        return;
    }

    NSError * error;
    BOOL success = [context save:&error];
    if (error || !success) {
        NSLog(@"success: %@ - error: %@", success ? @"true" : @"false", error);
    }

    [context performSelectorOnMainThread:@selector(save:) withObject:nil waitUntilDone:YES];
    [context performSelector:@selector(save:) withObject:nil afterDelay:1.0];
    [context setStalenessInterval:6.0];
    while (context) {
        [context performBlock:^(){
            NSError * error;
            bool success =  [context save:&error];
            if (error || !success)
                NSLog(@"success: %@ - error: %@", success ? @"true" : @"false", error);

        }];
        context = context.parentContext;
    }

    NSLog(@"successful save!");

}

Обратите внимание, что это плохой код. Среди других проблем это не потокобезопасно и занимает слишком много времени. Тем не менее, попробуйте использовать это и удалить некоторые его части к вашему удовольствию:)

Другие вопросы по тегам