2011-01-07 156 views
6

我正在研究一个非常复杂的应用程序,其中包含巨大的同步程序beetwen iphone和web服务器。我没有添加记录的麻烦,直到我在分离线程中运行sync程序,并且它会更新serwer上的数据,并将它们发送回iphone。但此过程后,插入新的数据引起的错误,比如这个:无法保存到数据存储:操作无法完成。 (Cocoa错误133020.)

2011-01-07 12:49:10.722 App[1987:207] Failed to save to data store: The operation couldn’t be completed. (Cocoa error 133020.) 
2011-01-07 12:49:10.724 App[1987:207] { 
    conflictList =  (
     "NSMergeConflict (0x5ac1ea0) for NSManagedObject (0x5a2d710) with objectID '0x5a27080 <x-coredata://E82E75ED-96DB-4CBF-9D15-9CC106AC0052/uzytkownicy/p10>' with oldVersion = 9 and newVersion = 21 and old object snapshot = {\n adres = \"<null>\";\n haslo = xxxxxxxxxxxxxxxxxxxxxx;\n \"id_uzytkownika\" = 3;\n imie = Jan;\n \"kod_jednorazowy\" = 0;\n komorka = \"<null>\";\n login = nowakjan;\n nazwisko = Nowak;\n pesel = 0;\n rodzaj = 2;\n \"stan_konta\" = 0;\n telefon = \"<null>\";\n \"uzytkownicy_uczniowie\" = \"<null>\";\n \"zmienna_losowa\" = 8G9e1;\n} and new cached row = {\n adres = \"<null>\";\n haslo = xxxxxxxxxxxxxxxxxxxxxx;\n \"id_uzytkownika\" = 3;\n imie = Jan;\n \"kod_jednorazowy\" = 0;\n komorka = \"<null>\";\n login = nowakjan;\n nazwisko = Nowak;\n pesel = 0;\n rodzaj = 2;\n \"stan_konta\" = 0;\n telefon = \"<null>\";\n \"uzytkownicy_uczniowie\" = \"<null>\";\n \"zmienna_losowa\" = 8G9e1;\n}", 
     "NSMergeConflict (0xd266990) for NSManagedObject (0xcd05950) with objectID '0x5a453b0 <x-coredata://E82E75ED-96DB-4CBF-9D15-9CC106AC0052/uczniowie/p125>' with oldVersion = 5 and newVersion = 10 and old object snapshot = {\n adres = \"Warszawa; ul. Lwowska 32\";\n \"data_urodzenia\" = \"1997-02-01 23:00:00 +0000\";\n dysfunkcje = \"\";\n email = \"<null>\";\n frekwencja = 0;\n \"id_ucznia\" = 86;\n imie2 = Marian;\n \"imie_ucznia\" = \"S\\U0142awomir\";\n klasa = \"0x5a47820 <x-coredata://E82E75ED-96DB-4CBF-9D15-9CC106AC0052/zespoly/p9>\";\n komorka = \"<null>\";\n \"miejsce_urodzenia\" = Warszawa;\n \"nazwisko_ucznia\" = \"S\\U0142awek\";\n \"numer_ewidencyjny\" = 20;\n opiekun1 = \"Mariusz S\\U0142awek\";\n opiekun2 = \" \";\n pesel = 97020298919;\n plec = 1;\n telefon = 890000002;\n \"uzytkownicy_uczniowie\" = \"<null>\";\n \"web_klasa\" = 50;\n} and new cached row = {\n adres = \"Warszawa; ul. Lwowska 32\";\n \"data_urodzenia\" = \"1997-02-01 23:00:00 +0000\";\n dysfunkcje = \"\";\n email = \"<null>\";\n frekwencja = 0;\n \"id_ucznia\" = 86;\n imie2 = Marian;\n \"imie_ucznia\" = \"S\\U0142awomir\";\n klasa = \"0x5a8e7c0 <x-coredata://E82E75ED-96DB-4CBF-9D15-9CC106AC0052/zespoly/p9>\";\n komorka = \"<null>\";\n \"miejsce_urodzenia\" = Warszawa;\n \"nazwisko_ucznia\" = \"S\\U0142awek\";\n \"numer_ewidencyjny\" = 20;\n opiekun1 = \"Mariusz S\\U0142awek\";\n opiekun2 = \" \";\n pesel = 97020298919;\n plec = 1;\n telefon = 890000002;\n \"uzytkownicy_uczniowie\" = \"<null>\";\n \"web_klasa\" = 50;\n}", 
     "NSMergeConflict (0xd2669b0) for NSManagedObject (0x5a44480) with objectID '0x5a47830 <x-coredata://E82E75ED-96DB-4CBF-9D15-9CC106AC0052/przedmioty/p12>' with oldVersion = 7 and newVersion = 15 and old object snapshot = {\n \"id_przedmiotu\" = 1;\n \"nazwa_przedmiotu\" = Historia;\n \"skrot_nazwy\" = Hist;\n} and new cached row = {\n \"id_przedmiotu\" = 1;\n \"nazwa_przedmiotu\" = Historia;\n \"skrot_nazwy\" = Hist;\n}" 
    ); 
} 

