私のレルムオブジェクトが保存された値を保存しないのはなぜですか?
-
21-12-2019 - |
質問
私は簡単かつ迅速な私のアプリのうちの1つに小さなオフラインのデータストレージを実装するための解決策を探していました。とにかく、私は realm に遭遇しました。しかし、私が私のアプリを起動するたびにデータベース内のコンテンツがNULLであるという問題があります。
すべての割り当てを行い、 beginwriteTransaction メソッドを呼び出します。データベース変数値を設定してください。その後、オブジェクトを realm に追加し、最後に 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];
}
.
私はまたこれを達成するための他のオプションを考慮に入れるでしょう。
*****アップデート!**私が私のテストに入ったもので、どちらのメソッドで beginwriteTransaction と commitwriteTransaction を実行しましたが、それでもそうです。仕事の仕事それは私が私のアプリ内に提供する値を取得しますが、私が再びアクセスしたときにそれが保存されていればデータベースからその値を引いたり取得したりしません。
解決
あなたのレルムオブジェクトの問題はあなたがあなたのオブジェクトにレルムを照会していないということです。むしろ、あなたは新しい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);
}
.
私はまた、あなたのデータモデルのintとしてreceethnoを保存することを検討します。