为什么我的Realm对象没有保存存储的值?

我正在浏览寻找一个解决方案,在我的一个应用程序中实现一个小型离线数据存储,这将很容易和快速使用。 无论如何,我遇到了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]; } 

我还会考虑任何其他选项来实现这一目标。谢谢!

***** UPDATE!**这是我在测试中得到的,我在两种方法中都改为执行beginWriteTransactioncommitWriteTransaction ,但仍然无法正常工作。 它获取了我在我的应用程序中提供的值,但是当我再次访问时,它不会从数据库中提取/获取该值,如果它曾经存储过..

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

您的领域对象的问题在于您没有查询对象的领域。 相反,您只是分配一个新的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]; } //... } 

我的猜测是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。