내 영역 개체가 저장된 값을 저장하지 않는 이유는 무엇입니까?
-
21-12-2019 - |
문제
나는 쉽고 빠르게 사용할 수있는 내 앱 중 하나에서 작은 오프라인 데이터 저장소를 구현할 솔루션을 찾는 솔루션을 찾고있었습니다. 어쨌든, 나는 "NoFollow noreferrer"> Realm 와 함께 이렇게해서 왔습니다. 그러나, 앱을 시작할 때마다 문제가 발생하는 문제가 발생합니다. 데이터베이스의 내용은 null입니다.
모든 할당을 수행하고 beginwriteTransaction 메소드를 호출합니다. 내 데이터베이스 변수 값을 설정하십시오. 그런 다음 realm 및 마지막으로 commitwriteTransaction 에 에 추가하십시오.
그래서, 나는 nslog 을 수행하여 값이 실제로 올바르게 설정되어 있는지 확인합니다 (내 앱 내에서 업데이트 한 후). 그러나 Xcode iPhone5 시뮬레이터에서 응용 프로그램을 종료하거나 멈추고 다시 실행할 때. viewDIDLOAD 메소드에서 내 앱의 전역 변수로 값을 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 및 comptwriteTransaction 을 두 가지 방법으로 변경했지만 여전히 't 일. 내 앱 내에서 제공하는 값을 가져 오지만 다시 액세스 할 때 데이터베이스에서 해당 값을 당기거나 가져 오지 않습니다.
해결책
realm 객체의 문제점은 객체에 대한 영역을 쿼리하지 않는다는 것입니다.오히려 새 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
가 결코 호출되지 않을 것입니다.뷰가 표시되는 한 트랜잭션을 열어두기보다는 데이터로 변경 한 후에는 쓰기 트랜잭션을 커밋하는 것이 좋습니다. - 끝에 개체를 추가하는 대신 다른 메서드를 변경하여 데이터를 커밋 할 수 있습니다. 데이터 모델에 수신 검색을 Int로 저장하는 것을 고려할 것입니다.