खोज…


टिप्पणियों

यह कोर डेटा स्टैक का एक कार्यान्वयन है, जिसे प्रोजेक्ट बनाते समय कोर डेटा के साथ प्रोजेक्ट बनाए जाने पर शुरू में AppDelegate फ़ाइल में रखा जाता है। ये कार्य CoreDataStack.swift लिए अलग वर्ग में भी लागू किए जा सकते हैं। NSManagedObjectContext प्राप्त करने के लिए एक प्रमुख कार्य है।

उद्देश्य सी

- (NSManagedObjectContext *)managedObjectContext {...}

स्विफ्ट 2

lazy var managedObjectContext: NSManagedObjectContext = {...}

स्विफ्ट 3

lazy var persistentContainer: NSPersistentContainer = {...)
let managedObjectContext = persistentContainer.viewContext

कोर डेटा स्टैक जो आपके एप्लिकेशन और बाहरी डेटा स्टोर में ऑब्जेक्ट्स के बीच संचार करता है। कोर डेटा स्टैक बाहरी डेटा स्टोर के साथ सभी इंटरैक्शन को संभालता है ताकि आपका एप्लिकेशन उसके व्यावसायिक तर्क पर ध्यान केंद्रित कर सके। स्टैक में तीन प्राथमिक ऑब्जेक्ट होते हैं: प्रबंधित ऑब्जेक्ट संदर्भ ( NSManagedObjectContext ), लगातार स्टोर समन्वयक ( NSPersistentStoreCoordinator ), और प्रबंधित ऑब्जेक्ट मॉडल ( NSManagedObjectModel )।

NSManagedObjectModel

NSManagedObjectModel उदाहरण कोर डेटा स्टैक द्वारा एक्सेस किए जाने वाले डेटा का वर्णन करता है। NSManagedObjectModel (जिसे अक्सर "माँ" कहा जाता है) को स्टैक के निर्माण में पहले चरण के रूप में मेमोरी में लोड किया जाता है। NSManagedObjectModel का एक उदाहरण DataModel.momd है। NSManagedObjectModel डेटा की संरचना को परिभाषित करता है

NSPersistentStoreCoordinator

NSPersistentStoreCoordinator निरंतर स्टोर में डेटा से ऑब्जेक्ट्स का एहसास करता है और उन ऑब्जेक्ट्स को NSManagedObjectContext से NSPersistentStoreCoordinator करता है। यह मॉडल में संस्थाओं के नए उदाहरण बनाता है, और यह एक स्थायी स्टोर ( NSPersistentStore ) से मौजूदा उदाहरणों को पुनः प्राप्त करता है। NSPersistentStoreCoordinator भी पुष्टि करता है कि डेटा एक सुसंगत स्थिति में है जो NSManagedObjectModel की परिभाषाओं से मेल खाता है।

NSManagedObjectContext

जब आप किसी स्थिर स्टोर से ऑब्जेक्ट लाते हैं, तो आप स्क्रैच पैड पर अस्थायी प्रतियां लाते हैं, जहाँ वे ऑब्जेक्ट ग्राफ बनाते हैं (या ऑब्जेक्ट ग्राफ़ का संग्रह)। आप तब उन वस्तुओं को संशोधित कर सकते हैं, जब तक कि आप वास्तव में उन परिवर्तनों को नहीं बचाते हैं, हालांकि, लगातार स्टोर अनलॉक्ड रहता है।

सभी प्रबंधित ऑब्जेक्ट को एक प्रबंधित ऑब्जेक्ट संदर्भ के साथ पंजीकृत होना चाहिए। आप ऑब्जेक्ट ग्राफ में ऑब्जेक्ट्स को जोड़ने और ऑब्जेक्ट ग्राफ से ऑब्जेक्ट्स को हटाने के लिए संदर्भ का उपयोग करते हैं। संदर्भ आपके द्वारा किए गए परिवर्तनों को ट्रैक करता है, दोनों व्यक्तिगत वस्तुओं की विशेषताओं और वस्तुओं के बीच संबंधों के लिए। परिवर्तनों पर नज़र रखने से, संदर्भ आपके लिए पूर्ववत और पुन: समर्थन प्रदान करने में सक्षम है। यह यह भी सुनिश्चित करता है कि यदि आप वस्तुओं के बीच संबंध बदलते हैं, तो वस्तु ग्राफ की अखंडता बनी रहती है।

जब आप परिवर्तन सहेजते हैं तो संदर्भ सुनिश्चित करता है कि आपकी वस्तुएँ एक मान्य स्थिति में हैं। परिवर्तन लगातार स्टोर (या स्टोर) पर लिखे जाते हैं, आपके द्वारा बनाई गई वस्तुओं के लिए नए रिकॉर्ड जोड़े जाते हैं, और आपके द्वारा हटाए गए ऑब्जेक्ट्स के लिए रिकॉर्ड हटा दिए जाते हैं।

स्रोत: ऐप्पल कोर डेटा प्रोग्रामिंग: कोर डेटा स्टैक की शुरुआत

उद्देश्य-सी उदाहरण

