objective-c - 基础篇 - 数据库网络 -- Core Data数据库持久化

本文详细介绍了Objective-C中使用Core Data进行数据库持久化的操作,包括增、删、查、改的基本步骤。通过实例展示了如何创建、查询、更新和删除数据库记录,以及如何使用KVC模式进行数据赋值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值