Mevcut iPhone projesine Temel Veriler Ekleme


138

Mevcut bir iPhone projesine temel veriler eklemek istiyorum, ancak yine de çok sayıda derleme hatası alıyorum:

- NSManagedObjectContext undeclared

 - Expected specifier-qualifier-list before 'NSManagedObjectModel'

 - ...

Çekirdek Veri Çerçevesini hedefe zaten ekledim ("Hedefler", "Ekle" - "Mevcut Çerçeveler", "CoreData.framework" altında projeme sağ tıklayın).

Başlık dosyam:

NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;       
NSPersistentStoreCoordinator *persistentStoreCoordinator;

[...]

@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

Neyi kaçırıyorum? Yeni bir proje başlatmak bir seçenek değil ...

Çok teşekkürler!

düzenleme üzgünüm, ben bu uygulamaları var ... ama Kütüphane eksik gibi görünüyor ... uygulama yöntemleri " managedObjectContext undeclared", " NSPersistentStoreCoordinator undeclared" gibi derleme hatası ile dolu , ama aynı zamanda önce NSManagedObjectContext" Beklenen ')' ile " (rağmen parantez doğru gibi görünüyor) ...

#pragma mark -
#pragma mark Core Data stack

/**
 Returns the managed object context for the application.
 If the context doesn't already exist, it is created and bound to the persistent store         
coordinator for the application.
 */
- (NSManagedObjectContext *) managedObjectContext {

    if (managedObjectContext != nil) {
        return managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator: coordinator];
    }
    return managedObjectContext;
}


/**
 Returns the managed object model for the application.
 If the model doesn't already exist, it is created by merging all of the models found in    
 application bundle.
 */
- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    
    return managedObjectModel;
}


/**
 Returns the persistent store coordinator for the application.
 If the coordinator doesn't already exist, it is created and the application's store added to it.
 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] 
        stringByAppendingPathComponent: @"Core_Data.sqlite"]];

    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] 
    initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
    configuration:nil URL:storeUrl options:nil error:&error]) {
    /*
     Replace this implementation with code to handle the error appropriately.

     abort() causes the application to generate a crash log and terminate. You should 
    not use this function in a shipping application, although it may be useful during 
    development. If it is not possible to recover from the error, display an alert panel that 
    instructs the user to quit the application by pressing the Home button.

     Typical reasons for an error here include:
     * The persistent store is not accessible
     * The schema for the persistent store is incompatible with current managed object 
                model
     Check the error message to determine what the actual problem was.
     */
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}    

return persistentStoreCoordinator;
}

Yanıtlar:


144

Tüm CoreData başlık dosyaları içeri aktarılır App_Prefix.pch , böylece CoreData sınıfları Proje boyunca kullanılabilir olur, bu nedenle ihtiyacınız olan dosyalarda başlığı manuel olarak içe aktarmanız gerekmez.

Bu nedenle Xcode'u açın ve App_Prefix.pchvarsayılan olarak Other Sourcesgrupta olduğu gibi bir dosya arayın . UIKitİmport ifadesinden sonra aşağıdaki satırı ekleyin:

#import <CoreData/CoreData.h>

Ve gitmeye hazır olmalısın.

Xcode 4

Xcode 4'te oluşturulan projeler için önek dosyası Supporting FilesProje gezgini içindeki grupta bulunabilir . Adı ' proje adı' varsayılan -Prefix.pch' .

Xcode 6+

Xcode 6'dan başlayarak, önceden derlenmiş başlık dosyası artık varsayılan olarak dahil edilmemiştir. Bunun nedeni, önceden derlenmiş başlıkların kullanılması ihtiyacını ortadan kaldıran Modüllerin tanıtımıdır . CoreData başlıklarını global olarak eklemek için elle bir PCH dosyası eklemek mümkün olsa da, CoreData kullanan @import CoreData;her dosyada * kullanarak CoreData bağımlılığını belirtmeyi düşünün. Bu, bağımlılıkları açık hale getirir ve daha da önemlisi, bu sorunun ilerideki sorunlarından kaçınacaktır.

* Bunun çalışması için modüllerin etkinleştirilmesi gerekir .


herhangi bir App_prefix.pch dosyası bulamadıysam ne yapmalı, xcode 6.4 ve ios 8.4'te çalışıyorum.
Anees

