3

私は自分のアプリの 1 つに小さなオフライン データ ストレージを実装するための、簡単かつ迅速に使用できるソリューションを探していました。とにかく、これを行うためにRealmに出会いました。しかし、アプリを起動するたびにデータベースのコンテンツが null になるという問題が発生しています。

すべての割り当てを行い、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を実行するように変更しましたが、まだ機能しません。アプリ内で提供する値を取得しますが、再度アクセスすると、その値が格納されていた場合、データベースからその値をプル/フェッチしません..

NSLog とコードの一部を示す Xcode 6 のスクリーンショット

4

2 に答える 2

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

また、データ モデルの int として receiveNo を格納することも検討します。

于 2014-07-30T00:09:36.930 に答える