Почему мой realm объект не спасает сохраненные значения?

StackOverflow https://stackoverflow.com//questions/25026677

  •  21-12-2019
  •  | 
  •  

Вопрос

Я просматривал решение для реализации небольшого автономного хранения данных в одном из моих приложений, которые были бы легкими и быстрыми для использования. В любом случае, я столкнулся с realm для этого. Но я получаю проблему, что каждый раз, когда я запускаю мое приложение, содержимое в базе данных является NULL.

Я делаю все распределение и вызовите beginwritetransaction метод. Установите мое значение переменной базы данных. Затем я добавляю объект на REALM и, наконец, ContureWriteTransaction .

Итак, я делаю 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 и contuctriteTransaction в обоих методах, но все еще не работать. Это получает значение, которое я предоставляю в моем приложении, но когда я снова получаю доступ, он не тянет / извлекает это значение из базы данных, если это было когда-либо хранить ..

Скриншот XCode 6, показывающий NSLOG и часть кода

Это было полезно?

Решение

Проблема с объектом вашего realm заключается в том, что вы не запрашиваете царство для вашего объекта.Скорее, вы выделяете только новый объект iReciptDataBase.Сначала вам нужно будет добавить свойство для этого объекта, чтобы вы сможете запросить его, что-то вроде генеракодицетагкода, показанного здесь:

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

@implementation iReceiptDatabase
@end

RLM_ARRAY_TYPE(iReceiptDatabase)
.

Тогда в вашей программе ViewDidLoad вы сначала запрашивайте файл realm для существующего объекта, то только после того, как он не нашел его, вы выделите его:

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

    //...
}
.

Другие советы

Мое предположение будет генеракодицетагкодом никогда не называется.Я бы порекомендовал совершить свою транзакцию записи после каждого изменения в ваши данные, а не оставляя транзакцию открыть до тех пор, пока вид виден - вместо добавления объекта в конце вы можете изменить другие методы для совершения данных:

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

Я бы также рассмотрел бы хранение CELLIPTNO в качестве int на вашей модели данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top