数据库SQlite的简单使用

首先引入#import <sqlite3.h>


/*

创建

格式:create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型。。。)

creat table Person(id integer primary key, name text,age,integer)


插入

格式:insert into 表名称(列1,列2…)values(值1,值2…)。注意字符串一般用单引号’,双引号也可以

insert into Person(name, age)values(@"张三",18)


查询

格式:select 列名称 from 表名称

这里可以用*表示所有列

select * from Person

可以加后缀,多个条件

select * from Person where id = 2


更新

格式:update 表名称 set 列名称 = 新值 where 列名称

如下把id = 2的列的name改成李四

update Person set name = @"李四" where id = 2


删除

格式:delete from 表名 where 列名

delete from Person where id = 2

*/



//SQLite是以表的形式存数据,类似excel。要修改某一条数据,可以单独对其操作而不需要整体覆盖。

//轻量级数据库,占用内存小,速度快,

//跨平台,可以在iOS和安卓通用

//SQL:结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

//常见的SQL语句有创建(Create),插入(Insert),更新(Update),删除(Delete),查询(Select)


#import "myViewController.h"

#import "loadViewController.h"

#import <sqlite3.h>


#define TABLENAME @"mytable"

#define ID @"mynaid"

#define NAME @"myname"

#define ADDRESS @"myaddress"

#define AGE @"myage"


static sqlite3 *db;//是指向数据库的指针,我们其他操作


@interface myViewController ()


@property(nonatomic,strong)UITextField *textField1;

@property(nonatomic,strong)UITextField *textField2;

@property(nonatomic,strong)UITextField *textField3;


@end


@implementation myViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    self.view.backgroundColor=[UIColor cyanColor];

    

    UIButton *btn1=[[UIButton alloc] initWithFrame:CGRectMake(100, 20, 100, 30)];

    [btn1 setTitle:@"建表" forState:UIControlStateNormal];

    [btn1 setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];

    btn1.titleLabel.font=[UIFont systemFontOfSize:20.f];

    btn1.backgroundColor=[UIColor whiteColor];

    [btn1 addTarget:self action:@selector(Method1) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn1];

    

    UIButton *nextbtn=[[UIButton alloc] initWithFrame:CGRectMake(100+100, 20+40, 100, 30)];

    [nextbtn setTitle:@"next" forState:UIControlStateNormal];

    [nextbtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];

    nextbtn.titleLabel.font=[UIFont systemFontOfSize:20.f];

    nextbtn.backgroundColor=[UIColor whiteColor];

    [nextbtn addTarget:self action:@selector(nextMethod) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:nextbtn];

    

    

    UIButton *btn2=[[UIButton alloc] initWithFrame:CGRectMake(100, 20+50, 100, 30)];

    [btn2 setTitle:@"加入" forState:UIControlStateNormal];

    [btn2 setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];

    btn2.titleLabel.font=[UIFont systemFontOfSize:20.f];

    btn2.backgroundColor=[UIColor whiteColor];

    [btn2 addTarget:self action:@selector(Method2) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn2];

    

    UIButton *btn3=[[UIButton alloc] initWithFrame:CGRectMake(100, 20+50+50, 100, 30)];

    [btn3 setTitle:@"改" forState:UIControlStateNormal];

    [btn3 setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];

    btn3.titleLabel.font=[UIFont systemFontOfSize:20.f];

    btn3.backgroundColor=[UIColor whiteColor];

    [btn3 addTarget:self action:@selector(Method3) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn3];

    

    UIButton *btn4=[[UIButton alloc] initWithFrame:CGRectMake(100, 20+50+50+50, 100, 30)];

    [btn4 setTitle:@"删除" forState:UIControlStateNormal];

    [btn4 setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];

    btn4.titleLabel.font=[UIFont systemFontOfSize:20.f];

    btn4.backgroundColor=[UIColor whiteColor];

    [btn4 addTarget:self action:@selector(Method4) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn4];

    

    UIButton *btn5=[[UIButton alloc] initWithFrame:CGRectMake(100, 20+50+50+50+50, 100, 30)];

    [btn5 setTitle:@"查询" forState:UIControlStateNormal];

    [btn5 setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];

    btn5.titleLabel.font=[UIFont systemFontOfSize:20.f];

    btn5.backgroundColor=[UIColor whiteColor];

    [btn5 addTarget:self action:@selector(Method5) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn5];

    

    

    _textField1=[[UITextField alloc] initWithFrame:CGRectMake(100, 20+50+50+50+50+50, 200, 40)];

    _textField1.placeholder=@"请输入姓名";

    _textField1.backgroundColor=[UIColor whiteColor];

    _textField1.keyboardType=UIKeyboardTypeDefault;

    [self.view addSubview:_textField1];

    

    _textField2=[[UITextField alloc] initWithFrame:CGRectMake(100, 20+50+50+50+50+50+50, 200, 40)];

    _textField2.placeholder=@"请输入年龄";

    _textField2.backgroundColor=[UIColor whiteColor];

    _textField2.keyboardType=UIKeyboardTypeNumberPad;

    [self.view addSubview:_textField2];

    

    _textField3=[[UITextField alloc] initWithFrame:CGRectMake(100, 20+50+50+50+50+50+50+50, 200, 40)];

    _textField3.placeholder=@"请输入地址";

    _textField3.backgroundColor=[UIColor whiteColor];

    _textField3.keyboardType=UIKeyboardTypeDefault;

    [self.view addSubview:_textField3];

    

    // Do any additional setup after loading the view.

}


