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..

Screenshot of Xcode 6 showing NSLog and part of the code

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top