128

Daha önce içermeyen bir projeye Temel Verileri eklemek için gerçekten gerçekleştirmeniz gereken tüm adımları açıklamak için:

1. Adım: Çerçeveyi ekleyin

Uygulama hedefinizi tıklayın (sol bölmede, uygulamanızın adıyla birlikte en üstteki simgedir), ardından 'Aşamaları Oluştur' sekmesine gidin, ardından 'İkili Kitaplıklarıyla Bağla' seçeneğinde, alttaki küçük '+' işaretini tıklayın ve ardından 'CoreData.framework' ve projenize ekleyin

Ardından, ihtiyacınız olan tüm nesnelere (seksi olmayan yol) kullanarak çekirdek verileri içe aktarın:

hızlı

import CoreData

Hedef C

#import <CoreData/CoreData.h>

veya içe aktarmayı .pch dosyanızdaki (çok daha seksi) genel içe aktarma işlemlerinin altına ekleyin:

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import <CoreData/CoreData.h>
#endif

2. Adım: Veri Modelini ekleyin

.Xcdatamodel dosyasını eklemek için sağ bölmedeki dosyalarınızı sağ tıklayın / control tuşunu basılı tutarak tıklayın (güvenli tutmak için Kaynaklar klasöründe olduğu gibi) ve Yeni Dosya Ekle'yi seçin, dosya türünüzü seçerken Temel Veri sekmesini tıklayın ve ardından ' Veri Modeli 'olarak adlandırın, bir ad verin ve İleri ve Son'u tıkladığınızda projenize ekleyecektir. Bu Model nesnesine tıkladığınızda, varlıkları istediğiniz herhangi bir ilişkiyle projenize eklemek için arabirimi göreceksiniz.

3. Adım: Uygulama Temsilcisini güncelleyin

In Swift AppDelegate.swift üzerinde

//replace the previous version of applicationWillTerminate with this
func applicationWillTerminate(application: UIApplication) {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    // Saves changes in the application's managed object context before the application terminates.
    self.saveContext()
}

func saveContext () {
    var error: NSError? = nil
    let managedObjectContext = self.managedObjectContext
    if managedObjectContext != nil {
        if managedObjectContext.hasChanges && !managedObjectContext.save(&error) {
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            //println("Unresolved error \(error), \(error.userInfo)")
            abort()
        }
    }
}

// #pragma mark - Core Data stack

// Returns the managed object context for the application.
// If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
var managedObjectContext: NSManagedObjectContext {
    if !_managedObjectContext {
        let coordinator = self.persistentStoreCoordinator
        if coordinator != nil {
            _managedObjectContext = NSManagedObjectContext()
            _managedObjectContext!.persistentStoreCoordinator = coordinator
        }
    }
    return _managedObjectContext!
}
var _managedObjectContext: NSManagedObjectContext? = nil

// Returns the managed object model for the application.
// If the model doesn't already exist, it is created from the application's model.
var managedObjectModel: NSManagedObjectModel {
    if !_managedObjectModel {
        let modelURL = NSBundle.mainBundle().URLForResource("iOSSwiftOpenGLCamera", withExtension: "momd")
        _managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)
    }
    return _managedObjectModel!
}
var _managedObjectModel: NSManagedObjectModel? = nil

// Returns the persistent store coordinator for the application.
// If the coordinator doesn't already exist, it is created and the application's store added to it.
var persistentStoreCoordinator: NSPersistentStoreCoordinator {
    if !_persistentStoreCoordinator {
        let storeURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent("iOSSwiftOpenGLCamera.sqlite")
        var error: NSError? = nil
        _persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
        if _persistentStoreCoordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: &error) == nil {
            /*
            Replace this implementation with code to handle the error appropriately.
            abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            Typical reasons for an error here include:
            * The persistent store is not accessible;
            * The schema for the persistent store is incompatible with current managed object model.
            Check the error message to determine what the actual problem was.
            If the persistent store is not accessible, there is typically something wrong with the file path. Often, a file URL is pointing into the application's resources directory instead of a writeable directory.
            If you encounter schema incompatibility errors during development, you can reduce their frequency by:
            * Simply deleting the existing store:
            NSFileManager.defaultManager().removeItemAtURL(storeURL, error: nil)
            * Performing automatic lightweight migration by passing the following dictionary as the options parameter:
            [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true}
            Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details.
            */
            //println("Unresolved error \(error), \(error.userInfo)")
            abort()
        }
    }
    return _persistentStoreCoordinator!
}
var _persistentStoreCoordinator: NSPersistentStoreCoordinator? = nil

