一.基础知识:

CoreData是对SQLite的封装,使用的时候比较方便,减少对SQL语句的使用。

CoreData中的核心对象

NSManagedObjectModel:代表Core Data 的模型文件,包含模型的数据结构;

NSManagedObjectContext:负责应用和数据库之间的交互(CRUD);

NSPersistentStoreCoordinator:添加持久的数据存储仓库,通常采用NSManagedObjectModel的对象来初始化,最经常用的是NSSQLiteStoreType;

NSEntityDescription:用来描述实体对象的;

Entity:定义一个实体;

Attribute:实体的一个属性;

Relationship:关联实体;

NSFetchRequest:用来设置一个查询的请求,可以指定查询顺序;

Predicate:设置查询的条件;

Sort Descriptor:设置排序。

二.具体步骤:

1.打开Xcode,按住shift+command+N新建一个工程,勾选 Use Core Data:

2.在Appdelegate.h和.m文件中  会自动生成以下文件:

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; - (void)saveContext;
- (NSURL *)applicationDocumentsDirectory; @end

Appdelegate.m文件

#pragma mark - Core Data stack

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator; - (NSURL *)applicationDocumentsDirectory {
// The directory the application uses to store the Core Data store file. This code uses a directory named "com.zhangyu.CoreDataTwo" in the application's documents directory.
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
} - (NSManagedObjectModel *)managedObjectModel {
// 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.
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataTwo" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
} - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
// The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it.
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
} // Create the coordinator and store _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataTwo.sqlite"];
NSLog(@"---url:%@",storeURL);
NSError *error = nil;
NSString *failureReason = @"There was an error creating or loading the application's saved data.";
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
// Report any error we got.
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
dict[NSLocalizedFailureReasonErrorKey] = failureReason;
dict[NSUnderlyingErrorKey] = error;
error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
// Replace this 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.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
} return _persistentStoreCoordinator;
} - (NSManagedObjectContext *)managedObjectContext {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
if (_managedObjectContext != nil) {
return _managedObjectContext;
} NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
return nil;
}
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
return _managedObjectContext;
} #pragma mark - Core Data Saving support - (void)saveContext {
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
NSError *error = 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.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}

在工程文件中还会看到红色选框中的文件:然后单击打开创建一个model,我在这里创建一个Users,并添加相应的属性user_name,user_password两个属性,声明为字符串类型。

之后选择Editor-》Create NSManagedObject SubClass创建 会在工程里直接生成Users.h和Users.m文件。

4.准备条件完成后在Storyboard中设置两个Label和两个TextField、一个segmentControl控件,并拖拉控件在ViewControloler.h中:

@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *username;
@property (weak, nonatomic) IBOutlet UITextField *password; - (IBAction)segmentControl:(UISegmentedControl *)sender;

之后在ViewController中编写相应的代码:

#import "ViewController.h"
#import "AppDelegate.h"
#import "Users.h"
@interface ViewController ()
@property (nonatomic,strong)AppDelegate *myDelegate;
@property(nonatomic,strong) NSMutableArray *users;
@property(nonatomic,assign)BOOL query;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; self.myDelegate = [UIApplication sharedApplication].delegate;
self.query = NO;
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} - (IBAction)segmentControl:(UISegmentedControl *)sender { switch (sender.selectedSegmentIndex) {
case 0:
[self queryFromDB];
break;
case 1:[self addToDB];
break;
default:
break;
}
} -(void)addToDB{
//@prames entityForName参数要与所建的Entity保持一致,如建的实体是Users
Users *us = [NSEntityDescription insertNewObjectForEntityForName:@"Users" inManagedObjectContext:self.myDelegate.managedObjectContext];
us.user_name = self.username.text;//或者这种写法[us setValue:@"user_name" forKey:self.username.text]; us.user_password = self.password.text; NSError *error;
//托管对象准备好后,调用托管对象上下文的save方法将数据写入数据库
BOOL isSaveSuccess = [self.myDelegate.managedObjectContext save:&error];
if (!isSaveSuccess) { [NSException raise:@"访问数据库错误" format:@"%@",[error localizedDescription]];
NSLog(@"Error: %@,%@",error,[error userInfo]);
}else{
NSLog(@"Save successful!");
}
}
#pragma mark - 从数据库中查询数据
-(void)queryFromDB{ //创建取回数据请求
NSFetchRequest *request = [[NSFetchRequest alloc]init];
//设置要查询哪种实体的实体对象
//@prames entityForName参数要与所建的Entity保持一致
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Users" inManagedObjectContext:self.myDelegate.managedObjectContext];
//设置请求实体
[request setEntity:entity]; //指定按照什么的排序方式,无排序
NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"user_name" ascending:NO];
NSArray *sortDescriptions = [[NSArray alloc]initWithObjects:sort, nil];
[request setSortDescriptors:sortDescriptions]; NSError *error;
//执行获取数据请求,返回数组
NSMutableArray *mutableFetch = [[self.myDelegate.managedObjectContext executeFetchRequest:request error:&error]mutableCopy];
if (mutableFetch == nil) {
NSLog(@"Error: %@,%@",error,[error userInfo]);
}
self.users = mutableFetch;
NSLog(@"the count of users:%lu",(unsigned long)self.users.count);
for (Users *user in self.users) {
if ([self.username.text isEqualToString:user.user_name]) {
if ([self.password.text isEqualToString:user.user_password]) {
self.query = YES;
break;
}
} NSLog(@"--name:%@---password:%@--",user.user_name,user.user_password);
}
if (!self.query) {
[self showAlert:@"用户名或密码错误,请重新输入"];
} }
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self.username resignFirstResponder];
[self.password resignFirstResponder];
}
-(void)showAlert:(NSString*)infomation{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示:" message:infomation delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}
@end

  

效果如图所示:

点击Add按钮会输出:Save successful     点击query会输出如下图所示:

之所以有五条数据是因为之前添加了四条数据,已经保存在CoreDataTwo.sqlite数据库中

附上源码

CoreData的简单使用的更多相关文章

  1. 【CoreData】 简单地使用

    先介绍一下什么是CoreData —— 它是在iOS5之后出现的一个框架,提供了对象-关系映射(ORM)的功能,既能够将OC对象转化成数据,保存在SQLite数据库文件中,也能将保存在数据库中的数据还 ...

  2. CoreData的简单使用(二)数据的增删改查,轻量级的版本迁移

    上一篇中我们已经使用CoreData创建了一个SQLite数据库 CoreData的简单使用(一)数据库的创建 现在对数据库进行数据的CRUD(增删改查) 1.Data Model 的设置 创建一个D ...

  3. iOS 中CoreData的简单使用

    原文链接:http://www.jianshu.com/p/4411f507dd9f 介绍:本文介绍的CoreData不在AppDelegate中创建,在程序中新建工程使用,即创建本地数据库,缓存数据 ...

  4. CoreData的简单使用(一)数据库的创建

    iOS有多种数据持久化得方式 plist文件(属性列表) preference(偏好设置,NSUserDefaults) NSKeyedArchiver(归档,用的不多) SQLite 3 (需要导入 ...

  5. iOS 让CoreData更简单些

    原文:http://www.cocoachina.com/ios/20170421/19096.html 前言 本文并不是CoreData从入门到精通之类的教程, 并不会涉及到过多的原理概念描述, 而 ...

  6. iOS开发CoreData的简单使用

    1.简介 CoreData是iOS5后,苹果提供的原生的用于对象化管理数据并且持久化的框架.iOS10苹果对CoreData进一步进行了封装,而且效率更高!相关类的简单介绍: NSManagedObj ...

  7. 关于CoreData的用法

    有些同事觉得CoreData是一个看不懂,理解不清的神秘东东,其实ios的本地数据储存是一个sqlite数据库,一个简易的数据库,而这个CoreData是否支持所有储存的数据呢,显然不是的,站在我的角 ...

  8. IOS CoreData的(增删查改)

    (1).CoreDataa>什么是CoreDatab>CoreData增删改查 "什么时候使用COredata 什么时候使用FMDatabases"CoreData 在 ...

  9. CoreData的使用(IOS学习)

    ——杂言:最近开始学习IOS7的开发,下文是在已经建好的项目里加入CoreData的结构,并实现一个基于coredata的简单save,query. 1. 引入Core Data Framework. ...

随机推荐

  1. Cocos2D的随机数生成函数

    有很多种方法生成随机数.但是只有arc4random函数生成的最接近于"真随机(truly random)"数.(而且不需要种子) 其变体函数arc4random_uniform生 ...

  2. SpriteBuilder中时间线播放音效的弊端

    当你美滋滋的在时间线中播放音效的时候,你要想到音效时间线并不适于播放同步于游戏事件的声音,比如碰撞和加速时. 它同样不能被用来播放背景循环的声音,这就本质上拒绝了通过timeline播放背景音乐.甚至 ...

  3. linux进程的介绍和管理

    概述 -   在linux 中,每个执行的程序都称为一个进程,每一个进程都分配一个ID号 -   每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程,例如www服务器 -   每个进程都可 ...

  4. OpenGL Shader Key Points (1)

    1.  Shader起步 1.1.  可编程管线 仅考虑Vertex shader和fragment shader: 1.2.  Shader Object 在编译阶段生成,把shader源代码编译成 ...

  5. Unity Editor 编写unity插件类

    在unity写了一个编辑类,基于iTweenpath插件,为了更方便的操作iTweenpath,顺便练习UnityEditor的操作,写了一个CreateiTweenPath,放在Editor文件夹中 ...

  6. myBatis源码学习之SqlSessionFactoryBuilder

    SqlSessionFactoryBuilder通过类名就可以看出这个类的主要作用就是创建一个SqlSessionFactory,通过输入mybatis配置文件的字节流或者字符流,生成XMLConfi ...

  7. 【Qt编程】3D迷宫游戏

    说起迷宫想必大家都很熟悉,个人感觉迷宫对人的方向感是很大的考验,至少我的方向感是不好的,尤其是在三维空间中.由于这段时间帮导师做项目用到了三维作图,便心血来潮想做个三维迷宫玩玩.要想画出三维的迷宫游戏 ...

  8. zookeeper 应用开发

    由于zookeeper的client只有zookeeper一个对象,使用也比较简单,所以就不许要文字说明了,在代码中注释下就ok 了. 1.测试用的main方法 package ClientExamp ...

  9. Mina源码阅读笔记(四)—Mina的连接IoConnector1

    上一篇写的是IoAcceptor是服务器端的接收代码,今天要写的是IoConnector,是客户端的连接器.在昨天,我们还留下一些问题没有解决,这些问题今天同样会产生,但是都要等到讲到session的 ...

  10. css左侧固定宽度右侧自适应

    左侧固定宽,右侧自适应屏幕宽: 左右两列,等高布局: 左右两列要求有最小高度,例如:200px;(当内容超出200时,会自动以等高的方式增高) 要求不用JS或CSS行为实现: 仔细分析试题要求,要达到 ...