यह iOS 10+ के लिए एक सरल लेकिन मजबूत कोर-डेटा सेट-अप है। कोर-डेटा तक पहुंचने के दो तरीके हैं:

  1. देखेंviewContext उपयोग केवल मुख्य धागे से किया जा सकता है, और केवल पढ़ने के लिए।
  2. मजबूत enqueueCoreDataBlock । सभी लेखन enqueueCoreDataBlock का उपयोग करके किया जाना चाहिए। अंत में इसे सहेजने की आवश्यकता नहीं है यह स्वचालित रूप से बचाएगा। सभी लेखन को एक संचालन पंक्ति में समाहित किया गया है, इसलिए कभी भी संघर्ष नहीं लिखा जा सकता है।

यह सुनिश्चित करें कि संदर्भ से किसी भी प्रबंधित करें किसी अन्य संदर्भ में उपयोग करें। इसके अलावा enqueueCoreDataBlock में बनाए गए या प्राप्त किए गए सभी ऑब्जेक्ट्स को इस संदर्भ के रूप में enqueueCoreDataBlock कि ब्लॉक निष्पादित होने के बाद उन्हें वापस नष्ट कर दिया जाएगा।

// CoreDataManager.h

@interface CoreDataManager : NSObject
@property (nonatomic, readonly) NSManagedObjectContext * viewContext;
- (void)enqueueCoreDataBlock:(void (^)(NSManagedObjectContext* context))block;
@end

// CoreDataManager.m

@implementation NSManagedObjectContext(SaveIfNeeded)
-(BOOL) saveIfNeeded{
    BOOL toReturn = YES;
    if ([self hasChanges]) {
        NSError *error;
        toReturn = [self save:&error];
        if (toReturn == NO || error)
        {
            //Here you should log to your analytics service
            NSLog(@"--- Failed to commit data\n error: %@", error);
        }
    }
    return toReturn;
}
@end
@interface CoreDataManager ()
@property (nonatomic, strong) NSPersistentContainer* persistentContainer;
@property (nonatomic, strong) NSOperationQueue* persistentContainerQueue;    
@end
@implementation CoreDataManager

- (id)init
{
    self = [super init]
    if (self)
    {
        self.persistentContainer = [[NSPersistentContainer alloc] initWithName:@"PROJECT_NAME_ALSO_NAME_OF_MODEL" managedObjectModel:managedObjectModel];
        [self.persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription * description, NSError * error) {              
        }];
        self.persistentContainer.viewContext.automaticallyMergesChangesFromParent = YES;
        _persistentContainerQueue = [[NSOperationQueue alloc] init];
        _persistentContainerQueue.maxConcurrentOperationCount = 1;
        _persistentContainerQueue.name = @"persistentContainerQueue";
        dispatch_queue_t queue = dispatch_queue_create("persistentContainerQueue.dispatchQueue", DISPATCH_QUEUE_SERIAL);
        _persistentContainerQueue.underlyingQueue = queue;            
    }
}

- (void)enqueueCoreDataBlock:(void (^)(NSManagedObjectContext* context))block{
    void (^blockCopy)(NSManagedObjectContext*) = [block copy];

    [self.persistentContainerQueue addOperation:[NSBlockOperation blockOperationWithBlock:^{
        NSManagedObjectContext* context =  self.persistentContainer.newBackgroundContext;
        [context performBlockAndWait:^{
            blockCopy(context);
            [context saveIfNeeded];
        }];
    }]];
}

-(NSManagedObjectContext*) viewContext{
    if (![NSThread mainThread]) {
        //here you should log to you analytics service. If you are in developer mode you should crash to force you to fix this
        NSLog(@"access context on wrong thread!!");
    }
    return self.persistentContainer.viewContext;
}

स्विफ्ट 2 उदाहरण

// Core Data stack

lazy var applicationDocumentsDirectory: NSURL = {
    let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
    return urls[urls.count-1]
}()

lazy var managedObjectModel: NSManagedObjectModel = {
    let modelURL = NSBundle.mainBundle().URLForResource("ProjectName", withExtension: "momd")!
    return NSManagedObjectModel(contentsOfURL: modelURL)!
}()

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {

    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
    var failureReason = "There was an error creating or loading the application's saved data."
    do {
        try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil)
    } catch {
        var dict = [String: AnyObject]()
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
        dict[NSLocalizedFailureReasonErrorKey] = failureReason

        dict[NSUnderlyingErrorKey] = error as NSError
        let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
        print("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
        abort()
    }
    
    return coordinator
}()

lazy var managedObjectContext: NSManagedObjectContext = {
    let coordinator = self.persistentStoreCoordinator
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
    managedObjectContext.persistentStoreCoordinator = coordinator
    return managedObjectContext
}()

// Core Data Saving support

func saveContext () {
    if managedObjectContext.hasChanges {
        do {
            try managedObjectContext.save()
        } catch {
            let nserror = error as NSError
            print("Unresolved error \(nserror), \(nserror.userInfo)")
            abort()
        }
    }
}

स्विफ्ट में iOS 10 का उदाहरण

lazy var persistentContainer: NSPersistentContainer = {
    
    let container = NSPersistentContainer(name: "ProjectName")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        
        if let error = error {
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()
    
func saveContext () {
    let context = persistentContainer.viewContext
    
    do {
        try context.save()
    } catch {
        let nserror = error as NSError
        fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
    }
    
    if context.hasChanges {
        print("changes occured")
    }else {
        print("no changes occured")
    }
    
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow