objective c - NSPersistentDocumentin kevyt siirto

Translate

Yritän tehdä kevyen siirron SQLite-myymälästä Core Data -palvelussa. Työskentely Lion 10.7.3: lla Xcode 4.3.1: n kanssa.

NSPersistentDocument-alaluokassani (AccountDocument) olen ohittanut menetelmän, jota käytetään pysyvän myymäläkoordinaattorin määrittämiseen, jotta se saa oikeat vaihtoehdot siirtymiselle:

- (BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError **)error
{
    NSMutableDictionary *newStoreOptions;
    if (storeOptions == nil) {
        newStoreOptions = [NSMutableDictionary dictionary];
    }
    else {
        newStoreOptions = [storeOptions mutableCopy];
    }
    [newStoreOptions setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    [newStoreOptions setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];

    BOOL result = [super configurePersistentStoreCoordinatorForURL:url ofType:fileType modelConfiguration:configuration storeOptions:newStoreOptions error:error];
    return result;
}

(Kiitos Malcolm Crawfordille tästä vinkistä:http://homepage.mac.com/mmalc/CocoaExamples/controllers.html)

Kun suoritan sovelluksen, se epäonnistuu NSPersistentDocumentin toteutuksessa-managedObjectModel:

* thread #1: tid = 0x2703, 0x00007fff931d9350 libobjc.A.dylib`objc_msgSend_vtable13 + 16, stop reason = EXC_BAD_ACCESS (code=13, address=0x0)
    frame #0: 0x00007fff931d9350 libobjc.A.dylib`objc_msgSend_vtable13 + 16
    frame #1: 0x00007fff8935e975 CoreData`-[NSKnownKeysDictionary1 _setValues:retain:] + 197
    frame #2: 0x00007fff8935f288 CoreData`_newReadModelFromBytes + 648
    frame #3: 0x00007fff8935b93e CoreData`+[NSManagedObjectModel(_NSManagedObjectModelPrivateMethods) _newModelFromOptimizedEncoding:error:] + 9310
    frame #4: 0x00007fff89359451 CoreData`-[NSManagedObjectModel(_NSManagedObjectModelPrivateMethods) initWithContentsOfOptimizedURL:] + 305
    frame #5: 0x00007fff89358d7b CoreData`-[NSManagedObjectModel initWithContentsOfURL:] + 443
    frame #6: 0x00007fff893e9519 CoreData`+[NSManagedObjectModel mergedModelFromBundles:] + 377
    frame #7: 0x00007fff8ded7037 AppKit`-[NSPersistentDocument managedObjectModel] + 301
    frame #8: 0x00007fff8ded70b3 AppKit`-[NSPersistentDocument managedObjectContext] + 75
    frame #9: 0x00007fff8ded6e3f AppKit`-[NSPersistentDocument _persistentStoreCoordinator] + 18
    frame #10: 0x00007fff8ded6b5d AppKit`-[NSPersistentDocument configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error:] + 51
    frame #11: 0x0000000100003193 BeanCounter`-[AccountDocument configurePersistentStoreCoordinatorForURL:ofType:modelConfiguration:storeOptions:error:] + 419 at AccountDocument.m:298

Sen perusteella, mitä voin kertoa dokumentaatiosta, oletustoteutus näyttää tältä:

- (id)managedObjectModel
{
    NSManagedObjectModel *result = [NSManagedObjectModel mergedModelFromBundles:nil];
    return result;
}

Joten ongelman virheenkorjaamiseksi hieman enemmän, korvasin tämän menetelmän tällä:

- (id)managedObjectModel
{
    NSBundle *bundle = [NSBundle mainBundle];
    NSURL *url = [bundle URLForResource:@"AccountDocument2" withExtension:@"momd"];
    NSManagedObjectModel *result = [[[NSManagedObjectModel alloc] initWithContentsOfURL:url] autorelease];  
    return result;
}

(Kiitos Jeff LaMarchen ajatuksesta:http://iphonedevelopment.blogspot.com/2009/09/core-data-migration-problems.html)

Nippu ja URL osoittavat molemmat odottamiini paikkoihin (ja olen noudattanut Marcus Zarran neuvoja puhdistaa projekti, joten sovelluspaketissa ei ole harhaanjohtavia .mom- tai .momd-nippuja:MergedModelFromBundles: ja version (CoreData) käyttäminen). Silti sovellus kaatuu ladatessaan mallia URL-osoitteesta.

Olen tarkistanut, että AccountDocument2.xcdatamodeld on paketti, jolla on kaksi versiota versiolle: AccountDocument 2.xcdatamodel ja (alkuperäinen) AccountDocument.xcdatamodel. Tiedoston ominaisuuksien "Versioned Core Data Model" -ponnahdusvalikossa on "AccountDocument 2".

Ainoa ero näiden kahden mallin välillä on, että yhdellä entiteetillä on ylimääräinen (ja valinnainen) attribuutti. Ymmärrän, että se täyttää mallin kevyelle siirtymiselle.

Ilmeisesti teen jotain väärin täällä, mutta minulla ei ole aavistustakaan mitä. Mikä tahansa apu olisi arvostetuinta ...

Päivittää:

Martinin ehdotuksen mukaan (ja NSPersistentDocument-dokumentaation tarkistus) yritin käyttää tätä koodia pääsylaitteelle:

- (id)managedObjectModel
{
    static id sharedManagedObjectModel = nil;

    if (sharedManagedObjectModel == nil) {
        NSBundle *bundle = [NSBundle mainBundle];
        NSURL *url = [bundle URLForResource:@"AccountDocument2" withExtension:@"momd"];
        sharedManagedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:url];
    }

    return sharedManagedObjectModel;
}

Kaatuu edelleen ...

Päivittää

Muutaman Twitter-ehdotuksen jälkeen päivitin Xcode 4.3.2: een, mutta ongelmat jatkuvat.

RAGE-PÄIVITYS

Loin juuri version version (AccountDocument2.xcdatamodeld) käyttämällä Snow Leopardin Xcode 4.2: a. Rakennuksen ja sovelluksen suorittamisen jälkeen kaikki toimii odotetulla tavalla.

Sitten otin AccountDocument2.xcdatamodeld-tiedostopaketin takaisin Lion ja Xcode 4.3.2: een. Kun rakennan ja suoritan sovelluksen, se kaatuu edelleen .momd-resurssia ladattaessa. Kyllä, lapset, se tarkoittaa, että Xcode 4.3.x ja Data Model Compiler (MOMC) ovat syyllisiä. En näe muuta kiertotapaa kuin tehdä kaikki rakennukseni Snow Leopardille.

En ole yksi Xcode 4: n bashista, mutta kun olemme tilanteessa, jossa työkaluketju ei pysty tuottamaan läpinäkymätöntä tiedostoa (.mom ja .momd) läpinäkymättömästä määrityksestä (.xcdatamodel ja .xcdatamodeld), on melko vaikea ole optimistinen Macin ja iOS-työkalujen tilasta. On naurettavaa, että näiden alustojen ydinkomponentti hajoaa siinä määrin, että en voi rakentaa ja käyttää sovellustani SDK: n ja kehittäjien työkalujen uusimmalla versiolla.

Se on tullut tähän päivitykseen

Lisää todisteita siitä, että tämä on vakava virhe Xcode 4.3.2: n Data Model Compiler (MOMC) -ohjelmalla: jos kopioin .momd-paketin Xcode 4.2: n luomasta Resource-kansiosta projektiini ja lisätään ne koontitiedostoon kopiointitiedostoina rakennusvaihe, sovellus toimii hyvin.

Tein myös joitain testejä, joissa poistin validointisäännöt ja oletusarvot eri kokonaisuuksien attribuuteille (perustuen Marcuksen alla olevaan ehdotukseen.) Ei muutoksia, kääntäjä luo edelleen virheellisen .momd-tiedoston. Yritin myös luoda version mallin, jossa MITÄÄN ei muutettu: käännetty .momd jatkoi kaatumista. Joten mitä sinulla on nykyisissä malleissasi (ja niiden edustamat tiedot), on ongelman lähde.

Huomaa myös: tämä vika ei ole eristetty NSPersistentDocumentiin (kuten alun perin ajattelin aloittaessani tämän kysymyksen.) Voin aiheuttaa sovelluksen kaatumisen vain käyttämällä[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL].

Tällä hetkellä muokkaan / versioit mallini käyttämällä Snow Leopardin Xcode 4.2: aa ja siirrän kootut resurssit Lionin Xcode 4.3.2: een. Jos käytät ydintietoja millään tavalla, suosittelen, että teet saman, kunnes tämä virhe on korjattu. Luota minuun, vietät päiviä selvittääksesi, mitä helvettiä tapahtuu, jos et.

Lähetä nyt tutka ...

Tutkan päivitys

Lähetin juuri tämän tutkan:

http://www.openradar.me/11184500

Oh Crap It must Be Lion -päivitys

Latasin ja asennin Xcode 4.2 for Lion -työkalut osoitteestahttp://developer.apple.com/downloads. Tutkassa käytetty esimerkkisovellus kaatuu.

(Huomaa: et voi asentaa Xcode 4.2.1-sovellusta, koska DeveloperTools.pkg: n allekirjoittamiseen käytetty varmenne on vanhentunut. Vain Xcode 4.2 toimii.)

Jos olet NDA: n alla, huomaat myös, että myös beetatyökalut eivät ole hyödyllisiä.

Toivottavasti sinulla on kopio Snow Leopardista, jossa on Xcode 4.2:http://furbo.org/2012/03/28/vmware-for-developers/

WTF: n Do Fetch -pyynnöt liittyvät versioitujen entiteettien ja määritteiden päivitykseen

Via Evadne Wu Twitterissä:

https://twitter.com/#!/evadne/status/187625192342818818

Ja kuinka hän teki sen:

https://twitter.com/#!/evadne/status/187629091518816258

(.mom-tiedostot ovat binaarivalintoja.)

Ongelman ydin on yksi hakupyyntö. Applen insinööri voi selvittää, kuinka tämä luku siirtyy tietomalliin mallista toiseen.

This question and all comments follow the "Attribution Required."

Kaikki vastaukset

Translate

Käännetyt .momd-resurssit voidaan ladata sen jälkeen, kun "existingPartner" -hakupyyntö on muutettu:

name == $name

vastaanottajalle:

name == $NAME

Ei ole järkevää, että osa objektimallista, joka ei vaikuta tietokatkojen version pysyvyyteen ja kevyeen siirtoon. Asiakirjoista käy ilmi, että näin ei pitäisi olla:

Core Datan näkökulma versiointiin on, että sitä kiinnostavat vain mallin ominaisuudet, jotka vaikuttavat pysyvyyteen.

KäytäTUKILUKKOkorjata hakupyynnöt tai poistaa ne kokonaan ja luottaa niihinKoodissa luodut NSPredikaatit.

Lähde
Translate

Mielestäni sinun on tallennettava hallittu objektimalli instanssimuuttujaan. Olet palauttamassa automaattisesti vapautettua objektia, mikä todennäköisesti aiheuttaa huonon pääsyn.

Lähde
Translate

Teorianne perusteella, että kyseessä on MOMC: n ongelma, onko sinulla äidissä validointisääntöjä?

Olen nähnyt raportteja, joissa vahvistussäännöt eivät selviä 4.x MOMC: stä.

Lähde
Z S
Translate

Tämä saattaa liittyä jonkin verran ongelmaan, joka minulla oli hakupyyntöjen käytössä, kun iOS5 tuli ensimmäisen kerran beetaversioon. Se aiheutti rakennusvaroituksen ja kaataa sovelluksen käynnistettäessä. En oikeastaan käyttänyt hakupyyntöä, joten poistin sen ja kaikki toimi hyvin:Perustietojen varoitus: "Versioiden hajautustiedot eivät ole käytettävissä kaikissa malleissa"

Lähde
Leave a Reply
You must be logged in to post a answer.
Kirjailijasta