2014-11-24 14 views
6

Sono in difficoltà con l'eliminazione degli oggetti realm e dei relativi oggetti RLMArray child (e secondari)!Elimina un oggetto realm e tutti i suoi RLMArrays

La figura seguente mostra l'attuale regno-struttura (screenshot del Reame-Browser):

Current realm structure

Come si può vedere, ci sono attualmente tre oggetti RLMTopoResult creati, ciascuno con 86 RLMCriteria come bambini -Array. (Ciò che non è visibile è che ognuno di questi RLMCriteria ha anche la sua Array RLMStatistics - ecco perché ci sono tanti oggetti RLMStatistics come oggetti RLMCriteria).

Ora, l'idea è di eliminare un RLMTopoResult (con un predittore che filtra secondo TopoNrRLM)!

applico il seguente codice:

- (void) removeObjects_at_TopoNr_from_LocationRLM :(NSUInteger)TopoNr :(NSString *)folderName :(NSString *)fileName { 

    RLMRealm *realm = [RLMRealm realmWithPath:[self get_TopoResultRLM_FilePath :folderName :fileName]]; 
    RLMResults *resultTopoResult = [RLMTopoResult allObjectsInRealm:realm]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"TopoNrRLM == %d", TopoNr]; 
    RLMResults *resultsTopoNr = [resultTopoResult objectsWithPredicate:predicate]; 

    if ([resultsTopoNr count] > 0) { 
     if (TopoNr <= (int)[resultsTopoNr count]) { 
      [realm beginWriteTransaction]; 
      [realm deleteObject:[resultsTopoNr firstObject]]; 
      [realm commitWriteTransaction]; 
     } 
     else { 
      NSLog(@"Fail...trying to remove TopoResult-object with TopoNr bigger to object-count"); 
     } 
    } 
    else { 
     NSLog(@"Fail...trying to remove TopoResult-object in empty Realm"); 
    } 
} 

L'esecuzione del metodo di cui sopra con TopoNr = 2 eliminazioni (come previsto) il RLMTopoResult Nr2 (vedi provocare-foto in basso) -> Ma, purtroppo, non è così elimina i suoi Array-Children (e subchildren) !!! Dopo la cancellazione di RLMTopoResult-Nr2, ci sono ancora 3x86 = 258 RLMCriteria (e anche 258 RLMStatistics). Ma previsto sarebbe 2x86 = 172 !!!!

Cosa posso fare per eliminare automaticamente anche i 86 RLMCriteria (ei relativi 86 RLMStatistics) allegati al corrispondente RLMTopoResult ???

Qualsiasi aiuto apprezzato!

L'immagine seguente mostra il risultato dopo la cancellazione di TopoResult Nr2 (con codice di cui sopra): (dovrebbe avere 172 RLMCriteria invece di 258 ... ciò che è ancora sbagliata ?? ...!)

enter image description here

risposta

8

Le regole di cancellazione a cascata stanno arrivando al reame in una versione futura, ma nel frattempo è possibile farlo da soli abbastanza facilmente. Ecco una versione aggiornata del tuo metodo che elimina i bambini topo:

- (void) removeObjects_at_TopoNr_from_LocationRLM :(NSUInteger)TopoNr :(NSString *)folderName :(NSString *)fileName { 
    RLMRealm *realm = [RLMRealm realmWithPath:[self get_TopoResultRLM_FilePath :folderName :fileName]]; 
    [realm beginWriteTransaction]; 
    RLMResults *topos = [RLMTopoResult objectsInRealm:realm where:@"TopoNrRLM == %d", TopoNr]; 
    for (RLMTopoResult *topo in topos) { 
     [realm deleteObjects:topo.CriteriaRLM]; 
    } 
    [realm deleteObjects:topos]; 
    [realm commitWriteTransaction]; 
} 
+0

Grazie jpsim! Questo ha senso ora. L'avevo risolto fino ad ora spogliando una proprietà "TopoNr" su CriteriaRLM e cercando con un predittore per quelli. Ma la tua soluzione è più elegante. Molte grazie ! – iKK

+0

Un'ulteriore domanda correlata: Che dire se "CriteriaRLM" aveva anche un RLMArray (chiamiamolo "StatisticsRLM"). Non sembra funzionare allo stesso modo, cioè per (RLMTopoResult * topo2 in topos) {[realm deleteObjects: topo2.CriteriaRLM.StatisticsRLM];} non funziona. Eventuali suggerimenti ?? Ancora una volta, sono stato in grado di aggiungere una proprietà aggiuntiva "TopoNr" anche a StatisticsRLM e alla fine potrei anche usare un predittore per eliminarli .... – iKK

+0

Ricorda che 'topo2.CriteriaRLM' è un RLMArray, quindi dovrai iterare su quelli per chiamare 'deleteObjects: criteria.StatisticsRLM' – jpsim

Problemi correlati