core-data
कोर डाटा स्टैक
खोज…
टिप्पणियों
यह कोर डेटा स्टैक का एक कार्यान्वयन है, जिसे प्रोजेक्ट बनाते समय कोर डेटा के साथ प्रोजेक्ट बनाए जाने पर शुरू में 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+ के लिए एक सरल लेकिन मजबूत कोर-डेटा सेट-अप है। कोर-डेटा तक पहुंचने के दो तरीके हैं:
- देखें ।
viewContext
उपयोग केवल मुख्य धागे से किया जा सकता है, और केवल पढ़ने के लिए। - मजबूत 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")
}
}