Porque é que o meu Reino objeto não guardar valores armazenados?
-
21-12-2019 - |
Pergunta
Eu estava navegando à procura de uma solução para implementar um pequeno off-line de armazenamento de dados em um dos meus aplicativos que seria fácil e rápido de usar.De qualquer forma, me deparei com Reino para fazer isso.Mas, eu estou recebendo um problema que toda vez que eu lançar meu aplicativo o conteúdo do banco de dados é null.
Eu faço toda a alocação e chamar o beginWriteTransaction o método.Definir o meu banco de dados o valor da variável.Em seguida, adicionar o objeto para reino e, finalmente, commitWriteTransaction.
Então, eu faço um NSLog para ver se o valor é, na verdade, definir corretamente o que é(depois de atualizá-lo dentro do meu app).Mas quando eu desligar o meu pedido ou parado e executá-la novamente no xcode iphone5 simulador.Eu tento definir no método viewDidLoad o valor do banco de dados para uma variável global em meu aplicativo.O que eu executar uma NSLog para verificar se o valor é em meu banco de dados ou a variável global mas é apresentar como nulo, o que significa que não está a obter loja/salvo.
Este é o código..
@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];
}
Eu também tomar em consideração quaisquer outras opções para conseguir isso..Obrigado!
*****ATUALIZAÇÃO!** É isso que eu recebo no meu teste, que eu mudei para o fazer beginWriteTransaction e commitWriteTransaction em ambos os métodos, mas ainda não funciona.Ele obtém o valor que eu fornecer dentro do meu app, mas quando eu acesso, novamente, ela não puxar/busca que o valor do banco de dados se ele já foi loja..
Solução
O problema com o seu reino de objeto é que você não está a consultar o reino para seu objeto.Em vez disso, você está apenas a atribuição de um novo iReciptDataBase
objecto.Você precisa primeiro adicionar uma propriedade para o objeto de modo que você será capaz de consulta para ele, algo como databaseId
mostrado aqui:
@interface iReceiptDatabase : RLMObject
@property NSString *receiptNo;
@property NSString *databaseId;
@end
@implementation iReceiptDatabase
@end
RLM_ARRAY_TYPE(iReceiptDatabase)
Em seguida, no seu viewDidLoad, consultar primeiro o reino de arquivo para um objeto existente e, em seguida, somente após não encontrá-lo, você deve atribuir-lo:
- (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];
}
//...
}
Outras dicas
Meu palpite seria viewWillDisappear
nunca é chamado.Eu recomendaria de confirmar a gravação de transação após cada alteração aos seus dados em vez de deixar a transação aberta enquanto a vista é visível - em vez de adicionar o objeto no final, você pode alterar seus outros métodos para confirmar os dados:
- (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);
}
Eu gostaria também de considerar o armazenamento de receiptNo como um int em seu modelo de dados.