2016-04-12 3 views
0

Ich teste Realm, indem ich 2000 Datensätze hinzufüge. Das Problem ist, dass, wenn ich die Anwendung gestoppt habe, die deleteAllObject Methode nicht aufruft, selbst wenn keine Zeile ausgeführt wird. Ich denke, Problem in BeginWriteTransaction-Methode.Realm funktioniert nicht nach dem Stoppen laufender App?

Dies ist mein Code:

RLMRealm *realm = [RLMRealm defaultRealm]; 

    [realm beginWriteTransaction]; 

    [realm deleteAllObjects]; 

    [realm commitWriteTransaction]; 

    for (int i = 0 ; i < 2000; i++) { 

     [realm beginWriteTransaction]; 

     PeopleInformation *info = [[PeopleInformation alloc] init]; 

     info.name = [NSString stringWithFormat:@"%@ %d",@"Rohit",i]; 
     info.city = @"Delhi"; 

     [realm addObject:info]; 
     [realm commitWriteTransaction]; 

    } 

NSLog(@"all object %@", [PeopleInformation allObjects]); 
+0

Was meinst du mit "Problem ist, dass wenn ich aufgehört habe, Anwendung zu laufen ..."? Versuchen Sie explizit, die App mitten in der Ausführung zu beenden? – TiM

Antwort

0

Wenn Ihr Code wird an der ersten [realm beginWriteTransaction]; Aussage Einhalt zu gebieten, das würde zu implizieren scheint, dass eine andere Schreibtransaktion woanders bereits geöffnet ist.

Realm erlaubt nur einer Transaktion, die Daten auf der Festplatte gleichzeitig zu ändern, und stoppt absichtlich alle neuen Transaktionen, die beginnen, bis die aktuelle abgeschlossen ist. Ich würde empfehlen, das für den Anfang zu betrachten. Sie können überprüfen, ob sich eine RLMRealm bereits in einer Transaktion über die Eigenschaft -[RLMRealm inWriteTransaction] befindet. :)

Darüber hinaus funktioniert Realm besser, wenn Sie Batch in so wenige Transaktionen wie möglich schreibt. Da Sie eine Transaktion für jede Iteration in dieser for-Schleife öffnen und schließen, erstellen Sie dort 2000 separate Transaktionen, was Realm leicht verlangsamen kann.

Code könnte schneller laufen, wenn Sie es wie folgt statt strukturiert:

[realm beginWriteTransaction]; 
for (int i = 0 ; i < 2000; i++) { 
    PeopleInformation *info = [[PeopleInformation alloc] init]; 

    info.name = [NSString stringWithFormat:@"%@ %d",@"Rohit",i]; 
    info.city = @"Delhi"; 

    [realm addObject:info]; 
} 
[realm commitWriteTransaction]; 

Lassen Sie mich wissen, ob das überhaupt geholfen!

+0

danke es ist wirklich hilfe voll. Also hier fügen wir eine Charge hinzu? –

+0

Mein Vergnügen! Ja, Sie sortieren alle Objekteinfügungen in nur eine Schreibtransaktion. – TiM

Verwandte Themen