Почему мой realm объект не спасает сохраненные значения?
-
21-12-2019 - |
Вопрос
Я просматривал решение для реализации небольшого автономного хранения данных в одном из моих приложений, которые были бы легкими и быстрыми для использования. В любом случае, я столкнулся с realm для этого. Но я получаю проблему, что каждый раз, когда я запускаю мое приложение, содержимое в базе данных является NULL.
Я делаю все распределение и вызовите beginwritetransaction метод. Установите мое значение переменной базы данных. Затем я добавляю объект на
Итак, я делаю 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 в обоих методах, но все еще не работать. Это получает значение, которое я предоставляю в моем приложении, но когда я снова получаю доступ, он не тянет / извлекает это значение из базы данных, если это было когда-либо хранить ..
Решение
Проблема с объектом вашего 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 на вашей модели данных.