핵심 데이터가있는 온라인 데이터베이스 지속성 문제가 있습니까?

Josue Espinosa

온라인에서 데이터베이스 지속성 / 유지 관리 작업을하는 것은 이번이 처음이므로 실수 한 코드에 대해 미리 사과드립니다. 내 앱은 사용자가 여러 선수를 만들고 데이터를 온라인에 저장하여 모든 장치에서 액세스 할 수 있도록 구성됩니다. 선수들이 온라인에서 두 번 저장된다는 점을 제외하면 환상적으로 작동합니다. 머리를 뜯어 내고 싶습니다. 내 코드를 수백 번 확인했지만 선수가 서버에 두 번 저장되어 로컬에서도 2 번 저장되는 이유를 찾을 수없는 것 같습니다. Parse.com 프레임 워크를 사용하고 있습니다. 내가 뭔가를 놓치고 있습니까?

다음 메소드는 풀다운에서 호출되어 테이블 뷰 컨트롤러를 새로 고칩니다.

- (void)getParseData {
    NSLog(@"GET PARSE DATA WAS CALLED");
    if(self.syncing != TRUE){
        NSLog(@"GET PARSE DATA RAN");
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateStyle = NSDateFormatterLongStyle;

    PFQuery *query = [PFQuery queryWithClassName:@"Athlete"];

    [self populateAthleteArray];

    if (self.athleteArray.count == 0) {
        NSLog(@"ATHLETE ARRAY IS EMPTY");
        // If the athlete array has no objects, download all objects from the database.

        [query findObjectsInBackgroundWithBlock: ^(NSArray *objects, NSError *error) {
            self.syncing = TRUE;
            if (!error) {
                self.syncing = FALSE;
                for (PFObject * object in objects) {
                    Athlete *newAthlete = [NSEntityDescription insertNewObjectForEntityForName:@"Athlete" inManagedObjectContext:_managedObjectContext];

                    newAthlete.first = object[@"first"];
                    newAthlete.last = object[@"last"];
                    newAthlete.updatedAt = [dateFormatter stringFromDate:[object updatedAt]];
                    newAthlete.objectId = [object objectId];

                    [_managedObjectContext save:nil];
                }
                self.syncing = FALSE;
            }
            else {
                self.syncing = FALSE;
                NSLog(@"Error: %@ %@", error, [error userInfo]);
            }
            if(self.needToUploadArray.count > 0){
                [PFObject saveAllInBackground:self.needToUploadArray target:nil selector:@selector(emptyUploadArray)];
            }
        }];
        [self populateAthleteArray];
        [self.tableView reloadData];
    }
    else {
        NSLog(@"ATHLETE ARRAY HAS ATHLETES ALREADY");
        // Athlete array has athletes already

        NSMutableArray *athletesToUpload = [NSMutableArray array];
        // Placeholder array for athletes that aren't in the database.

        for (Athlete *athlete in athleteArray) {
            if (athlete.objectId.length == 0 || athlete.objectId == nil) {
                // If the objectId is nil, it wasn't uploaded to the database. Add to placeholder array.
                [athletesToUpload addObject:athlete];
            }
        }

        [query findObjectsInBackgroundWithBlock: ^(NSArray *objects, NSError *error) {
            self.syncing = TRUE;
            if (!error) {
                // Downloaded all athletes successfully
                self.syncing = FALSE;
                BOOL found = FALSE;

                [self populateAthleteArray];

                NSMutableArray *athletesToDelete = [NSMutableArray array];

                for (Athlete * athlete in athleteArray) {

                    for (PFObject * object in objects) {
                        // Check to see each local athlete exists in the online database
                        if ([object.objectId isEqualToString:athlete.objectId]) {
                            // Athlete was find in the online database
                            found = TRUE;
                            break;
                        }
                    }
                    if (found != TRUE) {
                        NSLog(@"%@ was not found online.",athlete.first);
                        if(athlete.objectId.length > 0){
                            NSLog(@"%@ was deleted online. delete them locally",athlete.first);
                            [athletesToDelete addObject:athlete];
                        }
                        else{
                            // No athlete in the local database matched any of the athletes online

                            PFObject *onlineAthlete = [PFObject objectWithClassName:@"Athlete"];
                            onlineAthlete[@"first"] = athlete.first;
                            onlineAthlete[@"last"] = athlete.last;
                            PFFile *imageFile = [PFFile fileWithName:[NSString stringWithFormat:@"%@%@MedicalRelease.jpg", athlete.first, athlete.last] data:athlete.medical_release_image];
                            onlineAthlete[@"medical_release_image"] = imageFile;



                            [onlineAthlete saveInBackgroundWithBlock: ^(BOOL succeeded, NSError *error) {
                                self.syncing = TRUE;
                                if (succeeded) {
                                    NSLog(@"SAVED SUCCESSFULLY");
                                    self.syncing = FALSE;
                                    PFQuery *query = [PFQuery queryWithClassName:@"Athlete"];
                                    [query orderByDescending:@"createdAt"];
                                    [query getFirstObjectInBackgroundWithBlock: ^(PFObject *object, NSError *error) {
                                        Athlete *athleteToChange = [self findAthlete:athlete.objectId];
                                        [athleteToChange setObjectId:[object objectId]];
                                        [_managedObjectContext save:nil];
                                    }];
                                }
                            }];
                        }
                    }
                    found = FALSE;
                }

                if(athletesToDelete.count > 0){
                    for(id athlete in athletesToDelete){
                        NSManagedObject *eventToDelete = athlete;
                        [_managedObjectContext deleteObject:eventToDelete];
                        [athleteArray removeObjectAtIndex:[athleteArray indexOfObject:athlete]];
                        [self.tableView reloadData];
                        NSError *error = nil;
                        if (![_managedObjectContext save:&error]) {
                            NSLog(@"there is an error: %@", error);
                        }
                    }
                }

                for (PFObject *object in objects) {
                    // Loop through every athlete downloaded

                    for (Athlete * athlete in athleteArray) {
                        // For every object downloaded, compare it to every athlete in the local database.

                        if ([object.objectId isEqualToString:athlete.objectId]) {
                            // If the object's id matches the local athletes id, we found the object
                            if ([object updatedAt] >= [dateFormatter dateFromString:athlete.updatedAt]) {
                                // If the object has been updated more recently than the athlete, update the local athlete

                                Athlete *sameAthlete = [self findAthlete:athlete.objectId];

                                sameAthlete.first = object[@"first"];
                                sameAthlete.last = object[@"last"];
                                sameAthlete.updatedAt = [dateFormatter stringFromDate:[object updatedAt]];
                                sameAthlete.address = object[@"address"];
                                sameAthlete.objectId = [object objectId];
                                [_managedObjectContext save:nil];
                            }
                            found = TRUE;
                            // The athlete was found in the database
                            break;
                        }
                    }
                    if (found != TRUE) {
                        // We looped through all the local athletes, the object downloaded isn't in the local database; add them.

                        Athlete *athlete = [NSEntityDescription insertNewObjectForEntityForName:@"Athlete" inManagedObjectContext:_managedObjectContext];
                        athlete.first = object[@"first"];
                        athlete.last = object[@"last"];
                        athlete.objectId = [object objectId];
                        athlete.address = object[@"address"];
                        athlete.updatedAt = [dateFormatter stringFromDate:[object updatedAt]];
                        [_managedObjectContext save:nil];
                    }
                    // Reset flag var
                    found = FALSE;
                }


            }
            else {
                self.syncing = FALSE;
                NSLog(@"Error: %@ %@", error, [error userInfo]);
            }
            self.syncing = FALSE;
        }];

        if (athletesToUpload.count > 0) {
            for (Athlete *athlete in athletesToUpload) {
                PFObject *upload = [PFObject objectWithClassName:@"Athlete"];
                upload[@"first"] = athlete.first;
                upload[@"last"] = athlete.last;
                PFFile *imageFile = [PFFile fileWithName:[NSString stringWithFormat:@"%@%@MedicalRelease.jpg", athlete.first, athlete.last] data:athlete.medical_release_image];
                upload[@"medical_release_image"] = imageFile;
                [upload saveInBackgroundWithBlock: ^(BOOL succeeded, NSError *error) {
                    if (succeeded) {
                        PFQuery *uploadQuery = [PFQuery queryWithClassName:@"Athlete"];
                        [uploadQuery orderByDescending:@"createdAt"];
                        [uploadQuery getFirstObjectInBackgroundWithBlock: ^(PFObject *object, NSError *error) {
                            [athlete setObjectId:[object objectId]];
                        }];
                    }
                }];
            }
        }

        [self populateAthleteArray];
        [self.tableView reloadData];
    }
    }
}
세르지오