// #pragma mark - Application's Documents directory

// Returns the URL to the application's Documents directory.
var applicationDocumentsDirectory: NSURL {
    let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
    return urls[urls.endIndex-1] as NSURL
}

Gelen Objective C marka emin AppDelegate.h için bu nesneleri eklemek için

 @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
 @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
 @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

 - (NSURL *)applicationDocumentsDirectory; // nice to have to reference files for core data

AppDelegate.m dosyasındaki önceki nesneleri şu şekilde sentezleyin:

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

Ardından bu yöntemleri AppDelegate.m dosyasına ekleyin (eklediğiniz modelin adını gösterilen noktalara koyduğunuzdan emin olun):

- (void)saveContext{
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }
}

- (NSManagedObjectContext *)managedObjectContext{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel{
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAMEOFYOURMODELHERE" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"NAMEOFYOURMODELHERE.sqlite"];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _persistentStoreCoordinator;
}

 #pragma mark - Application's Documents directory

// Returns the URL to the application's Documents directory.
- (NSURL *)applicationDocumentsDirectory{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

Adım 4: Veri Nesnelerini Verilere İhtiyacınız Olan ViewControllers'a Alın

1. Seçenek. Uygulama Temsilcisinin VC'den ManagedObjectContext'ini (Tercih Edilen ve Daha Kolay) Kullanma

@ Brass-kazoo tarafından önerildiği gibi - AppDelegate ve yönetilenObjectContext ürününe bir referans alın:

hızlı

 let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
 appDelegate.managedObjectContext

Hedef C

 [[[UIApplication sharedApplication] delegate] managedObjectContext];

ViewController'ınızda

2. Seçenek. VC'nizde ManagedObjectContext oluşturun ve AppDelegate'ten AppDelegate'lerle eşleşmesini sağlayın (Orijinal)

Tercih edilen yöntemi kullanmak çok daha kolay olduğu için yalnızca Objective C için eski sürümü gösteriliyor

ViewController.h içinde

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

ViewController.m içinde

@synthesize managedObjectContext = _managedObjectContext;

AppDelegate veya ViewController'ın oluşturulduğu sınıfta, yönetilenObjectContext'i AppDelegate ile aynı olacak şekilde ayarlayın

ViewController.managedObjectContext = self.managedObjectContext;

Core Data kullanan viewcontroller öğesinin FetchedResultsController olmasını istiyorsanız, bu öğelerin ViewController.h dosyasında olduğundan emin olmanız gerekir.

@interface ViewController : UIViewController <NSFetchedResultsControllerDelegate> {
  NSFetchedResultsController *fetchedResultsController;
  NSManagedObjectContext *managedObjectContext;
}

 @property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;

Ve bu ViewController.m'de

@synthesize fetchedResultsController, managedObjectContext;

Tüm bunlardan sonra artık CoreData iyiliği için gereken tüm olağan fetchRequests çalıştırmak için bu manageObjectContext kullanabilirsiniz! Zevk almak


2
AppDelegate.h dosyasında applicationDoumentsDirectory yöntemi NSString yerine NSURL döndürmelidir.
NSRover

9
Bu en iyi cevap IMO! Adım 4 yerine AppDelegate'e bir başvuru aldım.[[UIApplication sharedApplication] delegate] ve daha sonra bağlam üzerinden[appDelegate managedObjectContext]
brasskazoo

AppDelegate.h dosyanıza Coredata aktarmayı unutmayın.
Frantzdy Romain

18

Swift 3 için: VERİ TASARRUFU VE GERİ ALMA DAHİL

1. Adım : Çerçeve Ekleme

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Adım 2: Veri modeli ekleyin

Dosya> Yeni> Dosya> Temel Veriler> Veri Modeli

  • Dosyayı SampleData, sonuçta ortaya çıkacak dosya olarak adlandırınSampleData.xcdatamocelId

Adım 3: Aşağıdaki işlevleri Uygulama Temsilcinize ekleyin ve en üste "CoreData'yı içe aktarın"

func applicationWillTerminate(_ application: UIApplication) {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    // Saves changes in the application's managed object context before the application terminates.
    self.saveContext()
}


// MARK: - Core Data stack

lazy var persistentContainer: NSPersistentContainer = {
    /*
     The persistent container for the application. This implementation
     creates and returns a container, having loaded the store for the
     application to it. This property is optional since there are legitimate
     error conditions that could cause the creation of the store to fail.
     */


    // SEE BELOW LINE OF CODE WHERE THE 'name' IS SET AS THE FILE NAME (SampleData) FOR THE CONTAINER

    let container = NSPersistentContainer(name: "SampleData")
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in
        if let error = error as NSError? {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.

            /*
             Typical reasons for an error here include:
             * The parent directory does not exist, cannot be created, or disallows writing.
             * The persistent store is not accessible, due to permissions or data protection when the device is locked.
             * The device is out of space.
             * The store could not be migrated to the current model version.
             Check the error message to determine what the actual problem was.
             */
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    })
    return container
}()

// MARK: - Core Data Saving support

func saveContext () {
    let context = persistentContainer.viewContext
    if context.hasChanges {
        do {
            try context.save()
        } catch {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            let nserror = error as NSError
            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
        }
    }
}

4.ADIM: Modele Varlık ve Özellik Ekleme

a) Varlık Ekle resim açıklamasını buraya girin

