"Заголовок файла Bad Realm (#1)" Исключение при открытии файла Realm в iOS
Я использую REALM версии 0.98.1 (для Objective C) и иногда получаю исключение " Заголовок файла Bad Realm " при сжатии размера БД при запуске приложения.
Ниже приведена последовательность вызова метода в приложении AppDelegate didFinishLaunch....
[self setDefaultConfigrutaionForRealm];
[self vacuumRealm];
Ниже приведен код для настройки области:
+(void)setDefaultConfigrutaionForRealm{
RLMRealmConfiguration * defCongfig = [RLMRealmConfiguration defaultConfiguration];
defCongfig.path = REALM_PATH(REALM_FILE_NAME);
defCongfig.schemaVersion = SCHEMA_VERSION;
[RLMRealmConfiguration setDefaultConfiguration:defCongfig];
}
Ниже приведен код VacuumRealm (размер базы данных Compress):
+ (void)vacuumRealm {
@try{
@autoreleasepool {
RLMRealm *realm = [RLMRealm defaultRealm];
NSString *realmPath = [realm path];
NSLog(@"vacuumRealm realmPath = %@", realmPath);
long long fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:realmPath error:nil][NSFileSize] longLongValue];
NSLog(@"vacuumRealm ENTER filesize = %llu", fileSize);
//
NSError *err;
BOOL success;
NSDate *startDate = [NSDate date];
NSString *copyPath = [realmPath stringByAppendingString:@".copy"];
[[NSFileManager defaultManager] removeItemAtPath:copyPath error:&err];
success = [realm writeCopyToPath:copyPath error:&err];
if (success) {
success = [[NSFileManager defaultManager] removeItemAtPath:realmPath error:&err];
if (success) {
success = [[NSFileManager defaultManager] copyItemAtPath:copyPath toPath:realmPath error:&err];
if (success) {
[[NSFileManager defaultManager] removeItemAtPath:copyPath error:&err];
NSDate *endDate = [NSDate date];
NSTimeInterval executionTime = [endDate timeIntervalSinceDate:startDate];
NSLog(@"vacuumRealm cleanup took %f ms", executionTime);
}
}
}
//
fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:realmPath error:nil][NSFileSize] longLongValue];
NSLog(@"vacuumRealm EXIT filesize = %llu", fileSize);
}
}
@catch (NSException *exception) {
NSLog(@"Inside vacuumRealm exception = %@",exception.description);
}
@finally {
}
}
Во время отладки я заметил, что путь к области был правильно настроен в методе " setDefaultConfigrutaionForRealm " (прикрепленный снимок экрана для справки), но как только там был вызван метод вакуума Realm, я получаю " Заголовок файла Bad Realm (# 1) " в строке ниже:
RLMRealm *realm = [RLMRealm defaultRealm];
любая помощь в разрешении этого исключения действительно будет полезна.
Заранее спасибо.
1 ответ
Вы создаете экземпляр Realm (RLMRealm *realm = [RLMRealm defaultRealm];
) и удаление файла из-под него без освобождения экземпляра. Это вызовет проблемы, такие как повреждение, которое вы видите, потому что вы изменяете файл, пока Realm все еще обращается к нему.
Вот обновленная версия вашего метода (исключая журналы отладки и err
так как он не использовался):
__block BOOL copySuccess = NO;
NSString *realmPath = [[RLMRealmConfiguration defaultConfiguration] path];
NSString *copyPath = [realmPath stringByAppendingString:@".copy"];
@autoreleasepool {
[[NSFileManager defaultManager] removeItemAtPath:copyPath error:nil];
copySuccess = [[RLMRealm defaultRealm] writeCopyToPath:copyPath error:nil];
}
if (copySuccess && [[NSFileManager defaultManager] removeItemAtPath:realmPath error:nil]) {
[[NSFileManager defaultManager] moveItemAtPath:copyPath toPath:realmPath error:nil];
}
Кроме того, какие бы исключения ни создавались в этом процессе, они не предназначены для восстановления. Так что единственная безопасная вещь, которую можно сделать в @catch
блок должен прервать Или не иметь @try
/@catch
пункт вообще.