Pregunta

Estaba navegando en busca de una solución a implementar una pequeña de almacenamiento de datos fuera de línea en una de mis aplicaciones que iba a ser fácil y rápido de usar.De todos modos, me topé con Reino para ello.Pero, me estoy poniendo un problema que cada vez que ejecuto mi aplicación el contenido en la base de datos es nulo.

Yo hago todo en la asignación y llamar a la beginWriteTransaction método.Establecer mi base de datos el valor de la variable.Entonces, puedo agregar el objeto a reino y, finalmente, commitWriteTransaction.

Así, hago una NSLog a ver si el valor se establece correctamente que es(después de la actualización de la misma dentro de mi aplicación).Pero cuando voy a apagar mi aplicación o se detiene y vuelve a ejecutar en el xcode iphone5 simulador.Yo trato de establecer en el método viewDidLoad el valor de la base de datos a una variable global en mi aplicación.Que puedo realizar un NSLog para comprobar si el valor es en mi base de datos o la variable global, pero es mostrar como nula, lo que significa que no está recibiendo de la tienda/del guarda.

Este es el 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];

}

También voy a tomar en cuenta otras opciones para lograr esto..Gracias!

*****ACTUALIZACIÓN!** Esto es lo que me sale en mi prueba, que he cambiado a hacer beginWriteTransaction y commitWriteTransaction en ambos métodos, pero aún no funciona.Se obtiene el valor que yo dentro de mi aplicación, pero cuando accedo de nuevo no tire/obtener el valor de la base de datos si se fue nunca de la tienda..

Screenshot of Xcode 6 showing NSLog and part of the code

¿Fue útil?

Solución

El problema con el ámbito objeto de que no estás consultando ámbito de su objeto.Más bien, sólo la asignación de un nuevo iReciptDataBase objeto.Primero será necesario añadir una propiedad al objeto de modo que usted será capaz de consulta para ella, algo así como databaseId se muestra aquí:

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

@implementation iReceiptDatabase
@end

RLM_ARRAY_TYPE(iReceiptDatabase)

A continuación, en su viewDidLoad, primero consulta el reino de archivo de un objeto existente, a continuación, sólo después de no encontrar, se le asigna:

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

    //...
}

Otros consejos

Mi conjetura sería viewWillDisappear nunca se llama.Recomendaría cometer su transacción de escritura después de cada cambio a sus datos en lugar de dejar la transacción abierta siempre que la vista sea visible, en lugar de agregar el objeto al final, puede cambiar sus otros métodos para comprometer los datos:

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

También consideraría almacenar el recibo de recepción como un INT en su modelo de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top