주석으로 표시된 분기 // No athlete in the local database matched any of the athletes online에서 새 항목을 만들고 PFObjectParse에 저장합니다. 내 이해에 따르면 운동 선수가 로컬 db가 아니라 온라인이기 때문에 이것은 정확하지 않아야합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

핵심 데이터가 활성화되어 있는지 Xcode 확인

분류에서Dev

핵심 데이터가있는 사용자 지정 TableViewCell

분류에서Dev

핵심 데이터의 두 항목간에 관계가 있는지 확인할 수있는 방법이 있습니까?

분류에서Dev

온라인 데이터베이스가있는 Android 앱

분류에서Dev

핵심 데이터 문제가있는 검색 창

분류에서Dev

고유 속성 만있는 핵심 데이터 가져 오기 엔티티

분류에서Dev

핵심 데이터가있는 NSPredicate, 문자열 속성에 경계가있는 검색어

분류에서Dev

핵심 데이터가있는 NSPredicate, 문자열 속성에 경계가있는 검색어

분류에서Dev

핵심 데이터-가져온 객체에서 동일한 속성 감지

분류에서Dev

핵심 데이터가 속성을 제대로 저장하지 않는 이유는 무엇입니까?

분류에서Dev

내가 찾고있는 핵심 데이터입니까?

분류에서Dev

어레이 속성이있는 핵심 데이터

분류에서Dev

Pacman이 "데이터베이스 '핵심'이 존재하지 않습니다"라고 불평합니다.

분류에서Dev

핵심 데이터 "데이터베이스가 손상된 것 같습니다"-이 오류의 원인은 무엇입니까?

분류에서Dev

데이터베이스에 레코드가 있는지 확인

분류에서Dev

SQLite : 데이터베이스가 있는지 확인

분류에서Dev

핵심 데이터 : 객체가있는 NSFetchedResultsController가 관계에 있습니다.

분류에서Dev

최신 OUI 데이터베이스가 온라인입니까?

분류에서Dev

SQLite 데이터베이스가 C / C ++에서 열려 있는지 어떻게 확인할 수 있습니까?

분류에서Dev

핵심 데이터 : 속성과 변수의 차이가 최소 인 객체

분류에서Dev

MySQL / PHP는 데이터가 데이터베이스 테이블에 있는지 확인합니다.

분류에서Dev

오프라인지도 및 데이터베이스가있는 Android 앱

분류에서Dev

핵심 데이터 엔티티의 두 가지 속성에 따라 객체 삭제

분류에서Dev

다중 관계가있는 핵심 데이터 하위 쿼리

분류에서Dev

비교기가있는 핵심 데이터 정렬 설명자

분류에서Dev

핵심 데이터-추가 속성 생성 또는 데이터 구조화

분류에서Dev

문서 기반 핵심 데이터 앱-추가 속성 추가 및 제거

분류에서Dev

정말 내구성있는 데이터베이스가 있습니까?

분류에서Dev

PouchDB는 로컬 데이터베이스가 있는지 확인합니다.

Related 관련 기사

  1. 1

    핵심 데이터가 활성화되어 있는지 Xcode 확인

  2. 2

    핵심 데이터가있는 사용자 지정 TableViewCell

  3. 3

    핵심 데이터의 두 항목간에 관계가 있는지 확인할 수있는 방법이 있습니까?

  4. 4

    온라인 데이터베이스가있는 Android 앱

  5. 5

    핵심 데이터 문제가있는 검색 창

  6. 6

    고유 속성 만있는 핵심 데이터 가져 오기 엔티티

  7. 7

    핵심 데이터가있는 NSPredicate, 문자열 속성에 경계가있는 검색어

  8. 8

    핵심 데이터가있는 NSPredicate, 문자열 속성에 경계가있는 검색어

  9. 9

    핵심 데이터-가져온 객체에서 동일한 속성 감지

  10. 10

    핵심 데이터가 속성을 제대로 저장하지 않는 이유는 무엇입니까?

  11. 11

    내가 찾고있는 핵심 데이터입니까?

  12. 12

    어레이 속성이있는 핵심 데이터

  13. 13

    Pacman이 "데이터베이스 '핵심'이 존재하지 않습니다"라고 불평합니다.

  14. 14

    핵심 데이터 "데이터베이스가 손상된 것 같습니다"-이 오류의 원인은 무엇입니까?

  15. 15

    데이터베이스에 레코드가 있는지 확인

  16. 16

    SQLite : 데이터베이스가 있는지 확인

  17. 17

    핵심 데이터 : 객체가있는 NSFetchedResultsController가 관계에 있습니다.

  18. 18

    최신 OUI 데이터베이스가 온라인입니까?

  19. 19

    SQLite 데이터베이스가 C / C ++에서 열려 있는지 어떻게 확인할 수 있습니까?

  20. 20

    핵심 데이터 : 속성과 변수의 차이가 최소 인 객체

  21. 21

    MySQL / PHP는 데이터가 데이터베이스 테이블에 있는지 확인합니다.

  22. 22

    오프라인지도 및 데이터베이스가있는 Android 앱

  23. 23

    핵심 데이터 엔티티의 두 가지 속성에 따라 객체 삭제

  24. 24

    다중 관계가있는 핵심 데이터 하위 쿼리

  25. 25

    비교기가있는 핵심 데이터 정렬 설명자

  26. 26

    핵심 데이터-추가 속성 생성 또는 데이터 구조화

  27. 27

    문서 기반 핵심 데이터 앱-추가 속성 추가 및 제거

  28. 28

    정말 내구성있는 데이터베이스가 있습니까?

  29. 29

    PouchDB는 로컬 데이터베이스가 있는지 확인합니다.

뜨겁다태그

보관