我一直在寻找的任何解决方案,但没有运气。

非常感谢您提供任何有用的帮助。


oceny_ucznia *nowaOcenka = (oceny_ucznia *)[NSEntityDescription insertNewObjectForEntityForName:@"oceny_ucznia" inManagedObjectContext:[Factory getVar:@"context"]]; 

    nowaOcenka.przedmiot    = (przedmioty *) [Factory getVar:@"cPrzedmiot"]; 
    nowaOcenka.web_przedmiot   = [NSNumber numberWithInt:[((przedmioty *)[Factory getVar:@"cPrzedmiot"]).id_przedmiotu intValue]]; 
    nowaOcenka.nauczyciel    = (uzytkownicy *)[Factory getVar:@"cNauczyciel"]; 
    nowaOcenka.web_nauczyciel   = [NSNumber numberWithInt:[((uzytkownicy *)[Factory getVar:@"cNauczyciel"]).id_uzytkownika intValue]]; 
    nowaOcenka.lekcja     = (lekcje *)[Factory getVar:@"cLekcja"]; 
    nowaOcenka.uczen     = uczeniek; 
    nowaOcenka.web_uczen    = [NSNumber numberWithInt:[uczeniek.id_ucznia intValue]]; 
    nowaOcenka.czas_wpisania   = [NSDate date]; 

    if (grupka != nil) { 
     nowaOcenka.grupa    = grupka; 
     nowaOcenka.web_grupa   = [NSNumber numberWithInt:[grupka.id_grupy_ocen intValue]]; 
     nowaOcenka.kolumna    = [NSNumber numberWithInt:([kolumienka intValue]+1)]; 
     nowaOcenka.grupa.czas_wpisania = [NSDate date]; 
    } else { 
     int wartoscOceny    = [[Factory getVar:@"cSemestr"] intValue]; 
     wartoscOceny     += ([kolumienka intValue]==0) ? 2 : 0; 
     nowaOcenka.koncowa    = [NSNumber numberWithInt:wartoscOceny]; 
    } 

    nowaOcenka.wartosc     = [NSNumber numberWithFloat:[[((slownik_ocen *)[self.slownikOcen objectAtIndex:[ocena selectedRowInComponent:0]]) wartosc_liczbowa] floatValue]]; 
    nowaOcenka.ocena     = [NSString stringWithFormat:@"%@",[((slownik_ocen *)[self.slownikOcen objectAtIndex:[ocena selectedRowInComponent:0]]) ocena_opis]]; 
    nowaOcenka.semestr     = [NSNumber numberWithInt:[[Factory getVar:@"cSemestr"] intValue]]; 

    ((lekcje *)[Factory getVar:@"cLekcja"]).czas_wpisania = [NSDate date]; 

    NSError* error; 
if(![[Factory getVar:@"context"] save:&error]) { 
     NSLog(@"Failed to save to data store: %@", [error localizedDescription]); 
     NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey]; 
     if(detailedErrors != nil && [detailedErrors count] > 0) { 
      for(NSError* detailedError in detailedErrors) { 
       NSLog(@" DetailedError: %@", [detailedError userInfo]); 
      } 
     } 
     else { 
      NSLog(@" %@", [error userInfo]); 
     } 
} 

厂类描述here,但probablly有与未同步程序之后准确地刷新的上下文的问题。

+1

你使用NSUndoManager吗?请记住,NSManagedObjectContext必须在使用它的线程中创建。 – Felix 2011-01-07 12:19:44

+0

我没有使用UndoManager,我意识到有关准确线程中的init上下文的事实。 – 2011-01-07 12:40:56

回答