내 영역 개체가 저장된 값을 저장하지 않는 이유는 무엇입니까?

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

  •  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 일. 내 앱 내에서 제공하는 값을 가져 오지만 다시 액세스 할 때 데이터베이스에서 해당 값을 당기거나 가져 오지 않습니다.

Xcode의 스크린 샷 6 nslog와 코드의 일부를 보여줍니다

도움이 되었습니까?

해결책

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로 저장하는 것을 고려할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top