你的位置:首页 > 操作系统

[操作系统]iOS数据库的基本使用


      今天总结下数据库的基本使用方法:

        iOS使用的数据库一般就是sqlite3,在使用该数据库前一定要先导入数据库框架,否则会出错,接下来引入头文件#import<sqlite3.h>   

在工程里创建一个Model类Student,一个数据库工具类DataBaseTool

     在Student.h中定义几条属性:

 

#import <Foundation/Foundation.h>

 

@interface Student : NSObject

 

@property(nonatomic,copy)NSString *name;

 

@property(nonatomic,copy)NSString *hobby;

 

@property(nonatomic,assign)NSInteger age;

 

@end

 

   DataBaseTool.h中对数据库操作方法的声明:

 

#import <Foundation/Foundation.h>

 

 #import <sqlite3.h>

 #import "Student.h"

 

@interface DataBaseTool : NSObject

 

{

 

    //用来保存数据库对象的地址

 

    sqlite3 *dbPoint;

 

}

 

//为了保证当前数据库在工程里是唯一的,我们用单例的方式创建一个数据库工具对象

 

+ (dataBaseTool *)shareDataBaseTool;

 

//打开数据库

 

- (void)openDB;

 

 //给数据库创建张表格,table

 

- (void)createTable;

 

 //插入一个学生信息

 

- (void)insertStu:(Student *)stu;

 

 //更新一个学生信息

 

- (void)updateStu:(Student *)stu;

//删除操作

 

 - (void)deletedateStu:(Student *)stu;

//查询操作

 

- (NSMutableArray *)selectAllStu;

 

 //关闭数据库

 

- (void)closeDB;

 

@end

     DataBaseTool.m中实现方法:

 

 

#import "dataBaseTool.h"

 

 @implementation dataBaseTool

 

+ (dataBaseTool *)shareDataBaseTool{

 

    static dataBaseTool *tool;

 

    static dispatch_once_t oneToken;

 

    dispatch_once(&oneToken, ^{

 

                tool=[[dataBaseTool alloc] init];

 

    });

 

    return tool;

 

}

 

- (void)openDB{

 

//数据库文件也保存在沙盒的documents文件里,所以先找沙盒路径

 

        NSArray *sandBox=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

 

    NSString *sandBoxPath=sandBox[0];

 

    //拼接文件路径,如果系统根据这个文件路径查找的时候有对应文件则直接打开数据库,如果没有则会创建一个相应的数据库

 

    NSString *documentPath=[sandBoxPath stringByAppendingPathComponent:@"Student.sqlite"];

 

    int result=sqlite3_open([documentPath UTF8String], &dbPoint);

 

    if (result==SQLITE_OK) {

 

        NSLog(@"数据库打开成功");

 

        NSLog(@"%@",documentPath);     

 

    }else{

                 NSLog(@"数据库打开失败");

    }   

 }

 

- (void)createTable{

 

//primary key 是主键的意思,主健在当前表里数据是唯一的,不能重复,可以唯一标识一条数据,一般是整数

 

    //autoincrement自增,为了让主键不重复,会让主键采用自增的方式

 

    //if not exists 如果没有表才会创建,防止重复创建覆盖之前数据

 

    //数据库问题90%是sql语句问题,所以先保证语句没问题,再放到工程里使用

 

    NSString *sqlStr=@" create table if not exists stu(number integer primary key autoincrement,name text,age integer,hobby text)";

 

    //执行这条sql语句

 

    int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);

 

    if (result==SQLITE_OK) {

 

                NSLog(@"表创建成功");

 

    }else{

        NSLog(@"表创建失败");

    }

}

 

- (void)insertStu:(Student *)stu{

 

    NSString *sqlStr=[NSString stringWithFormat:@"insert into stu (name,age,hobby) values ('%@','%ld','%@')",stu.name,stu.age,stu.hobby

 

];

 

    //执行sql语句

 

    int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);

 

    if (result==SQLITE_OK) {

 

        NSLog(@"添加学生成功");

 

    }else {

 

        NSLog(@"添加学生失败");

 

    }

 

}

 

- (void)updateStu:(Student *)stu{

 

     NSString *sqlStr= [NSString stringWithFormat:@"update stu set hobby='%@',age=%ld where name='%@'",stu.hobby,stu.age,stu.name];

 

    //执行sql语句

 

    int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);

 

    if (result==SQLITE_OK) {

 

        NSLog(@"更新成功");

 

    }else{

 

        NSLog(@"更新失败");

 

        NSLog(@"%d",result);

 

    } 

 

}

 

- (void)deletedateStu:(Student *)stu{

 

    NSString *sqlStr=[NSString stringWithFormat:@"delete from stu where name='%@'",stu.name];

 

    //执行sql语句

 

    int result=sqlite3_exec(dbPoint, [sqlStr UTF8String], nil, nil, nil);

 

    if (result==SQLITE_OK) {

 

                NSLog(@"删除成功");

 

    }else{

 

            NSLog(@"删除失败");

 

        }

 

}

 

- (NSMutableArray *)selectAllStu{

 

     //查询逻辑

 

    //1.先从本地的数据库中读取某张表里的所有数据

 

    //2.然后逐条进行读取,对model进行赋值

 

    //3.把已经赋值好得model放到数组中,并且返回

 

    NSString *sqlStr=@"select * from stu";

 

    //在语句里*是通配符的意思,通过一个*相当于代替了表里的所有的字段名

 

    //接下来需要定义一个跟随指针,它用来遍历数据库表中的每行数据

 

    //第三个参数:查询语句字数限制,-1是没有限制

 

    sqlite3_stmt *stmt=nil;

 

    int result=sqlite3_prepare_v2(dbPoint, [sqlStr UTF8String], -1, &stmt, nil);

 

    //这个方法相当于把数据库和跟随指针关联,一同完成查询功能

 

    //初始化一个用来装学生的数组

 

    NSMutableArray *stuArr=[NSMutableArray array];

 

    if (result==SQLITE_OK) {

 

                NSLog(@"查询成功");

 

        //开始遍历查询数据库的每一行数据

 

        while (sqlite3_step(stmt)==SQLITE_ROW) {

 

            //让跟随指针进行遍历查询,如果没有行,才会停止循环

 

            //满足条件,则逐列的读取内容

 

            //第二个参数表示当前这列数据在表的第几列

 

            const unsigned char *name=sqlite3_column_text(stmt, 1);

 

           int age=sqlite3_column_int(stmt, 2);

 

            const unsigned char *hobby=sqlite3_column_text(stmt,3);

 

            //把列里的数据再进行类型的转换

 

            NSInteger stuAge=age;

 

            NSString *stuName=[NSString stringWithUTF8String:(const char *)name];

 

            NSString *stuHobby=[NSString stringWithUTF8String:(const char *)hobby];

 

            //给对象赋值,然后把对象放到数组里

 

            Student *stu=[[Student alloc] init];

 

            stu.name=stuName;

 

            stu.hobby=stuHobby;

 

            stu.age=stuAge;

 

            [stuArr addObject:stu];

 

            [stu release];

 

        }

 

    }else{

 

        NSLog(@"查询失败");

 

        NSLog(@"%d",result);

 

    }

     return stuArr;

}

 

- (void)closeDB{    

 

    int result=sqlite3_close(dbPoint);

 

    if (result==SQLITE_OK) {

 

        NSLog(@"数据库关闭成功");

 

       // NSLog(@"%@",documentPath);

  

    }else{ 

        NSLog(@"数据库关闭失败");

    }

}

@end