Основные данные не сохраняют мои данные
Я использую основные данные, чтобы сохранить некоторое целое число (скорость), а затем я вызываю сохранить в контексте:
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!");
}
Обратите внимание, что это плохой код. Среди других проблем это не потокобезопасно и занимает слишком много времени. Тем не менее, попробуйте использовать это и удалить некоторые его части к вашему удовольствию:)