• iOS开发-xcdatamodeld文件 CoreData的介绍和使用,sqlite的使用


    CoreData的介绍和使用 

    源引:http://www.jianshu.com/p/d027090af00e

    CoreData是数据存储的一种方式,CoreData实质也是对SQLite的封装。

    CoreData是iOS SDK里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据。使用CoreData框架,程序员可以很轻松有效地通过面向对象的接口管理数据。

    CoreData框架提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite3数据库文件中,也能够将保存在数据库中的数据还原成OC对象。

    在实际开发中,新建项目的时候会看到有Use Core Data的选项。


    图1

    CoreData和SQLite的最大区别在于:SQLite使用的是SQL语句,属于面向过程。而CoreData不适用SQL语句,将这一过程封装成面向对象。将表,字段,记录分别封装成实体,属性和对象,更符合面向对象的思想。

    再回到项目中,新建项目之后会发现相比较于普通项目,CoreData项目多了一个后缀名为xcdatamodeld的文件


    图2

    在AppDelegate.h文件中会多出了三个属性和两个方法。还会自动导入CoreData框架


    图3

    在AppDelegate.m文件中会多出一些属性的get方法和方法的实现(从47行-125行)


    图4

    添加实体

    点击xcdatamodeld文件->点击AddEntity->再双击上方的实体名,输入想要的实体名。(注意:实体名一定要大写)


    图5

    点击右侧的Attributes下方的+号可以添加属性


    图6

    添加对象

    添加对象之前我们先来了解一下CoreData的主要对象。如下所示:

    NSManagedObjectContext:也可以称为托管对象上下文,负责应用和数据库之间的交互(CRUD)也就是说用来存东西的。

    NSPersistentStoreCoordinator:持久化存储协调器。添加持久化存储库(如SQLite数据库),是物理数据存储的物理文件和程序之间的联系的桥梁,负责管理不同对象上下文,用来存储上下文的

    NSManagedObjectModel:被管理的对象模型,对应定义的模型文件。管理对象的属性(字段)。

    NSEntityDescription:实体描述(往数据库填东西的时候一定要先创建一个实体描述。可以看做是指定表名的东西)

    /**

    *托管对象上下文,增删改查都需要它

    */

    @property(readonly,strong,nonatomic)NSManagedObjectContext*managedObjectContext;

    /**

    *托管对象模型文件

    *实际上这个对象就是将xcdatamodel文件和此对象做一个关联。转换出来变为对象

    */

    @property(readonly,strong,nonatomic)NSManagedObjectModel*managedObjectModel;

    /**

    *持久化储存协调器

    *实际上就是应用程序与数据库之间建立的桥梁

    */

    @property(readonly,strong,nonatomic)NSPersistentStoreCoordinator*persistentStoreCoordinator;

    /**

    *保存托管对象上下文的内容,增删改之后都要执行此方法

    *当保存时,托管对象上下文的内容就会通过持久化存储协调器进行数据的保存,并且按照模型文件一一对应保存。

    */

    - (void)saveContext;

    /**

    *应用程序文档目录,也就是CoreData保存的文件的目录

    *

    *@return文件保存路径

    */

    - (NSURL*)applicationDocumentsDirectory;

    在ViewController里面导入AppDelegate头文件

    - (void)viewDidLoad {

    [superviewDidLoad];

    //使用CoreData添加数据

    AppDelegate*appDelegate = [UIApplicationsharedApplication].delegate;

    self.manageObjectContext= [appDelegatemanagedObjectContext];

    [self insertData];

    [self updateData];

    }

    - (void)insertData {

    NSEntityDescription*entity = [NSEntityDescriptionentityForName:@"Person"inManagedObjectContext:self.manageObjectContext];

    Person*person = [[Personalloc]initWithEntity:entityinsertIntoManagedObjectContext:self.manageObjectContext];

    person.name=@"钢铁侠";

    person.age=@40;

    person.height=@180;

    __autoreleasingNSError*error;

    [self.manageObjectContextsave:&error];

    if(error) {

    NSLog(@"数据添加失败");

    }else{

    NSLog(@"数据添加成功");

    }

    }

    修改数据的方法:修改数据的方法只需要直接修改对象的属性即可,再保存上下文。

    在属性列表里添加属性

    @property(nonatomic,strong)Person*selectedPerson;

    在插入数据方法的方法里面将创建的对象赋值给selectedPerson

    self.selectedPerson= person;

    实现方法

    - (void)updateData{

    //修改数据

    self.selectedPerson.name=@"Mark47";

    self.selectedPerson.age=@1;

    __autoreleasingNSError*error;

    //保存数据

    [self.manageObjectContextsave:&error];

    if(error) {

    NSLog(@"数据更新失败");

    }else{

    NSLog(@"数据更新成功");

    }

    }

    删除数据:删除数据只要执行deleteObject方法,然后在保存上下文即可

    - (void) deleteData{

    [self.manageObjectContextdeleteObject:self.selectedPerson];

    __autoreleasingNSError*error;

    [self.manageObjectContextsave:&error];

    if(error) {

    NSLog(@"数据删除失败");

    }else{

    NSLog(@"数据删除成功");

    }

    }

    sqlite的使用

    源引:http://www.360doc.com/content/14/1224/22/20918780_435534837.shtml

     

    // 使用前需要引入 注意是<>括号,不是双引号
    #import <sqlite3.h>
      1 - (void)viewDidLoad {
      2     [super viewDidLoad];
      3 //    打开创建数据库
      4     [self openDataBase];
      5 //    创建数据表
      6     [self createTables];
      7 //    插入数据
      8     [self insertData];
      9 //    查找数据
     10     [self findData];
     11 //    删除数据
     12     [self deleteData];
     13 //    修改数据
     14     [self updataData];
     15 }
     16 #pragma mark -打开创建数据库
     17 -(void)openDataBase{
     18 //    创建并打开数据库
     19 //    获取数据库的路径
     20     NSString *documentPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
     21 //    设置数据库的路径和名词
     22     NSString *dataBasePath=[[NSString alloc]initWithString:[documentPath stringByAppendingPathComponent:@"sqlite.sqlite"]];
     23 //    创建并打开数据库
     24     int result = sqlite3_open([dataBasePath UTF8String],&db);
     25     if(result==SQLITE_OK){
     26         NSLog(@"数据库打开成功");
     27     }else{
     28         NSLog(@"数据库打开失败。。");
     29     }
     30 }
     31 #pragma mark -创建数据表
     32 -(void)createTables{
     33 //    sql语句
     34     char *sql="create table if not exists t_persons (id integer primary key autoincrement, name text,age integer);";
     35 //    用于保存错误信息
     36     char *error;
     37 //    执行创建语句并接收结果
     38     int result=sqlite3_exec(db,sql,NULL,NULL,&error);
     39 //    判断是否创建成功
     40     if(result!=SQLITE_OK){
     41         NSLog(@"创建数据表失败~~~~~~~:%s",error);
     42     }else {
     43         NSLog(@"数据表创建成功");
     44     }
     45 }
     46 #pragma mark -插入数据
     47 -(void)insertData{
     48 //    sql语句
     49     char *sql="inser into t_persons(name,age) values(?,?)";
     50 //    存储的内容
     51     sqlite3_stmt *stmt;
     52 //    执行语句并接收结果
     53     int result=sqlite3_prepare_v2(db,sql,-1,&stmt,NULL);
     54 //    判断是否成功
     55     if(result==SQLITE_OK){
     56 //        绑定数据
     57         sqlite3_bind_text(stmt,1,"lidaze",-1,NULL);
     58         sqlite3_bind_int(stmt,2,10);
     59 //        执行插入语句
     60         if(sqlite3_step(stmt)==SQLITE_DONE){
     61             NSLog(@"插入成功。。。");
     62         }else{
     63             NSLog(@"插入失败");
     64         }
     65     }else{
     66         NSLog(@"语发不通过");
     67     }
     68 //   释放stmt
     69     sqlite3_finalize(stmt);
     70 }
     71 #pragma mark -查找数据
     72 -(void)findData{
     73 //    准备C语言sql语句
     74     char *sql="select * from t_persons";
     75 //    准备stmt
     76     sqlite3_stmt *stmt;
     77 //    判断结果
     78     if(result==SQLITE_OK){//sql语句正确
     79         NSLog(@"SQL语句正确");
     80 //    进行逐行读取内容
     81         while (sqlite3_step(stmt)==SQLITE_ROW){
     82             int ID = sqlite3_column_int(stmt,0);
     83             char *name=(char *)sqlite3_column_text(stmt,1);
     84             int age=sqlite3_column_int(stmt,2);
     85             
     86             NSLog(@"id:%i,name:%s,age:%i",ID,name,age);
     87         }
     88     }else{
     89         NSLog(@"sql语句错误");
     90     }
     91 }
     92 #pragma mark -删除数据
     93 -(void)deleteData{
     94 //    准备sql语句
     95     char *sql="delete from t_persons where id=?";
     96 //    stmt
     97     sqlite3_stmt *stmt;
     98 //    判断 sql语句时候通过
     99     if(result==SQLITE_OK){
    100         NSLog(@"删除语句正确");
    101 //    绑定数据
    102         sqlite3_bind_int(stmt,1,58);
    103 //        判断时候执行成功
    104         if(sqlite3_step(stmt)==SQLITE_DONE){
    105             NSLog(@"删除成功");
    106         }else{
    107             NSLog(@"删除是吧i");
    108         }
    109     }else{
    110         NSLog(@"删除语句错误");
    111     }
    112 }
    113 #pragma mark -修改数据
    114 -(void)updataData{
    115 //    准备C语言sql语句
    116     char *sql="updata t_persons set name=?,age=18 where id=?;";
    117 //    准备stmt
    118     sqlite3_stmt *stmt;
    119 //    执行sql语句的判断
    120     int result=sqlite3_prepare(db,sql,-1,&stmt,NULL);
    121 //    判断sql语句的判断
    122     if(result==SQLITE_OK){
    123         NSLog(@"修改语句正确");
    124 //        绑定数据
    125         sqlite3_bind_text(stmt,1,"Zeeeee",-1,NULL);
    126         sqlite3_bind_int(stmt,2,62);
    127 //        执行并判断结果
    128         if(sqlite3_step(stmt)==SQLITE_DONE){
    129             NSLog(@"修改成功");
    130         }else{
    131             NSLog(@"修改失败。。。");
    132         }
    133     }else{
    134         NSLog(@"修改语句错误。。。");
    135     }
    136 }
  • 相关阅读:
    网络流24题-运输问题
    ASP.NET API
    面向对象理解
    冒泡排序
    HTTP Header 缓存
    HTTP Header
    Flask学习笔记07之模板渲染
    Flask学习笔记06之@before_request请求之前执行
    Flask报错:AssertionError: View function mapping is overwriting an existing endpoint function: inner
    装饰器03之多个装饰器的执行顺序
  • 原文地址:https://www.cnblogs.com/gaozhang12345/p/5992640.html
Copyright © 2020-2023  润新知