b) Özellik Ekle resim açıklamasını buraya girin

ADIM 5: Verileri Kaydetme

func saveItem(itemToSave: String){
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

//**Note:** Here we are providing the entityName **`Entity`** that we have added in the model
    let entity = NSEntityDescription.entity(forEntityName: "Entity", in: context)
    let myItem = NSManagedObject(entity: entity!, insertInto: context)

    myItem.setValue(itemToSave, forKey: "item")
    do {
        try context.save()
    }
    catch{
        print("There was an error in saving data")
    }
}

5.ADIM: Verileri Alma

override func viewWillAppear(_ animated: Bool) {
    // Obtaining data from model
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Entity")

    do {
        let results = try context.fetch(fetchRequest)
        let obtainedResults = results as! [NSManagedObject]
        let firstResult = obtainedResults[0]
        let myValue = firstResult.value(forKey: "item")

        print("myValue: \(myValue)")
    } catch {
        print("Error")
    }
}

11

Core Data destekli Kakao uygulaması oluşturmayı deneyin ve AppDelegate'e bakın. Orada temel veri yığını uygulama yöntemlerinin yanı sıra varlıklarınızı ve diğer temel veri ile ilgili öğeleri tanımlamak için yönetilen nesne modeli dosyasını göreceksiniz.

Çekirdek Veri yığınının yalnızca üstbilgisini (yani bildirimini) gösterdiniz, ancak uygulamasını (yani tanımını) göstermediniz.


Hızlı 3 için ColossalChris adımlarını kullandım, ancak AppDelegate'in bir kısmında hızlı 3 uyumlu kod almak için bu yanıtı (çekirdek veri desteği ile yeni projeden kopyalama) kullandım.
MrAn3

8

Aynı sorunu xcode 4'te çalıştırırsam, yaptığım gibi. Farklı: Projeyi seçmek zorunda kaldım, daha sonra hedeflerde mevcut kütüphaneleri gösteren "Kütüphanelerle İkili Bağla" yı genişletin . Oradan, ihtiyacınız olan ek kütüphaneleri seçmek için + (artı işaretini) tıklayın. Projenin en üstüne yerleştirdim ve bunu Frameworks Grubuna taşımak (sürükleyip bırakmak) zorunda kaldım , ama hepsi buydu.


5

Eimantas'ın Çekirdek Yığını'nın uygulanmasını kaçırdığını belirttiği gibi,

- (NSManagedObjectContext *) managedObjectContext;
- (NSManagedObjectModel *)managedObjectMode;
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator;

Çözümde yeni bir çekirdek veri sürücüsü projesi oluşturmak ve uygulamayı projenize kopyalamak / yapıştırmak olacaktır.


2
o zaman yönetilen bağlam modelden nasıl haberdar olur? otomatik olarak?
fengd

4

Swift 3 için:

