既存のiPhoneプロジェクトにコアデータを追加したいのですが、それでも多くのコンパイルエラーが発生します。
- NSManagedObjectContext undeclared
- Expected specifier-qualifier-list before 'NSManagedObjectModel'
- ...
Core Data Frameworkをターゲットに既に追加しました([Targets]、[Add]-[Existing Frameworks]、[CoreData.framework]の下でプロジェクトを右クリックします)。
私のヘッダーファイル:
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
NSPersistentStoreCoordinator *persistentStoreCoordinator;
[...]
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
私は何が欠けていますか?新しいプロジェクトを開始することはオプションではありません...
どうもありがとう!
編集申し訳ありませんが、これらの実装はあります...しかし、ライブラリが見つからないようです...実装メソッドは、「managedObjectContext undeclared
」、「NSPersistentStoreCoordinator undeclared
"だけでなく、NSManagedObjectContext
"の前に "Expected ')'もあります(ただし、括弧は正しいようです)...
#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;
}
すべてのCoreDataヘッダーファイルはApp_Prefix.pch
にインポートされるため、CoreDataクラスはプロジェクト全体で使用できるため、必要なファイルにヘッダーを手動でインポートする必要はありません。
Xcodeを開き、App_Prefix.pch
などのファイルを探します。デフォルトでは、Other Sources
グループにあります。 UIKit
importステートメントの後に、次の行を追加します。
#import <CoreData/CoreData.h>
そしてあなたは行く準備ができているはずです。
Xcode 4で作成されたプロジェクトの場合、接頭辞ファイルはProjectナビゲータのSupporting Files
グループにあります。デフォルトでは、「projectname-Prefix.pch」と呼ばれます。
Xcode 6以降、プリコンパイル済みヘッダーファイルはデフォルトで含まれなくなりました。これは、モジュールが導入されているためです プリコンパイル済みヘッダーを使用する必要はありません PCHファイルを手動で追加してCoreDataヘッダーをグローバルに含めることは引き続き可能ですが、 CoreDataを使用するすべてのファイルの@import CoreData;
*。これにより、依存関係が明示的になり、さらに重要なことに、将来この問題の問題を回避できます。
*モジュール 有効にする必要があります これが機能するため。
コアデータを以前は持っていなかったプロジェクトに追加するために実際に実行する必要があるすべての手順を説明するだけです。
アプリのターゲット(左側のペインで、アプリの名前が付いた上部のアイコン)をクリックしてから、「ビルドフェーズ」タブに移動し、「ライブラリとバイナリをリンク」で、下部の小さな「+」をクリックして、 'CoreData.framework'をプロジェクトに追加します
次に、以下を使用して、必要なすべてのオブジェクトにcoredataをインポートします(非セクシーな方法)。
スイフト
import CoreData
目的C
#import <CoreData/CoreData.h>
または、次のように、.pchファイルの一般的なインポートの下にインポート(はるかにセクシー)を追加します。
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#endif
.xcdatamodelファイルを追加するには、右ペインでファイルを右クリック/コントロールクリックし(安全に保管するためのリソースフォルダーなど)、新しいファイルを追加するを選択し、ファイルタイプを選択するときに[コアデータ]タブをクリックしてから[データモデル」に名前を付け、[次へ]をクリックして[完了]をクリックすると、プロジェクトに追加されます。このModelオブジェクトをクリックすると、必要な関係を持つエンティティをプロジェクトに追加するためのインターフェイスが表示されます。
Swift AppDelegate.Swiftで
//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
}
Objective Cで、これらのオブジェクトをAppDelegate.hに追加してください
@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の以前のオブジェクトを次のように合成します。
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
次に、これらのメソッドをAppDelegate.mに追加します(表示したスポットに追加したモデルの名前を必ず入力してください)。
- (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];
}
オプション1. VC(Preferred and Easier)からApp DelegateのManagedObjectContextを使用します
@ brass-kazooが提案するとおり-AppDelegateとそのmanagedObjectContextへの参照を次の方法で取得します。
スイフト
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.managedObjectContext
目的C
[[[UIApplication sharedApplication] delegate] managedObjectContext];
あなたのViewControllerで
オプション2. VCにManagedObjectContextを作成し、AppDelegate(Original)のAppDelegateに一致させる
Objective Cの古いバージョンのみを表示するのは、推奨される方法を使用する方がはるかに簡単だからです
viewController.hで
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
ViewController.mで
@synthesize managedObjectContext = _managedObjectContext;
AppDelegate、またはViewControllerが作成されるクラスで、managedObjectContextをAppDelegateのものと同じに設定します
ViewController.managedObjectContext = self.managedObjectContext;
Core Dataを使用するViewControllerをFetchedResultsControllerにするには、この要素がViewController.hにあることを確認する必要があります。
@interface ViewController : UIViewController <NSFetchedResultsControllerDelegate> {
NSFetchedResultsController *fetchedResultsController;
NSManagedObjectContext *managedObjectContext;
}
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
そして、これはViewController.mにあります
@synthesize fetchedResultsController, managedObjectContext;
その後、このmanagedObjectContextを使用して、CoreDataの正常性に必要な通常のfetchRequestをすべて実行できるようになりました。楽しい
Swiftの場合3:データの保存と取得を含む
ステップ1:フレームワークの追加
ステップ2:データモデルの追加
ファイル>新規>ファイル>コアデータ>データモデル
SampleData
という名前を付けます。結果のファイルはSampleData.xcdatamocelId
になりますステップ3:以下の関数をアプリのデリゲートに追加し、「import CoreData」を上部に追加します
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:モデルへのエンティティと属性の追加
ステップ5:データの保存
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:データの取得
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")
}
}
Core DataでバックアップされたCocoaアプリケーションを作成して、AppDelegateを見てください。そこには、コアデータスタックの実装方法と、エンティティやその他のコアデータ関連のものを定義するための管理オブジェクトモデルファイルがあります。
Core Dataスタックのヘッダー(宣言)のみを表示し、実装(定義)は表示していません。
私と同じように、Xcode 4で同じ問題に遭遇した場合。違います。プロジェクトを選択し、ターゲットで展開する必要がありました"Link Binary With Libraries"これは現在のライブラリを表示します。そこから+(プラス記号)をクリックして、必要な追加ライブラリを選択します。私はそれをプロジェクトの一番上に置き、それをFrameworks Groupに移動(ドラッグアンドドロップ)しなければなりませんでしたが、それはそうでした。
Eimantasが述べたように、コアスタックの実装が欠落している、例えば
- (NSManagedObjectContext *) managedObjectContext;
- (NSManagedObjectModel *)managedObjectMode;
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator;
ソリューションでは、新しいコアデータドライバープロジェクトを作成し、実装をプロジェクトにコピー/貼り付けます。
// Swift 2.2では、AppDelegateファイルを変更せずに以下を実行できます。
ファイル->新しいファイル-> ios-> cocoa Touchクラス->そのサブクラスをNSObjectとして設定-> DataController.Swiftという名前を付けます
import UIKit import CoreDataクラス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)")
}
}
}
//////
/////// seed()-> 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)")
}
}
+(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];
}
}
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
- (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
#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
#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;
}
/*
- (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
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)