一、Core Data
解析:Core Data的作用就是相当于java中的Hibernate,也就是对象持久化技术到数据库中。
注: 一:在项目创建时,需要点击 Use Core Data这样就会生成一个__.xcdatamodeld的持久化模型文件,相等于数据库中的表。二:在__.xcdatamodeld中添加了字段后,需要点击该字段,把系统默认勾上的Optional去掉。三:在对表数据赋值的时候其实使用的是KVC赋值模式[mosetValue:nameforKey:@"name"];
四:持久化数据库步骤基本如下:
增的语句:
1:获得应用程序代理对象(注:因为系统自动生成的内容在AppDelegate中所存在。而本项目只有这么一个文件,所以直接使用代理模式。)
AppDelegate * app = [UIApplicationsharedApplication].delegate;
2:获得托管上下文对象,代表着数据库,只要我们在xcdatamodeld文件中插入字段,那么这里将会自动创建数据库文件。
NSManagedObjectContext * context = app.managedObjectContext;
3: 定义一个托管的对象 . 代表着数据库表中的数据NSManagedObject * mo = [NSEntityDescriptioninsertNewObjectForEntityForName:@"Student"inManagedObjectContext:context];
4:指定实体中的值(注:使用键值对的KVC模式)
[mo setValue:nameforKey:@"name"];
5:把托管对象放到上下文中[context insertObject:mo];
6:保存上下文,如果没有该步骤,那么就只是在内存中给修改而已,数据库是没有变化的。
if ([contextsave:&err]) {
NSLog(@"%@", [errdescription]);
}
查的语句:
/*指定条件的查询,其实只是加多了一个谓词(谓词就是定制一个条件) */
//一:获得应用程序代理对象
AppDelegate * app = [UIApplicationsharedApplication].delegate;
//二:获得托管上下文对象,代表着数据库,只要我们在xcdatamodeld文件中插入字段,那么这里将会自动创建数据库文件。
NSManagedObjectContext * context = app.managedObjectContext;
//三:指定一个实体,实体指的是表
NSEntityDescription * entity = [NSEntityDescriptionentityForName:@"Student"inManagedObjectContext:context];
//四:创建一个查询
NSFetchRequest * request = [[NSFetchRequestalloc ]init];
[request setEntity:entity];
//五:创建一个查询的谓词
NSPredicate * predicate = [NSPredicatepredicateWithFormat:@"(age = %d)",22];
//六:把谓词添加到查询中
[request setPredicate:predicate];
//七:运行一个查询,返回的是托管对象
NSError * err =nil;
NSArray * resultobjects = [contextexecuteFetchRequest:request error:&err];
//八:遍历结果数组。
if (resultobjects) {
for (NSManagedObject * moin resultobjects) {
NSLog(@"name = %@, age = %@", [movalueForKey:@"name"],[movalueForKey:@"age"] );
}
//九:保存上下文到数据库
if ([context save:&err]) {
NSLog(@"%@", [err description]);
}
}
改的语句 :其他基本语句和增的一样,逻辑是先查询出来后,在得到结果后的操作有所不同。
if (resultobjects) {
for (NSManagedObject * moin resultobjects) {
//mo就是一个托管的对象
[mo setValue:[NSNumbernumberWithInt:88]forKey:@"age"];//修改年龄
}
}
删的语句:其他基本语句和增的一样,逻辑是先查询出来后,在得到结果后的操作有所不同。
if (resultobjects) {
for (NSManagedObject * moin resultobjects) {
//mo就是一个托管的对象
[context deleteObject:mo];
}
代码解析:
在AppDelegate.h中有如下代码:
#import<UIKit/UIKit.h>
#import<CoreData/CoreData.h>
@interface AppDelegate :UIResponder <UIApplicationDelegate>
@property (strong,nonatomic) UIWindow *window;
//托管的对象上下文,用来管理对象转化到当前关系数据库的整个过程。类似sqlite3数据库操作的 db。
@property (readonly,strong, nonatomic)NSManagedObjectContext *managedObjectContext;
//托管的模型,指的是数据库中的表
@property (readonly,strong, nonatomic)NSManagedObjectModel *managedObjectModel;
//持久化存储的协调者,指的是数据库的链接
@property (readonly,strong, nonatomic)NSPersistentStoreCoordinator *persistentStoreCoordinator;
//指的是把上下文保存到数据库
- (void)saveContext;
//获得当前沙盒文档的路径
- (NSURL *)applicationDocumentsDirectory;
@end
在ViewController.m中有如下代码:
#import "ViewController.h"
#import "AppDelegate.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*添加数据库*/
- (IBAction)adddb:(id)sender {
NSString * name =self.name.text;
NSString * age =self.age.text;
//剔除空格
name = [name stringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceCharacterSet]];
age = [age stringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceCharacterSet]];
//格式判断
if ([nameisEqualToString:@""]) {
UIAlertController * uia = [UIAlertControlleralertControllerWithTitle:@"友情提示"message:@"姓名不能为空"preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction * okaction = [UIAlertActionactionWithTitle:@"确定按钮"style:UIAlertActionStyleDefaulthandler:^(UIAlertAction * action){
NSLog(@"你已经确认");
}];
UIAlertAction * uiaction = [UIAlertActionactionWithTitle:@"取消按钮"style:UIAlertActionStyleCancelhandler:^(UIAlertAction * action){
NSLog(@"你已经取消");
}];
[uia addAction:okaction];
[uia addAction:uiaction];
[selfpresentViewController:uia animated:YEScompletion:nil];
return;
}
if ([ageisEqualToString:@""]) {
UIAlertController * uia = [UIAlertControlleralertControllerWithTitle:@"友情提示"message:@"年龄不能为空"preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction * okaction = [UIAlertActionactionWithTitle:@"确定按钮"style:UIAlertActionStyleDefaulthandler:^(UIAlertAction * action){
NSLog(@"你已经确认");
}];
UIAlertAction * uiaction = [UIAlertActionactionWithTitle:@"取消按钮"style:UIAlertActionStyleCancelhandler:^(UIAlertAction * action){
NSLog(@"你已经取消");
}];
[uia addAction:okaction];
[uia addAction:uiaction];
[selfpresentViewController:uia animated:YEScompletion:nil];
return;
}
//一:获得应用程序代理对象
AppDelegate * app = [UIApplicationsharedApplication].delegate;
//二:获得托管上下文对象,代表着数据库,只要我们在xcdatamodeld文件中插入字段,那么这里将会自动创建数据库文件。
NSManagedObjectContext * context = app.managedObjectContext;
//三:定义一个托管的对象.代表着数据库表中的数据
NSManagedObject * mo = [NSEntityDescriptioninsertNewObjectForEntityForName:@"Student"inManagedObjectContext:context];
//四:指定实体中的值
[mo setValue:nameforKey:@"name"];
//把string转为int
NSNumber * number = [NSNumbernumberWithInt:age.intValue];
[mo setValue:numberforKey:@"age"];
//五:把托管对象放到上下文中
[context insertObject:mo];
NSLog(@"name = %@, age = %@", name, number);
NSError * err;
//六:保存上下文
if ([contextsave:&err]) {
NSLog(@"%@", [errdescription]);
}
}
- (IBAction)searchdb:(id)sender {
/*一:不指定条件的查询 */
//一:获得应用程序代理对象
AppDelegate * app = [UIApplicationsharedApplication].delegate;
//二:获得托管上下文对象,代表着数据库,只要我们在xcdatamodeld文件中插入字段,那么这里将会自动创建数据库文件。
NSManagedObjectContext * context = app.managedObjectContext;
NSLog(@"%@", context);
//三:指定一个实体,实体指的是表
NSEntityDescription * entity = [NSEntityDescriptionentityForName:@"Student"inManagedObjectContext:context];
//四:创建一个查询
NSFetchRequest * request = [[NSFetchRequestalloc ]init];
[request setEntity:entity];
//五:运行一个查询,返回的是托管对象
NSError * err =nil;
NSArray * resultobjects = [contextexecuteFetchRequest:request error:&err];
//遍历数组。
if (resultobjects) {
for (NSManagedObject * moin resultobjects) {
NSLog(@"name = %@, age = %@", [movalueForKey:@"name"],[movalueForKey:@"age"] );
}
}
/*二:指定条件的查询,其实只是加多了一个谓词(谓词就是定制一个条件)
//一:获得应用程序代理对象
AppDelegate * app = [UIApplication sharedApplication].delegate;
//二:获得托管上下文对象,代表着数据库,只要我们在xcdatamodeld文件中插入字段,那么这里将会自动创建数据库文件。
NSManagedObjectContext * context = app.managedObjectContext;
//三:指定一个实体,实体指的是表
NSEntityDescription * entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:context];
//四:创建一个查询
NSFetchRequest * request = [[NSFetchRequest alloc ]init];
[request setEntity:entity];
//五:创建一个查询的谓词
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"(age = %d)", 22];
//六:把谓词添加到查询中
[request setPredicate:predicate];
//七:运行一个查询,返回的是托管对象
NSError * err =nil;
NSArray * resultobjects = [context executeFetchRequest:request error:&err];
//八:遍历结果数组。
if (resultobjects) {
for (NSManagedObject * mo in resultobjects) {
NSLog(@"name = %@, age = %@", [mo valueForKey:@"name"],[mo valueForKey:@"age"] );
}
}*/
}
- (IBAction)updatedb:(id)sender {
//一:获得应用程序代理对象
AppDelegate * app = [UIApplicationsharedApplication].delegate;
//二:获得托管上下文对象,代表着数据库,只要我们在xcdatamodeld文件中插入字段,那么这里将会自动创建数据库文件。
NSManagedObjectContext * context = app.managedObjectContext;
//三:指定一个实体,实体指的是表
NSEntityDescription * entity = [NSEntityDescriptionentityForName:@"Student"inManagedObjectContext:context];
//四:创建一个查询
NSFetchRequest * request = [[NSFetchRequestalloc ]init];
[request setEntity:entity];
//五:创建一个查询的谓词
NSPredicate * predicate = [NSPredicatepredicateWithFormat:@"(age = %d)",23];
//六:把谓词添加到查询中
[request setPredicate:predicate];
//七:运行一个查询,返回的是托管对象
NSError * err =nil;
NSArray * resultobjects = [contextexecuteFetchRequest:request error:&err];
//八:遍历结果数组。
if (resultobjects) {
for (NSManagedObject * moin resultobjects) {
//mo就是一个托管的对象
[mo setValue:[NSNumbernumberWithInt:88]forKey:@"age"];//修改年龄
}
}
//六:保存上下文,如果没有该步骤,那么就只是在内存中给修改而已,数据库是没有变化的。
if ([contextsave:&err]) {
NSLog(@"%@", [errdescription]);
}
}
//基本语句和查询的一样,之后再遍历结果出来后的操作有所不同。
- (IBAction)deletedb:(UIButton *)sender {
//一:获得应用程序代理对象
AppDelegate * app = [UIApplicationsharedApplication].delegate;
//二:获得托管上下文对象,代表着数据库,只要我们在xcdatamodeld文件中插入字段,那么这里将会自动创建数据库文件。
NSManagedObjectContext * context = app.managedObjectContext;
//三:指定一个实体,实体指的是表
NSEntityDescription * entity = [NSEntityDescriptionentityForName:@"Student"inManagedObjectContext:context];
//四:创建一个查询
NSFetchRequest * request = [[NSFetchRequestalloc ]init];
[request setEntity:entity];
//五:创建一个查询的谓词
NSPredicate * predicate = [NSPredicatepredicateWithFormat:@"(age = %d)",11];
//六:把谓词添加到查询中
[request setPredicate:predicate];
//七:运行一个查询,返回的是托管对象
NSError * err =nil;
NSArray * resultobjects = [contextexecuteFetchRequest:request error:&err];
//八:遍历结果数组。
if (resultobjects) {
for (NSManagedObject * moin resultobjects) {
//mo就是一个托管的对象
[context deleteObject:mo];
}
}
//六:保存上下文,如果没有该步骤,那么就只是在内存中给修改而已,数据库是没有变化的。
if ([contextsave:&err]) {
NSLog(@"%@", [errdescription]);
}
}
@end