Question

Je cherchais une solution pour implémenter un petit stockage de données hors ligne dans l'une de mes applications qui serait facile et rapide à utiliser.Quoi qu'il en soit, je suis tombé sur Royaume pour faire ça.Mais je rencontre un problème : chaque fois que je lance mon application, le contenu de la base de données est nul.

Je fais toute l'allocation et j'appelle le commencerWriteTransaction méthode.Définir la valeur de la variable de ma base de données.Ensuite, j'ajoute l'objet à royaume et enfin commitWriteTransaction.

Alors, je fais un NSLog pour voir si la valeur est réellement définie correctement (après l'avoir mise à jour dans mon application).Mais lorsque j'arrête mon application ou que je l'arrête et que je l'exécute à nouveau dans le simulateur xcode iphone5.J'essaie de définir dans la méthode viewDidLoad la valeur de la base de données vers une variable globale dans mon application.J'effectue un NSLog pour vérifier si la valeur est soit dans ma base de données, soit dans la variable globale, mais elle est affichée comme nulle, ce qui signifie qu'elle n'est pas stockée/enregistrée.

C'est le code..

@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];

}

Je prendrai également en considération toute autre option pour y parvenir.Merci!

*****MISE À JOUR !** C'est ce que j'obtiens dans mon test, pour lequel j'ai modifié commencerWriteTransaction et commitWriteTransaction dans les deux méthodes, mais cela ne fonctionne toujours pas.Il obtient la valeur que je fournis dans mon application, mais lorsque j'y accède à nouveau, il n'extrait/récupère pas cette valeur de la base de données si elle a déjà été stockée.

Screenshot of Xcode 6 showing NSLog and part of the code

Était-ce utile?

La solution

Le problème avec votre objet de domaine est que vous n'interrogez pas de domaine pour votre objet.Au contraire, vous attribuez simplement un nouveau iReciptDataBase objet.Vous devrez d'abord ajouter une propriété à cet objet afin de pouvoir l'interroger, quelque chose comme databaseId montré ici:

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

@implementation iReceiptDatabase
@end

RLM_ARRAY_TYPE(iReceiptDatabase)

Ensuite, dans votre viewDidLoad, vous interrogez d'abord le fichier de domaine pour un objet existant, puis seulement après ne pas l'avoir trouvé, vous l'attribuez :

- (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];
    }

    //...
}

Autres conseils

Je suppose que ce serait viewWillDisappear n'est jamais appelé.Je recommanderais de valider votre transaction d'écriture après chaque modification de vos données plutôt que de laisser la transaction ouverte tant que la vue est visible - au lieu d'ajouter l'objet à la fin, vous pouvez modifier vos autres méthodes pour valider les données :

- (void)viewDidLoad {

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

    [realm beginWriteTransaction];
    self.myDataBase = [[iReceiptDataBase alloc] init]; // property type iReceiptDataBase
    [realm addObject:myDataBase];
    [realm commitWriteTransaction];

    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

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

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

J'envisagerais également de stocker le reçuNo en tant qu'entier sur votre modèle de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top