-(void)Method1

{

    [self createTable];

}


-(void)Method2

{

    

    [self insertData];

}


-(void)Method3

{

    [self updateData];

}


-(void)Method4

{

    [self deleteData];

}


-(void)Method5

{

    [self selectData];

    //[self selectpartdata];

}


//打开数据库

-(void) openDB{

    //获取文件路径

    NSString *str = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

    NSString *strPath = [str stringByAppendingPathComponent:@"my.sqlite"];

    NSLog(@"数据库的文件路径==%@",strPath);

    //打开数据库

    //如果数据库存在就打开,如果不存在就创建一个再打开

    if (sqlite3_open([strPath UTF8String], &db) == SQLITE_OK) {

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

        //return YES;

    }else{

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

        sqlite3_close(db);

        //return NO;

    }

}


//关闭数据库

- (void)closeSqlite {

    

    int result = sqlite3_close(db);

    if (result == SQLITE_OK) {

        db = nil;//  把指针 重置为空 方便下次打开

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

    } else {

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

    }

}


//增删改查时都会进行的操作

-(void)execSql:(NSString *)sql

{

    NSString *str = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

    NSString *strPath = [str stringByAppendingPathComponent:@"my.sqlite"];

    

    if (sqlite3_open([strPath UTF8String], &db) == SQLITE_OK) {

        char *err;

        if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {

            NSLog(@"数据库操作数据失败!");

        }else{

            NSLog(@"数据库每次进行的操作%@",sql);

        }

    }

    [self closeSqlite];

}


//创建表

-(void)createTable