Dosya-> yeni dosya-> CoreData-> Model model oluşturmak için.

Nasıl uygulanacağı hakkında daha fazla bilgi için bu bağlantıya bakın .


1

// Swift 2.2'de AppDelegate dosyasını değiştirmeden aşağıdakileri yapabilirsiniz.

  1. Proje-> hedefler -> bağlantılı çerçeveler ve kütüphaneler Şimdi yeni bir çerçeve ekleyin (+ üzerine tıklayın) 'CoreData'
  2. Dosya-> yeni dosya-> CoreData-> DataModel A.xcdatamodelid demek
  3. A.xcdatamodelid'de yeni bir enitity oluşturun (varlık + üzerine tıklayın) bunu Bc deyin olarak adlandırın ve sağındaki denetçi penceresinde sınıfını 'Bc' olarak ayarlayın.
  4. Şimdi objeye öznitelikler ekleyin (+ özniteliklerini tıklayın), örn: name ve type için String olarak bir öznitelik ekleyin.
  5. Şimdi editör-> NSManagedObject Alt Sınıfını oluştur -> açılır pencerede ileriye tıklayın -> tekrar ileriye -> oluştur'a tıklayın. İki yeni dosya oluşturulacaktır 1. Bc.swift adlı yeni bir sınıf ve Bc + coredataproperties.swift adlı bir uzantı.
  6. Dosya-> yeni dosya-> ios-> kakao Touch sınıfı -> alt sınıfını NSObject olarak ayarlayın-> DataController.swift olarak adlandırın.

    import UIKit import CoreData sınıfı DataController: NSObject {

    var managedObjectContext: NSManagedObjectContext
    
    override  init() {
        // This resource is the same name as your xcdatamodeld contained in your project.
        guard let modelURL = NSBundle.mainBundle().URLForResource("A", withExtension:"momd") else {
            fatalError("Error loading model from bundle")
        }
        // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
        guard let mom = NSManagedObjectModel(contentsOfURL: modelURL) else {
            fatalError("Error initializing mom from: \(modelURL)")
        }
        let psc = NSPersistentStoreCoordinator(managedObjectModel: mom)
        self.managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
        self.managedObjectContext.persistentStoreCoordinator = psc
    
        let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
        let docURL = urls[urls.endIndex-1]
        /* The directory the application uses to store the Core Data store file.
        This code uses a file named "A.sqlite" in the application's documents directory.
        */
        let storeURL = docURL.URLByAppendingPathComponent("A.sqlite")
        do {
            try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil)
        } catch {
            fatalError("Error migrating store: \(error)")
        }
    
    }

    }

//////

  1. Şimdi viewcontroller dosyasının içinde iki yöntem kullanarak db'nize erişebilirsiniz. Önemli: ifadeyi viewController "import CoreData" öğesine ekleyin a. db / objeye değer eklemek için seed () -> 'yı çağırın b. db / entity'den değer almak için fetch () -> çağrısı

/////// tohum () -> def

func seedPerson() {

        // create an instance of our managedObjectContext
        let moc = DataController().managedObjectContext

        // we set up our entity by selecting the entity and context that we're targeting
        let entity = NSEntityDescription.insertNewObjectForEntityForName("Bc", inManagedObjectContext: moc) as! Bc

        // add our data
        entity.setValue("Meera", forKey: "name")


        // we save our entity
        do {
            try moc.save()
        } catch {
            fatalError("Failure to save context: \(error)")
        }
    }

// fetch () def

func fetch() {
        let moc = DataController().managedObjectContext
        let personFetch = NSFetchRequest(entityName: "Bc")

        do {
            let fetchedPerson = try moc.executeFetchRequest(personFetch) as! [Bc]
            print(fetchedPerson.first!.name!)

        } catch {
            fatalError("Failed to fetch person: \(error)")
        }
    }

0

view.h

  #import <UIKit/UIKit.h>
  #import <CoreData/CoreData.h>

    @interface ViewController :  
    UIViewController<UITableViewDataSource,UITableViewDelegate>

   @property (weak, nonatomic) IBOutlet UITableView *coreDataList;
   - (IBAction)addBtnClick:(id)sender;
   @property (strong, nonatomic) NSMutableArray *dataList;
   @end

