2016-10-26 3 views
0

ich meine App von Realm 0.9x но 2.0.x aktualisiert Jetzt habe ich eine Menge Fehlerberichte haben von 8, 9 und 10 iOS-Geräte auf Crashlytics über schwerwiegende Ausnahme:Realm darf nicht null

Fatal Exception: RLMException 
Realm must not be nil 

Stack-Ablaufverfolgung sieht wie folgt aus:

RLMObjectStore.mm line 81 RLMGetObjects

RLMObject.mm line 154 +[RLMObject objectsInRealm:withPredicate:]

RLMObject.mm line 146 +[RLMObject objectsInRealm:where:args:]

RLMObject.mm line 140 +[RLMObject objectsInRealm:where:]

Sessions.m line 88 +[Sessions resultWithSessionsWhere:]

Sessions.m line 128 +[Sessions activeSession]

Sessions.m line 102 +[Sessions appLaunched]

AppDelegate.m line 60 -[AppDelegate application:didFinishLaunchingWithOptions:]

Ich kann Fehler in Debugumgebung nicht reproduzieren. Es hat ungefähr 30-40% der Benutzer berührt (überhaupt nicht), und ich sehe aus wie nur alte Benutzer berührt werden.

Es gibt kein Reich Objekt in dieser Methode:

/** 
* Create and returns Realm configuration for sessions database 
*/ 
+(nonnull RLMRealmConfiguration*)realmConfigurationForSessions 
{ 
    RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration]; 
    // Use the default directory, but replace the filename with the 'sessions.realm' 
    config.fileURL = [NSURL 
        URLWithString:[[[config.fileURL.absoluteString stringByDeletingLastPathComponent] 
             stringByAppendingPathComponent:@"sessions"] 
            stringByAppendingPathExtension:@"realm"]]; 
    return config; 
} 

+(nullable RLMRealm*)realmForConfiguration:(nullable RLMRealmConfiguration*)config 
{ 
    if (!config) { 
     return nil; 
    } 
    NSError *error; 
    // Open the Realm with the configuration 
    RLMRealm *realm = [RLMRealm realmWithConfiguration:config 
               error:&error]; 
    if (error) { 
     DLog(@"error: %@", error.localizedDescription); 
    } 
    return realm; 
} 

Fragen: 1) Was ist die Ursache für diese seltsame Frage? 2) Wie kann ich in dieser Situation fehlerfrei und nil realm value behandeln?

Antwort

1

Diese Ausnahme occurs in a pretty straightforward case. Ein Fehler ist aufgetreten und es wurde eine RLMRealm Instanz erstellt, die nicht erstellt wurde, als sie hätte sein sollen.

Mit den von Ihnen bereitgestellten Informationen ist es möglich, dass die Art und Weise, wie Sie Ihre fileURL-Eigenschaft erstellen, möglicherweise nicht immer erfolgreich ist.

Meine Empfehlungen:

  • Verwenden [NSURL fileURLWithPath:] statt [NSURL URLWithString:]. Dieser ist besser für Dateipfade als für Web-URLs optimiert.
  • Verwenden Sie config.fileURL.path statt config.fileURL.absoluteString. Für weitere Informationen warum, check this SO answer.
  • Verwenden Sie aus Konsistenzgründen [NSURL URLByAppendingPathComponent:] im Gegensatz zu [NSString stringByAppendingPathComponent:].

Ich hoffe, das hat geholfen! Lassen Sie mich wissen, wenn Sie zusätzliche Erläuterungen benötigen!

+0

Ok, es ist gut. Aber was ist mit der Fehlerbehandlung? Wie kann ich eine stabile funktionierende App erhalten, wenn ein Fehler auftritt? –

+1

'[RLMRealm realmWithConfiguration: error:]' gibt 'nil' zurück, wenn ein Fehler auftritt, so dass es sehr einfach zu erkennen ist, ob ein Fehler aufgetreten ist, der die Generierung des Realms verhindert, so dass Sie ihn mildern können. In diesem Fall (wenn nicht an anderer Stelle ein anderes Problem auftritt) wird es nur dann auftreten, wenn die 'fileURL' nicht korrekt formatiert ist und auf einen gültigen Speicherort auf der Festplatte verweist. In diesem Fall kann es hilfreich sein, den 'NSURL'-Wert zu überprüfen, bevor Sie ihn an Realm übergeben. :) – TiM

Verwandte Themen