3

我正在四处寻找一种解决方案,以在我的一个应用程序中实现小型离线数据存储,该应用程序使用起来既简单又快速。无论如何,我遇到了Realm来做这件事。但是,我遇到了一个问题,每次我启动我的应用程序时,数据库中的内容都是空的。

我完成所有分配并调用beginWriteTransaction方法。设置我的数据库变量值。然后,我将对象添加到领域,最后是 commitWriteTransaction

所以,我做了一个NSLog来查看该值是否实际设置正确(在我的应用程序中更新它之后)。但是当我关闭我的应用程序或停止并在 xcode iphone5 模拟器中再次运行它时。我尝试在 viewDidLoad 方法中将数据库中的值设置为我的应用程序中的全局变量。我执行一个 NSLog 来检查该值是在我的数据库中还是在全局变量中,但它显示为 null,这意味着它没有被存储/保存。

这是代码..

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

}

我还将考虑实现这一目标的任何其他选择。谢谢!

*****更新!** 这是我在测试中得到的结果,我将其更改为在两种方法中执行beginWriteTransactioncommitWriteTransaction,但仍然不起作用。它获取我在我的应用程序中提供的值,但是当我再次访问它时,它不会从数据库中提取/获取该值(如果它曾经存储过的话)。

Xcode 6 的屏幕截图显示了 NSLog 和部分代码

4

2 回答 2

5

您的领域对象的问题是您没有为您的对象查询领域。相反,您只是分配一个新iReciptDataBase对象。您首先需要向该对象添加一个属性,以便能够查询它,如下databaseId所示:

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

@implementation iReceiptDatabase
@end

RLM_ARRAY_TYPE(iReceiptDatabase)

然后在您的 viewDidLoad 中,您首先在领域文件中查询现有对象,然后只有在没有找到它之后,您才会分配它:

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

    //...
}
于 2014-07-30T20:29:46.727 回答
0

我的猜测viewWillDisappear是永远不会被调用。我建议在每次更改数据后提交写入事务,而不是在视图可见时保持事务打开 - 而不是在最后添加对象,您可以更改其他方法来提交数据:

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

我还会考虑将receiptNo 作为int 存储在您的数据模型中。

于 2014-07-30T00:09:36.930 回答