Ошибка миграции Realm Objective-C

Я вижу сбои в работе Crashlytics и слышу от клиентов, что приложение вылетает сразу после того, как они его открывают.

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

У меня есть логика, которая проверяет, когда приложение запускается, чтобы проверить, нужно ли уплотнять область. При этом область определяет, что ее необходимо перенести, и попадает в блокировку миграции.

    config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
        if (oldSchemaVersion < 17) {
            [migration enumerateObjects:Event.className block:^(RLMObject *oldObject, RLMObject *newObject) {
                NSString *className = [[oldObject[@"endDateTime"] objectSchema] className];
                if ([className isEqualToString:@"DateObject"]) {
                    newObject[@"endDateTime"] = oldObject[@"endDateTime"][@"value"];
                }
            }];
        }
    };

Из-за ошибки с моей стороны при выполнении предыдущих миграций я вручную проверял, имеет ли свойство определенный тип, прежде чем принять решение о его переносе. К сожалению, при этом oldObject, который должен иметь тип RLMObject, кажется, имеет тип NSTaggedDate в соответствии с Crashlytics

    [__NSTaggedDate objectSchema]: unrecognized selector sent to instance 0xe41bf592ee000000
    Fatal Exception: NSInvalidArgumentException
    0  CoreFoundation                 0x186419d04 __exceptionPreprocess
    1  libobjc.A.dylib                0x185668528 objc_exception_throw
    2  CoreFoundation                 0x1864271c8 __methodDescriptionForSelector
    3  CoreFoundation                 0x18641f6b0 ___forwarding___
    4  CoreFoundation                 0x18630501c _CF_forwarding_prep_0
    5  MY_mobile_ios_common         0x10199c8c0 __34+[MYRealm getRealmConfigByName:]_block_invoke_2 (MYRealm.m:44)
    6  Realm                          0x1011b6598 -[RLMMigration enumerateObjects:block:] (RLMMigration.mm:99)
    7  MY_mobile_ios_common         0x10199c830 __34+[MYRealm getRealmConfigByName:]_block_invoke (MYRealm.m:40)
    8  Realm                          0x1011b6ab4 -[RLMMigration execute:] (RLMMigration.mm:131)
    9  Realm                          0x1012297ec std::__1::__function::__func<+[RLMRealm realmWithConfiguration:error:]::$_1, std::__1::allocator<+[RLMRealm realmWithConfiguration:error:]::$_1>, void (std::__1::shared_ptr<realm::Realm>, std::__1::shared_ptr<realm::Realm>, realm::Schema&)>::operator()(std::__1::shared_ptr<realm::Realm>&&, std::__1::shared_ptr<realm::Realm>&&, realm::Schema&) (RLMRealm.mm:410)
    10 Realm                          0x10124fa90 std::__1::__function::__func<realm::Realm::update_schema(realm::Schema, unsigned long long, std::__1::function<void (std::__1::shared_ptr<realm::Realm>, std::__1::shared_ptr<realm::Realm>, realm::Schema&)>, std::__1::function<void (std::__1::shared_ptr<realm::Realm>)>, bool)::$_2, std::__1::allocator<realm::Realm::update_schema(realm::Schema, unsigned long long, std::__1::function<void (std::__1::shared_ptr<realm::Realm>, std::__1::shared_ptr<realm::Realm>, realm::Schema&)>, std::__1::function<void (std::__1::shared_ptr<realm::Realm>)>, bool)::$_2>, void ()>::operator()() (memory:4625)
    11 Realm                          0x101181f64 realm::ObjectStore::apply_schema_changes(realm::Group&, unsigned long long, realm::Schema&, unsigned long long, realm::SchemaMode, std::__1::vector<realm::SchemaChange, std::__1::allocator<realm::SchemaChange> > const&, std::__1::function<void ()>) (object_store.cpp:753)
    12 Realm                          0x10124bbb8 realm::Realm::update_schema(realm::Schema, unsigned long long, std::__1::function<void (std::__1::shared_ptr<realm::Realm>, std::__1::shared_ptr<realm::Realm>, realm::Schema&)>, std::__1::function<void (std::__1::shared_ptr<realm::Realm>)>, bool) (functional:1860)
    13 Realm                          0x101226a10 +[RLMRealm realmWithConfiguration:error:] (functional:1860)
    14 MY_mobile_ios_common         0x10199cba0 +[MYRealm mainRealmCompact] (MYRealm.m:137)
    15 MY App                     0x1002b49dc -[AppDelegate compactRealmIfNeeded] (AppDelegate.m:808)
    16 MY App                     0x1002af940 -[AppDelegate application:didFinishLaunchingWithOptions:] (AppDelegate.m:48)

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

Имя продукта: Mac OS X Версия продукта: 10.12.6 Версия сборки: 16G1036

/Applications/Xcode.app/Contents/Developer Xcode 9.1 Версия сборки 9B55

/ usr / local / bin / pod 1.3.1 Область (2.10.2) Область (= 2.10.2)

/ bin / bash GNU bash, версия 3.2.57 (1) -release (x86_64-apple-darwin16)

(здесь не используется)

/ usr / local / bin / git git версия 2.12.2


person bryan    schedule 08.11.2017    source источник
comment
Проверьте до конца if ([[oldObject[@"endDateTime"] isKindOfClass:[NSDate date]){//Do something else because it's a date, not an object of the class where you can call objectSchema` на нем} else // сделай свое дело.; `?   -  person Larme    schedule 08.11.2017


Ответы (1)


Журнал сбоев сообщает вам, что ваш вызов [oldObject[@"endDateTime"] objectSchema] видит oldObject[@"endDateTime"] оценку NSDate, которая не отвечает на -objectSchema. Если свойство endDateTime может быть разных типов в зависимости от того, с какой версии схемы вы обновляете, вам нужно будет выполнить дополнительные проверки объекта перед отправкой ему -objectSchema.

person bdash    schedule 08.11.2017