detail.h

  #import <UIKit/UIKit.h>
  #import <CoreData/CoreData.h>

 @interface DetailViewController : UIViewController<UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *nameTxt;
@property (weak, nonatomic) IBOutlet UITextField *mobileTxt;
@property (weak, nonatomic) IBOutlet UITextField *emailIdTxt;
 - (IBAction)saveBtnClick:(id)sender;
@property (strong,nonatomic) NSManagedObject *userData;

@end

0
  - (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view.
   if (self.userData) {
    [self.nameTxt setText:[self.userData valueForKey:@"name"]];
    [self.mobileTxt setText:[self.userData 
     valueForKey:@"mobileNumber"]];
    [self.emailIdTxt setText:[self.userData valueForKey:@"email"]];
    [self.imgView setImage:[UIImage imageWithData:[self.userData 
     valueForKey:@"imageView"]]];    }
        }

  - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
  }


  - (BOOL)textFieldShouldReturn:(UITextField *)textField
  {
   [textField resignFirstResponder];
return YES;
 }
  /*
  #pragma mark - Navigation



 - (IBAction)browseBtn:(id)sender
   {

  UIImagePickerController *imgpic =[[UIImagePickerController      
     alloc]init];     
  imgpic .delegate =self;
 imgpic .sourceType =UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:imgpic animated:YES completion:nil];

 }
 -(void)imagePickerController:(UIImagePickerController *)picker 
 didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
 {
  UIImage *choose = info[UIImagePickerControllerOriginalImage];
self.imgView.image=choose;
[picker dismissViewControllerAnimated:YES completion:nil];
}


  - (IBAction)saveBtnClick:(id)sender {

 NSManagedObjectContext *context = [self managedObjectContext];

 if (self.userData) {
    // Update existing data
    [self.userData setValue:self.nameTxt.text forKey:@"name"];
    [self.userData setValue:self.mobileTxt.text 
     forKey:@"mobileNumber"];        
   [self.userData setValue:self.emailIdTxt.text forKey:@"email"];

    UIImage *sampleimage = _imgView.image;
    NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 1.0);
            [self.userData setValue:dataImage forKey:@"imageView"];

    } else {
    // Create a new data
    NSManagedObject *newDevice = [NSEntityDescription 
     insertNewObjectForEntityForName:@"Details" 
     inManagedObjectContext:context];
    [newDevice setValue:self.nameTxt.text forKey:@"name"];
    [newDevice setValue:self.mobileTxt.text forKey:@"mobileNumber"];
    [newDevice setValue:self.emailIdTxt.text forKey:@"email"];
    UIImage *sampleimage = _imgView.image;
    NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 1.0);

    [newDevice setValue:dataImage forKey:@"imageView"];

  }

  NSError *error = nil;
 // Save the object to persistent store
 if (![context save:&error]) {
    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
 }

 [self dismissViewControllerAnimated:YES completion:nil];
 }
   @end

.h

 #import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>

 @interface DetailViewController :
 UIViewController<UITextFieldDelegate,UINavigationControllerDelegate,            
     UIIma
    gePickerControllerDelegate>
         @property (weak, nonatomic) IBOutlet UITextField *nameTxt;
  @property (weak, nonatomic) IBOutlet UITextField *mobileTxt;
 @property (weak, nonatomic) IBOutlet UITextField *emailIdTxt;
  @property (weak, nonatomic) IBOutlet UIImageView *imgView;
 - (IBAction)browseBtn:(id)sender;
 - (IBAction)saveBtnClick:(id)sender;
@property (strong,nonatomic) NSManagedObject *userData;

@end

Çözümünüz için bir açıklama takdir edilecektir ... Ayrıca, alakasız yorumlanmış kodu olmadan minimal kod ...
yakobom

0
 let alert  = UIAlertController(title:"Error", message: "No Internet Connection", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in}))
            alert.addAction(UIAlertAction(title: "Try Again", style: .default, handler: { (action) in
                self.networkCall(text: self.daySelected)
            }))
            self.present(alert, animated: false, completion: nil)

0
+(void) insetPlusUpdate:(NSDictionary *)dataa {

    NSManagedObjectContext * context;

    if (![[NSThread currentThread] isMainThread]) {

        context = [[NSManagedObjectContext alloc] init];

        [context setPersistentStoreCoordinator:[APP_DELEGATE persistentStoreCoordinator]];
    } else {

        context = [APP_DELEGATE managedObjectContext];
    }

    NSFetchRequest * request = [[NSFetchRequest alloc] init];

    NSEntityDescription * entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:context];

    [request setEntity:entity];

    NSPredicate * check = [NSPredicate predicateWithFormat:@"attribute == %@", Dict[@"key"]];

    [request setPredicate:check];

    NSError * error = nil;

    if ([context countForFetchRequest:request error:&error] == 0) {

Entity.attribute = @"";

    } else {


        NSArray * array = [context executeFetchRequest:request error:&error];

        EntityName * entity = [array firstObject];

  Entity.attribute = @"";

    }

}

+(NSString *)fetch:(NSString *)feed_id{

    NSManagedObjectContext * context;

    if(![[NSThread currentThread] isMainThread]){

        context = [[NSManagedObjectContext alloc] init];

        [context setPersistentStoreCoordinator:[APP_DELEGATE persistentStoreCoordinator]];

    } else {

        context = [APP_DELEGATE managedObjectContext];

    }

    NSFetchRequest * request = [[NSFetchRequest alloc] init];

    NSEntityDescription * entity = [NSEntityDescription entityForName:@"ENTITYNAME" inManagedObjectContext:context];

    [request setEntity:entity];

   NSPredicate * check = [NSPredicate predicateWithFormat:@"attribute == %@", Dict[@"key"]];

    [request setPredicate:check];

    NSError * error = nil;

    if ([context countForFetchRequest:request error:&error] > 0) {

        NSArray * array = [context executeFetchRequest:request error:&error];

        ENTITYNAME * fetchData = [array firstObject];

        NSString * string = fetchData.attribte[@"key"];

        return string;
    }

    return nil;
}


+(BOOL)delete{

    NSManagedObjectContext * context;

    if (![[NSThread currentThread] isMainThread]) {

        context = [[NSManagedObjectContext alloc] init];

        [context setPersistentStoreCoordinator:[APP_DELEGATE persistentStoreCoordinator]];

    } else {

        context = [APP_DELEGATE managedObjectContext];

    }

    NSFetchRequest * request = [[NSFetchRequest alloc] init];

    NSEntityDescription * entity = [NSEntityDescription entityForName:@"ENTITYNAME" inManagedObjectContext:context];

    [request setEntity:entity];

    NSError *error = nil;

    NSBatchDeleteRequest *deleteRequest = [[NSBatchDeleteRequest alloc] initWithFetchRequest: request];

    @try{

        [context executeRequest:deleteRequest error:&error];
        if([context save:&error]){

            NSLog(@"Deleted");

            return [context save:&error];

        }
        else{

            return [context save:&error];
        }

    }
    @catch(NSException *exception){

        NSLog(@"failed %@",exception);
        return [context save:&error];
    }    


}

0

örnek kodlama görünümü1

#import "ViewController.h"
#import "DetailViewController.h"

 @interface ViewController ()
 {
  NSInteger indexPathvalue;
 }
 @end

  @implementation ViewController

 - (NSManagedObjectContext *)managedObjectContext {
     NSManagedObjectContext *context = nil;
     id delegate = [[UIApplication sharedApplication] delegate];
     if ([delegate performSelector:@selector(managedObjectContext)]) {
       context = [delegate managedObjectContext];
     }
   return context;
  }

  - (void)viewDidLoad {
      [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"call this one2");
 }

 - (void)viewDidAppear:(BOOL)animated
 {
   [super viewDidAppear:animated];
   NSManagedObjectContext *managedObjectContext = [self 
   managedObjectContext];
   NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] 
   initWithEntityName:@"Details"];
   self.dataList = [[managedObjectContext executeFetchRequest:fetchRequest   
   error:nil] mutableCopy];
   [_coreDataList reloadData];

    NSLog(@"call this one");
 }
    #pragma mark - Table view data source

   - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
   {
     return 1;
   }

     - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:
   (NSInteger)section
    {
    return self.dataList.count;
    }

   - (UITableViewCell *)tableView:(UITableView *)tableView 
   cellForRowAtIndexPath:(NSIndexPath *)indexPath
   {
   static NSString *CellIdentifier = @"Cell";
   UITableViewCell *cell = [tableView     
   dequeueReusableCellWithIdentifier:CellIdentifier];

     if (cell == nil)
    {
    cell = [[UITableViewCell   
    alloc]initWithStyle:UITableViewCellStyleSubtitle 
    reuseIdentifier:CellIdentifier];
    }

   NSManagedObject *user = [self.dataList objectAtIndex:indexPath.row];
   cell.textLabel.text = [user valueForKey:@"name"];
      cell.detailTextLabel.text = [user valueForKey:@"mobileNumber"];
    cell.imageView.image = [UIImage imageWithData:[user
    valueForKey:@"imageView"]]; 
    return cell;
    }


    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
    (NSIndexPath *)indexPath
    {
    indexPathvalue = indexPath.row;
    [self performSegueWithIdentifier:@"detailView" sender:self];
    }

     - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:
    (NSIndexPath *)indexPath
    {
     return YES;
     }
     - (void)tableView:(UITableView *)tableView commitEditingStyle:
      (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:
     (NSIndexPath *)indexPath
    {
    NSManagedObjectContext *context = [self managedObjectContext];
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
    [context deleteObject:[self.dataList objectAtIndex:indexPath.row]];
    NSError *error = nil;
    if (![context save:&error]) {
        NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]);
        return;
    }
    [self.dataList removeObjectAtIndex:indexPath.row];
    [_coreDataList reloadData];

     }

    }
   - (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    }

   - (IBAction)addBtnClick:(id)sender {
    }


    #pragma mark - Navigation

    // In a storyboard-based application, you will often want to do a little      
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
     {
   // Get the new view controller using [segue destinationViewController].
   // Pass the selected object to the new view controller.
    if ([segue.identifier isEqualToString:@"detailView"])
   {
    NSManagedObject *obj = [self.dataList objectAtIndex:indexPathvalue];
    DetailViewController *detail = segue.destinationViewController;
    detail.userData = obj;
    }

    }
   @end

örnek detay görünümü

       #import "DetailViewController.h"

       @interface DetailViewController ()

       @end

       @implementation DetailViewController

      - (NSManagedObjectContext *)managedObjectContext {
     NSManagedObjectContext *context = nil;
     id delegate = [[UIApplication sharedApplication] delegate];
     if ([delegate performSelector:@selector(managedObjectContext)]) {
    context = [delegate managedObjectContext];
     }
     return context;
    }

    - (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
     if (self.userData) {
    [self.nameTxt setText:[self.userData valueForKey:@"name"]];
    [self.mobileTxt setText:[self.userData valueForKey:@"mobileNumber"]];
    [self.emailIdTxt setText:[self.userData valueForKey:@"email"]];
    }
    }

     - (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    }


   - (BOOL)textFieldShouldReturn:(UITextField *)textField
   {
    [textField resignFirstResponder];
    return YES;




}
     /*

savebutton

    - (IBAction)saveBtnClick:(id)sender {

     NSManagedObjectContext *context = [self managedObjectContext];

     if (self.userData) {
    // Update existing data
    [self.userData setValue:self.nameTxt.text forKey:@"name"];
    [self.userData setValue:self.mobileTxt.text forKey:@"mobileNumber"];
    [self.userData setValue:self.emailIdTxt.text forKey:@"email"];
    UIImage *sampleimage = [UIImage imageNamed:@"icon.png"];
    NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 1.0);
    [self.userData setValue:dataImage forKey:@"imageView"];

     } else {
    // Create a new data
    NSManagedObject *newDevice = [NSEntityDescription   
    insertNewObjectForEntityForName:@"Details" 
    inManagedObjectContext:context];
    [newDevice setValue:self.nameTxt.text forKey:@"name"];
    [newDevice setValue:self.mobileTxt.text forKey:@"mobileNumber"];
    [newDevice setValue:self.emailIdTxt.text forKey:@"email"];
    UIImage *sampleimage = [UIImage imageNamed:@"icon.png"];
    NSData *dataImage = UIImageJPEGRepresentation(sampleimage, 1.0);
    [newDevice setValue:dataImage forKey:@"imageView"];

     }

     NSError *error = nil;
    // Save the object to persistent store
     if (![context save:&error]) {
    NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
    }

    [self dismissViewControllerAnimated:YES completion:nil];
    }
   @end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.