Domanda

Stava navigando in cerca di una soluzione per implementare un piccolo archivio dati offline in una delle mie app che sarebbe facile e veloce da usare. Ad ogni modo, mi sono imbattuto con Realm per fare questo. Ma sto ottenendo un problema che ogni volta che avvio della mia app il contenuto nel database è nullo.

Faccio tutte le assegnazioni e chiamano il metodo BeginWriteTrancAction . Imposta il mio valore variabile del database. Quindi, aggiungo l'oggetto a Realm e infine CommitWriteTrancAction .

Allora, faccio un Nslog per vedere se il valore è effettivamente impostato correttamente quale è (dopo averlo aggiornato all'interno della mia app). Ma quando chiuso la mia applicazione o ho fermato ed eseguito di nuovo nel simulatore Xcode iPhone5. Provo a impostare nel metodo ViewDidLoad il valore dal database a una variabile globale nella mia app. Che eseguo un NSLOG per verificare se il valore è nel mio database o nella variabile globale, ma è visualizzato come null, il che significa che non viene ottenuto archivio / salvato.

Questo è il codice ..

@interface iReceiptDataBase : RLMObject

@property NSString* receiptNo;

@end

RLM_ARRAY_TYPE(iReceiptDataBase)

@implementation iReceiptDataBase

@end

//******** View Controller Implementation ************

- (void)viewDidLoad {

    self.realm = [RLMRealm defaultRealm]; // property type RLMRealm
    [realm beginWriteTransaction];

    self.myDataBase = [[iReceiptDataBase alloc] init]; // property type iReceiptDataBase
    receiptNumber = [myDataBase.receiptNo intValue];

    NSLog(@"In my realm database(first call) -> %@", myDataBase.receiptNo);

    NSLog(@"In my local app(first call) -> %d", receiptNumber);

}

-(void)drawPDF:(NSString*)fName {

    receiptNumber += 1; // property type int

    myDataBase.receiptNo = [NSString stringWithFormat:@"%d", receiptNumber];

    NSLog(@"In my realm database(second call) -> %@", myDataBase.receiptNo);

}

- (void)viewWillDisappear:(BOOL)animated {

    [realm addObject:myDataBase];

    [realm commitWriteTransaction];

}
.

Prenderò anche in considerazione tutte le altre opzioni per raggiungere questo .. Grazie!

***** AGGIORNAMENTO! ** Questo è ciò che ottengo nel mio test, che ho cambiato da fare BeginWritetrAcrazione e ComitatoWritetransaction in entrambi i metodi, ma ancora lavorare. Ottiene il valore che fornisco all'interno della mia app ma quando accedo di nuovo non tira / recupera questo valore dal database se è mai stato archivio ..

Screenshot di XCode 6 Mostrando Nslog e parte del codice

È stato utile?

Soluzione

Il problema con il tuo oggetto Realm è che non stai interrogando il regno per il tuo oggetto.Piuttosto, stai solo allocando un nuovo oggetto iReciptDataBase.Dovrai prima aggiungere una proprietà a quell'oggetto in modo da poter interrogare per questo, qualcosa come databaseId mostrato qui:

@interface iReceiptDatabase : RLMObject
@property NSString *receiptNo;
@property NSString *databaseId;
@end

@implementation iReceiptDatabase
@end

RLM_ARRAY_TYPE(iReceiptDatabase)
.

Poi nel vostro viewdidload, prima interroga il file del regno per un oggetto esistente, solo dopo non averlo trovato, lo assegnerai:

- (void)viewDidLoad {
    [super viewDidLoad];

    RLMRealm *realm = [RLMRealm defaultRealm];
    iReceiptDatabase *myDatabase = [[iReceiptDatabase objectsWhere:@"databaseId = '1'"] firstObject];

    if(!myDatabase) {
        [realm beginWriteTransaction];
        myDatabase = [[iReceiptDatabase alloc] init];
        myDatabase.receiptNo = @"1";
        myDatabase.databaseId = @"1";
        [realm addObject:myDatabase];
        [realm commitWriteTransaction];
    }

    //...
}
.

Altri suggerimenti

La mia ipotesi sarebbe viewWillDisappear non viene mai chiamata.Consiglierei a commettere la tua transazione di scrittura dopo ogni modifica ai tuoi dati piuttosto che lasciare la transazione aperta finché la vista è visibile - invece di aggiungere l'oggetto alla fine, è possibile modificare i tuoi altri metodi per commettere i dati: Considererei anche la memorizzazione di receptno come int sul tuo modello di dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top