Friday 22 December 2017

Core dataomvandlings vs binary alternativ


Med ett binärt attribut läser och skriver du instanser av NSData direkt. Med ett omvandlingsbart attribut läser du och skriver instanser av vilken klass som helst som kan konverteras till och från NSData. Den faktiska datalagringen är densamma som med en binär attribut, men Core Data använder en NSValueTransformer för att konvertera från NSData vid behov. Till exempel, säg att ditt hanterade objekt har ett bildattribut där det skulle vara bekvämt att läsa och skriva UIImage direkt. Förutom kan UIImage sparas i Core Data. Men UIImage kan konverteras till och från NSData. Så, om du använde ett transformerbart attribut kunde du läsa och skriva UIImage medan du fortfarande håller NSData i datalagret. svarade jan 10 13 kl 18:43 Tom, Skulle de transformerbara data bibehålla samma NSData beteende angående extern lagring (även om tillåten extern lagring inte är explicit i användargränssnittet, eller skulle blobs börja visas på Core Data Store) Dokumentationen anger inte exakt att det transformerbara attributet sparas i en extern post eller de regler som ska tillämpas. Kan du dela din upplevelse ndash Tommie C. 13 september kl 15:19 Exakt har jag samma fråga. Det finns inget sådant alternativ i Transformable attributtyp som ska lagras i extern Storagequot. Är det som standard aktiverat eller vad ndash Marcin Kapusta 26 feb 16 kl 16:02 När en NSArray sparas till ett omvandlingsbart Core Data-attribut kommer objektet inte att vara tillgängligt för åtkomst vid den efterföljande hämtningen av dess enhet. Det är dock tillgängligt efter eventuell hämtning efter det. Vad som händer kan jag ställa in och spara Core Data-enheten och dess attribut från ett ställe i min iOS-app. Sedan går jag för att läsa den senast sparade enheten. Alla attribut utom de transformerbara NSArraysna är tillgängliga. Av någon anledning visas arrayerna som tomma (när de skrivs ut i loggen ser det ut så här: rutt (n). Om appen stängs och öppnas igen är attributet inte längre tomt. Eventuella idéer jag förstår att sparar en NSArray till Ett omformningsbart attribut är inte den bästa praxisen. Kan du förklara varför detta händer NSArray är fyllt med CLLocation-objekt. Det finns inga fel eller varningar som skrivs ut i konsolen. Inte heller är det några kompilatorvarningar eller fel. Nedan följer en XCTest som jag skrev för Detta problem. Testet misslyckas inte till den sista påståendet (som förväntat). Såsom du kan se nedan är hur Core Data-modellen är inställd i Xcode. Ruttattributet är valt. Observera att jag har provat det båda med och utan övergångsegenskapen. Behöver jag lägga till ett värde Transformatornamn. Vad är det här Core Data Management-koden i sig kommer från min GitHub repo, SSCoreDataManger (som fungerar bra enligt min kunskap). Här är saveNewRunWithDate-metoden: Och nedan är RunDataModel NSManage dObject-gränssnitt: I implementeringen är dessa egenskaper inställda med hjälp av dynamisk En attribut för transformerbar enhet är en som passerar genom en instans av NSValueTransformer. Namnet på NSValueTransformer-klassen som ska användas för ett visst attribut anges i den hanterade objektmodellen. När Core Data öppnar attributdatan kommer den att ringa NSValueTransformer valueTransformerForName: för att få en instans av värdetransformatorn. Med hjälp av den här värdetransformatorn fortsatte NSData i affären för enheten kommer att transformeras till ett objektvärde som nås via en egenskap hos det administrerade objektet förekomsten. Du kan läsa mer om detta i avsnittet Core Data Programming Guide. Icke-standardvariga attribut. Som standard använder Core Data värdetransformatorn som är registrerad för namnet NSKeyedUnarchiveFromDataTransformerName och använder det i omvänd för att utföra omvandlingen. Detta kommer att hända om inget värde transformatornamn har specificerats i Core Data Model Editor, och är generellt det beteende du vill ha. Om du vill använda en annan NSValueTransformer måste du registrera sitt namn i din ansökan genom att ringa NSValueTransformer setValueTransformer: forName: och ange strängnamnet i modellredigeraren (eller i kod, vilket är en annan sak). Tänk på att värdetransformatorn du använder måste stödja både framåt och omvänd transformation. Standardvärdetransformatorn kan vrida något objekt som stöder nyckelarkivering i NSData. I ditt fall har du en NSArray (faktiskt en NSMutableArray. Vilket är inte bra). NSArray stöder NSCoding. men eftersom det är en samling måste föremålen innehålla det också - annars kan de inte arkiveras. Lyckligtvis stöder CLLocation NSSecureCoding. en nyare variant av NSCoding. Du kan enkelt testa omvandlingen av en NSArray av CLLocation s med Core Datas transformer. Till exempel: Jag skulle vilja uppmana dig att skriva tester som dessa för transformerbara attribut. Det är enkelt att göra ändringar i din applikation som är inkompatibla med standardtransformatorn (t. ex. att infoga objekt som inte stöder nyckelarkivering). Genom att använda en uppsättning tester som detta kan jag inte reproducera något problem med att arkivera en NSArray av CLLocation s. Det finns en mycket viktig del av din fråga: Av någon anledning visas arrayerna som tomma (när det skrivs i loggen ser det ut som detta: rutt (n). Om appen stängs och öppnas igen är attributet inte längre tomt . Eventuella idéer Det här indikerar att (åtminstone i din ansökan, kanske inte ditt test) data omvandlas och appliceras på enheten i affären. När applikationen anger ruttvärdet fortsätter matrisen till affären - vi vet Detta beror på att nästa gång applikationen startas visas datan. Vanligtvis indikerar detta ett problem i applikationen när man kommunicerar förändringar mellan sammanhang. Från den kod du har lagt fram verkar det som om du använder ett enda sammanhang och bara från huvudtråden - din SSCoreDataManager singleton skulle inte fungera korrekt annars, och det använder den föråldrade gängkonfigurationens parallellmodell. Samtidigt finns det platser SSCoreDataManager använder - performBlock: för att komma åt det enda NSManagedObjectCo ntext. performBlock: bör endast användas med kontekst skapade med en kö-samtidighetstyp. Kontextet som används här skapades med - init. som bara wraps - initWithConcurrencyType: och skickar värdet NSConfinementConcurrencyType. På grund av detta har du definitivt samtidighetsproblem i singleton som mycket sannolikt orsakar något av beteendet du ser. Du förblir ett attributvärde för en enhet, men senare ser du inte att det värde som återspeglas när egenskapen som sätter in attributet brinner ett fel i kontexten för hanterad objekt. Om du kan utvecklas med Xcode 6.x och iOS 8, aktivera Core Data-samtidighetens felsökning genom att skicka lanseringsargumentet till din ansökan. Detta borde göra några av problemen här mer synliga för dig, men bara ringer performBlock: i ett sammanhang som skapats med - init borde orsaka ett undantag som redan ska kastas. Om din ansökan gör något för att svälja undantag som kan dölja detta och fler problem. Det är inte klart från din fråga om du bara ser detta när du försöker få åtkomst till rutter i felsökaren, eller om du också ser bruten funktion när du använder den. Vid felsökning av hanterade objekt måste du vara mycket medveten om när du skjuter ett fel på ett fastighetsvärde. Det är möjligt att du i det här fallet ser en tom matris i debuggern bara för att den är åtkomst på ett sätt som inte orsakar ett brandfel - vilket skulle vara ett korrekt beteende. Från din beskrivning av annat applikationsbeteende verkar det vara möjligt att detta är gränsen för ditt problem - trots allt hålls värdena kvar på rätt sätt. Tyvärr nämner Core Data Programmering Guide knappt vad ett fel är. och gör det sida vid sida med uniquing. Felaktighet är en grundläggande del av Core Data - det mesta av att använda det - och har nästan ingenting att göra med uniquing. Lyckligtvis för flera år sedan uppdaterades programvaruhandboken för inköpshandel med många insikter i Core Data, inklusive fel. Ditt test och singleton har andra problem som tyvärr ligger utanför ramen för denna fråga. Problemet kan vara att inte radera den gamla butiken mellan testkörningarna. Föremålet som du kontrollerar kanske inte är det samma objektet som du just har lagt till. Se också till att den övergående egenskapen inte är inställd. Övergående attribut hålls inte kvar. Heres vad som kan hända i testerna. Vid någon tidpunkt skapade du ny Kör utan en rutt och sparade. Under nästa testkörning skapar du ett annat körobjekt med samma datum DATE01. I stället för att kontrollera egenskapen till objektet som du just skapat, gör du hämtningen sorterad efter datum. Alla dina rutter har samma datum, så sortering efter datum påverkar inte i grunden de sorterade resultaten. Det första objektet för dina hämtningsresultat råkar vara ett gammalt objekt där du inte ställde in egenskapen för rutter. Bara i fall, logga in nyttRun. route-värdet inuti - saveNewRunWithDate. metod. svarade jan 27 15 kl 12:29 quellishs svar ger information om Core Data fel och några av nyanser och trickeries som ligger där. Efter att ha gjort lite grävning, och med hjälp av det svaret, hittade jag en lösning. Innan du hämtar önskad (problem) enhet, uppdatera NSManagedObject i NSManagedObjectContext: Detta uppdaterar de vidhållna egenskaperna hos ett hanterat objekt för att använda de senaste värdena från den ihållande butiken. Det gör också föremålet till ett fel. svarade jan 31 15 på 19:33 Jag hade ett liknande problem med detta, vilket jag hittade mycket svårt att lösa. Till slut löste jag det, men det var inte lösningen här som fixade den. Jag vill dela med mig av vad jag funnit arbetat för alla som står inför samma utmaning som jag. I mitt fall var problemet eftersom jag försökte använda en NSMutableArray som ett transformerbart Core Data attribut. Men jag förstår nu att du inte borde göra det. I stället bör du använda en oföränderlig array (dvs NSArray) och sedan, om du behöver ändra ett värde i arrayen, kopierar du Core Data-arrayen till en lokal, mutabel array (dvs. var NSArray in Swift), gör ändringen till den lokala array och kör sedan ett kommando för att göra Core Data-arrayen lika med den ändrade lokala arrayen. Spara sedan Core Data som normalt. Som jag sa var mitt problem liknande det här, men det var inte detsamma. Och så hävdar jag inte att detta är lösningen på det här problemet. Jag delar helt enkelt detta för att andra kan få nytta om det hjälper dem. svarat mar 19 16 på 0:23 Ditt svar 2017 Stack Exchange, IncUsing Transformable ampamp Binära data egenskaper i Core Data: Som du vet Core Data attribut kan ha egenskaper som Undefined, Integer16, Integer32, Integer64, Float, Decimal, Date, Boolean, String, Double, Binär data i mål C har att erbjuda. Av alla dessa egenskaper är binär data en måste beaktas. Med stöd av alla dessa egenskaper erbjuder Swift-språk också dig transformerbar egenskap som är mycket intressant viktigt. På grund av den här egenskapen kan du lägga vilken typ av data som helst i Core Data utan extra kostnad. I denna handledning kommer jag att visa dig hur du använder båda dessa egenskaper. (Transformerbar egenskap för binär dataampamp). 1. Som vanligt skapar en singleView-mallansökningsampampan det ViktigtDataTypeInCoreData ampamp välj språk som snabb kryptering av ledande data Avmarkerad vi kommer att infoga vår kärndata modell senare. som visas i bilden nedan: 2. Lägg till en låt vars URL vi kommer att lagra i urlOfSong-attributet som vi kommer att skapa inom kort. 3. Nu när vi har ett projekt för att slutföra ampamp använder vi Core Data egenskaper så nu skapar vi en Cocoa Touch-klass med namnet Persistence som är underklass av NSObject ampamp då för att inkludera modellklick på ViktigdatatypInCoreData-mappen ampamp klicka på Ny fil - gt Core Data (iOS-fält) - gtData Model ampamp namnge det egenskaper fortsätt sedan tills det kommer att skapas som visas i Bild: 4. Öppna nu den modell som du just skapat ampamp lägga till en enhet med namnet UseOfDataTypes med två attribut urlOfSong ampamp namn av typ Transformable ampamp Binary Data, som visas i bilden nedan: 5. Håll enheten UseOfDataTypes vald, vi ska skapa en NSObject Class. Klicka på redaktörens ampamp och klicka sedan på Create NSmanagedObject Subclass alternativ ampamp följ instruktionerna tills klassen med samma namn som enhet kommer att skapas. NSObject-underklass skapas med samma namn en enhet UseOfDataTypes öppna den ampamp du ser något som visas i nedan presenterade Bild: Som visas i detta Image urlOfSong-attributet är av typen AnyObject eftersom den är av transformerbar typampamp måste den transformeras in i vad vi behöver lagra i Core Data ampamp namn är av typen NSData eftersom vi sätter den på Binary Data i modellen. Fortsätt ampamp omvandla din klass till något visat i bilden nedan: var managedObjectContext. NSManagedObjectContext. låt modellURL NSBundle. mainBundle (). URLForResource (properties. WithExtension: momd) låt managedObjectModel NSManagedObjectModel (contentOfURL: modelURL) låt storeURL Persistence. applicationDocumentDirectory. URLByAppendingPathComponent (properties. sqlite) Låt beständigStoreCoordinator NSPersistentStoreCoordinator (managedObjectModel: managedObjectModel) var fel. NSError. nil if (persistentStoreCoordinator. addPersistentStoreWithType (NSSQLiteStoreType. konfiguration: noll. URL: storeURL, alternativ: noll. fel: amperror) nil) låt managedObjectContext NSManagedObjectContext () managedObjectContext () managedObjectContext. persistentStoreCoordinator persistentStoreCoordinator Här i den ovan angivna koden allt vi gör är bara att få vägen där vi lagrar den modell som vi skapade namngiven som properties. xcdatamodeld ampamp och skapar sedan persistensbutiken koordinator ampamp ManagedObjectModel ampamp Context. ------ gtgtgtgtgtgt Nu har vi allt setup lägg till följande kod till Persistence. Swift File för att lagra objekt till Core Data: låt anyObject NSEntityDescription. insertNewObjectForEntityForName (UseOfDataTypes. inManagedObjectContext: managedObjectContext) som. UseOfDataTypes låt sökvägen NSURL (fileURLWithPath: NSBundle. MainBundle (). PathForResource (pooja. OfType: mp3)) anyObject. urlOfSong path som NSURL var archievedName NSKeyedArchiver. archivedDataWithRootObject (Namn) arkiverar data som ska lagras i Core Data för binär data attribut

No comments:

Post a Comment