objective c - Az NSPersistentDocument könnyű migrációja

Translate

Egy SQLite áruház könnyű áttelepítését próbálom megtenni a Core Data-ban. Az Lion 10.7.3 használata az Xcode 4.3.1 használatával.

Az NSPersistentDocument alosztályomban (AccountDocument) felülírtam a perzisztens tár koordinátor konfigurálásához használt módszert, hogy megkapja a megfelelő opciókat az áttelepítéshez:

- (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;
}

(Köszönet Malcolm Crawfordnak a tippért:http://homepage.mac.com/mmalc/CocoaExamples/controllers.html)

Amikor futtatom az alkalmazást, az nem sikerül az NSPersistentDocument alkalmazásának végrehajtásában-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

Amit a dokumentációból megtudhatok, az alapértelmezett megvalósítás így néz ki:

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

Tehát, hogy még egy kicsit hibakereshessem a problémát, felülírtam ezt a módszert:

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

(Köszönet Jeff LaMarche-nak az ötletért:http://iphonedevelopment.blogspot.com/2009/09/core-data-migration-problems.html)

A csomag és az URL egyaránt rámutatnak azokra a helyekre, amelyekre számítok (és Marcus Zarra tanácsát követtem a projekt megtisztításában, így az alkalmazáscsomagban nincsenek kóbor.A mergedModelFromBundles: és verziószám (CoreData) használata). Az alkalmazás azonban továbbra is összeomlik, miközben betölti a modellt az URL-ből.

Megnéztem, hogy a AccountDocument2.xcdatamodeld egy olyan csomag, amelynek két verziója van a verziókhoz: AccountDocument 2.xcdatamodel és (az eredeti) AccountDocument.xcdatamodel. A fájl tulajdonságainak "Verziózott alapadat-modell" felugró menüje "AccountDocument 2" -re van állítva.

Az egyetlen különbség a két modell között az, hogy egy entitásnak van egy kiegészítő (és opcionális) attribútuma. Megértésem szerint ez minősíti a könnyű migráció modelljét.

Nyilvánvalóan valamit rosszul csinálok itt, de fogalmam sincs mit. Bármely segítséget a legjobban értékelnénk ...

Frissítés:

Martin javaslata szerint (és az NSPersistentDocument dokumentációjának ellenőrzése) megpróbáltam ezt a kódot használni az hozzáféréshez:

- (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;
}

Még mindig összeomlik…

Frissítés

Néhány Twitter-javaslat után frissítettem az Xcode 4.3.2-re, de a problémák továbbra is fennállnak.

RAGE FRISSÍTÉS

Most hoztam létre a verziószámú modellcsomagot (AccountDocument2.xcdatamodeld) a Snow Leopard Xcode 4.2 használatával. Az alkalmazás elkészítése és futtatása után minden a várt módon működik.

Ezután visszavittem a AccountDocument2.xcdatamodeld fájlcsomagot a Lion és az Xcode 4.3.2-re. Amikor elkészítem és futtatom az alkalmazást, a .momd erőforrás betöltése közben továbbra is összeomlik. Igen gyerekek, ez azt jelenti, hogy az Xcode 4.3.x és a Data Model Compiler (MOMC) a hibás. Nem látok más megoldást, mint az összes építkezésemet a Snow Leopardon.

Nem vagyok az Xcode 4 bash-ja, de amikor olyan helyzetbe kerülünk, hogy az eszközlánc nem képes átlátszatlan fájlt (.mom és .momd) létrehozni egy átlátszatlan specifikációból (.xcdatamodel és .xcdatamodeld), akkor elég nehéz legyen lendületes a Mac és az iOS eszközök állapotáról. Nevetséges, hogy ezeknek a platformoknak az egyik alapvető eleme olyan mértékben megszakad, hogy nem tudom az SDK és a fejlesztői eszközök legújabb verziójával felépíteni és futtatni az alkalmazásomat.

Gyere el erre a frissítésre

További bizonyíték arra, hogy ez egy súlyos hiba az Adatmodell-fordítóval (MOMC) az Xcode 4.3.2-ben: ha a .momd csomagot átmásolom az Xcode 4.2 által létrehozott erőforrás mappából a projektembe, és fájlok másolásaként hozzáadom az építkezéshez építési fázis, az alkalmazás jól működik.

Néhány tesztet is elvégeztem, ahol eltávolítottam a különböző entitások attribútumainak érvényesítési szabályait és alapértelmezett értékeit (Marcus alábbi javaslata alapján.) Nincs változás, a fordító továbbra is érvénytelen .momd fájlt hoz létre. Megpróbáltam egy olyan verziójú modellt is létrehozni, ahol SEMMI nem változott: a lefordított .momd tovább összeomlott. Tehát bármi is van a jelenlegi modelljeiben (és az általuk képviselt adatokban), ez a probléma forrása.

Megjegyzendő még: ez a hiba nincs elkülönítve az NSPersistentDocument programtól (amire eredetileg gondoltam, amikor ezt a kérdést elkezdtem.) Egy alkalmazás összeomlását okozhatom csupán[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL].

Egyelőre a Snow Leopard Xcode 4.2 használatával szerkesztem / verziószámozom, és a lefordított erőforrásokat áthelyezem az Lion Xcode 4.3.2-re. Ha bármilyen módon használja az alapadatokat, azt javaslom, hogy ugyanezt tegye addig, amíg ezt a hibát nem orvosolja. Hidd el, napokat fogsz tölteni, hogy rájöjj, mi a fene történik, ha nem.

Most küldjön be egy radart ...

Radar frissítés

Most küldtem be ezt a Radart:

http://www.openradar.me/11184500

Az Ó, szar, hogy oroszlán frissítés lehet

Most töltöttem le és telepítettem az Xcode 4.2 for Lion eszközökhözhttp://developer.apple.com/downloads. A Radarban használt minta alkalmazás továbbra is összeomlik.

(Megjegyzés: Az Xcode 4.2.1 nem telepíthető, mert a DeveloperTools.pkg aláírásához használt tanúsítvány lejárt. Csak az Xcode 4.2 működik.)

Ha NDA alatt áll, azt is tapasztalhatja, hogy a béta eszközök sem hasznosak.

Remélem, hogy a Snow Leopard egy példánya Xcode 4.2-vel ül:http://furbo.org/2012/03/28/vmware-for-developers/

A WTF lekérési kérelmek köze vannak a verziószámú entitások és attribútumok frissítéséhez

Via Evadne Wu a Twitteren:

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

És hogyan csinálta:

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

(A .mom fájlok bináris plists.)

A probléma gyökere egyetlen lekérési kérelem. Hogy ez miként alakul át az adatok egyik modellből a másikba történő migrációjába, azt az Apple mérnökeinek kell kitalálnia.

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

Minden válasz

Translate

A lefordított .momd erőforrások betölthetők, miután egy "existingPartner" lekérési kérelem megváltozott:

name == $name

nak nek:

name == $NAME

Ellentmondó, hogy az objektummodell olyan része, amely nem befolyásolja az adatszünetek verziószámának változékonyságát és a könnyű migrációt. A dokumentációból kiderül, hogy nem ez a helyzet:

A Core Data nézete a verziókkal kapcsolatban az, hogy csak a modell azon tulajdonságai érdeklik, amelyek befolyásolják a kitartást.

Használja aTÁMASZTÓkijavítani a lekérési kérelmeket, vagy teljesen törölni őket, és megbízniKódban létrehozott NSPredikátumok.

Forrás
Translate

Azt hiszem, a felügyelt objektum modellt egy példány változóban kell tárolnia. Ön automatikusan kiadott objektumot küld vissza, valószínűleg ez okozza a rossz hozzáférést.

Forrás
Translate

Az elmélete alapján, miszerint ez a MOMC-vel kapcsolatos kérdés, van-e érvényesítési szabály az anyában?

Láttam olyan jelentéseket, ahol az érvényesítési szabályok nem élik túl a 4.x MOMC-t.

Forrás
Z S
Translate

Ez némileg összefüggésben lehet a Fetch Requests használatával kapcsolatos problémámmal, amikor az iOS5 először béta verzióban jelent meg. Összeépítési figyelmeztetést okozott, és elindításakor összeomlik az alkalmazás. Nem igazán használtam a lekérési kérelmet, ezért eltávolítottam, és minden rendben működött:Alapadatokra vonatkozó figyelmeztetés: "A verziókiadási információk nem állnak rendelkezésre minden modellnél"

Forrás
Leave a Reply
You must be logged in to post a answer.
A szerzőről