{

    //1.打开数据库

    [self openDB];

    //  2.写sql语句 根据model 创建表

    //  create table Student (Student 是表名)

    //  number integer primary key not NULL 主键值 如果不操作 自增

    NSString *sqlCreateTable =  [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ('%@' INTEGER PRIMARY KEY AUTOINCREMENT, '%@' TEXT, '%@' INTEGER, '%@' TEXT)",TABLENAME,ID,NAME,AGE,ADDRESS];

    //  3.执行sql语句 创建表

    /**

     *  第1个参数不再说了,是前面open函数得到的指针。说了是关键数据结构。

     第2个参数constchar*sql是一条sql 语句,以\0结尾。

     第3个参数sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。

     第4个参数void*是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。等下我们再看回调函数的写

     法,以及这个参数的使用。

     第5个参数char** errmsg 是错误信息。

     *

     */

    /*

    int result = sqlite3_exec(db, sqlCreateTable.UTF8String, NULL, NULL, NULL);

    if (result == SQLITE_OK) {

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

    } else {

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

    }

    //  4.关闭数据库

    [self closeSqlite];

    */

     

    [self execSql:sqlCreateTable];

}


//加入数据

-(void) insertData{

    [self openDB];

    NSString *insertSql1= [NSString stringWithFormat:

                           @"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",

                           TABLENAME, NAME, AGE, ADDRESS, @"张三", @"13", @"济南"];

    [self execSql:insertSql1];

    

    //NSString *insertSql2 = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",TABLENAME, NAME, AGE, ADDRESS, @"李四", @"12", @"济南"];

    

    NSString *insertSql2 = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",TABLENAME, NAME, AGE, ADDRESS, _textField1.text, _textField2.text, _textField3.text];

    

    [self execSql:insertSql2];

}


//更改数据  根据名字 更改学号

-(void) updateData{

    [self openDB];

    NSString *updateSql = [NSString stringWithFormat:

                           @"UPDATE '%@' SET '%@' = '%@' WHERE '%@' = '%@'",

                           TABLENAME,   AGE@"15" ,AGE@"13"];

    [self execSql:updateSql];

}


//删除对应的

-(void) deleteData{

    [self openDB];

    NSString *sdeleteSql = [NSString stringWithFormat:

                            @"delete from %@ where %@ = '%@'",

                            TABLENAME, NAME, @"张三"];

    [self execSql:sdeleteSql];

}


//查询部分数据

- (void)selectpartdata

{

    [self openDB];

    NSString *sqlString = @"select * from TABLENAME where myage = ?";

    // 准备sql语句

    // 第三个参数是sql语句的长度,如果写入sqlString.length会报个警告类型不匹配,我们可以写个-1,这样系统会自动计算长度,第三个参数需要传入一个sql的语句管理者指针,最后一个参数是预留参数

    sqlite3_stmt *stmt = nil;

    // 生成语句对象

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

    if (result==SQLITE_OK) {

        // 如果查询语句或者其他sql语句有条件,在准备语句对象的函数内部,sql语句中用?来代替条件,那么在执行语句之前,一定要绑定

        // 1代表sql语句中的第一个问号,问号的下标是从1开始的

        sqlite3_bind_int(stmt, 1, 1);

    

        if (sqlite3_step(stmt) == SQLITE_ROW) {

            

            // 获取记录中的字段信息

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

            const unsigned char *cGender = sqlite3_column_text(stmt, 2);

            

            // 将C语言字符串转换成OC字符串

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

            NSString *gender = [NSString stringWithUTF8String:(const char *)cGender];

            

            NSLog(@"%@   %@", name, gender);

            

        }

        

        

        

    }

    

}


//查询所有数据

-(void) selectData{

    

    [self openDB];

    NSString *sqlQuery = [NSString stringWithFormat:

                          @"SELECT * FROM %@",TABLENAME];

    sqlite3_stmt * statement;

    

    //进行查询前的准备工作

    if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {//SQL语句没有问题

        NSLog(@"查询语句没有问题");

        //查询结果集中一条一条的遍历所有的记录,这里的数字对应的是列值,注意这里的列值

        //每调用一次sqlite3_step函数,stmt就会指向下一条记录

        while (sqlite3_step(statement) == SQLITE_ROW) {//找到一条记录

            // 获取一共多少列

            int count = sqlite3_column_count(statement);

            NSLog(@"总列数==%d", count);

            const char *cKey = sqlite3_column_name(statement, 2);

            NSString *key = [NSString stringWithUTF8String:cKey];

            NSLog(@"获取到的表名==%@" ,key);

            

            //(1)取出第1列字段的值(text类型的值)

            char *name = (char*)sqlite3_column_text(statement, 1);

            NSString *nsNameStr = [[NSString alloc] initWithUTF8String:name];

            //(2)取出第2列字段的值(int类型的值)

            int age = sqlite3_column_int(statement, 2);

            //(3)取出第3列字段的值(text类型的值)

            char *address = (char*)sqlite3_column_text(statement, 3);

            NSString *nsAddressStr = [[NSString alloc]initWithUTF8String:address];

            

            NSLog(@"查询全部的数据 name==%@  age==%d  address==%@",nsNameStr,age, nsAddressStr);

        }

    }else{

        NSLog(@"查询语句有问题:%@",sqlQuery);

    }

}


/*

//用字典存储所有数据。返回要查看的所有数据的数组

- (NSArray *)querySQL:(NSString *)querySQL

{

    // 定义游标对象

    sqlite3_stmt *stmt = nil;

    

    // 准备查询

    // 1> 参数一:数据库对象

    // 2> 参数二:查询语句

    // 3> 参数三:查询语句的长度:-1

    // 4> 参数四:句柄(游标对象)

    if (sqlite3_prepare_v2(self.db, querySQL.UTF8String, -1, &stmt, nil) != SQLITE_OK) {

        NSLog(@"准备查询失败");

        return nil;

    };

    

    // 准备成功,开始查询数据

    NSMutableArray *dictArray = [NSMutableArray array];

    while (sqlite3_step(stmt) == SQLITE_ROW) {

        // 获取一共多少列

        int count = sqlite3_column_count(stmt);

        

        // 定义字典

        NSMutableDictionary *dict = [NSMutableDictionary dictionary];

        for (int i = 0; i < count; i++) {

            // 取出i位置列的字段名,作为字典的键

            const char *cKey = sqlite3_column_name(stmt, i);

            NSString *key = [NSString stringWithUTF8String:cKey];

            

            // 取出i位置的存储的值,作为字典的值

            const char *cValue = (const char *)sqlite3_column_text(stmt, i);

            NSString *value = [NSString stringWithUTF8String:cValue];

            

            // 将键值对一个一个放入字典中

            [dict setValue:value forKey:key];

        }

        

        // 将获取的字典放入数组中

        [dictArray addObject:dict];

    }

    

    // 返回取出所有数据的数组

    return dictArray;

}

*/


- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    [self.view endEditing:YES];

}


- (BOOL)textFieldShouldReturn:(UITextField *)textField

{

    [_textField1 resignFirstResponder];

    [_textField2 resignFirstResponder];

    [_textField3 resignFirstResponder];

    

    return YES;

}


- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{

    //返回一个BOOL值,指定是否循序文本字段开始编辑,返回NO时不能唤起键盘进行编辑

    return YES;

}


-(void)nextMethod

{

    loadViewController *load=[[loadViewController alloc] init];

    [self presentViewController:load animated:YES completion:nil];

}


- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}



猜你喜欢

转载自blog.csdn.net/mr_tangit/article/details/80612951