• iOS-senior2-数据库


    数据库知识点:

    2.1数据库的特征

    2.2SQL字段的约束条件

    #NOT NULL#在数据库中允许除了主键以外其他任何字段为空

    #UNIQUE  #表示确定的,只有这个没有其他

    #PRIMARY KEY#

    1.不为空(not null),唯一性(unique)

    2.一个表里可以没有主键,如果设置完主键,这个字段不能为空,不能              重复(最好设置主键,方便查找信息)

    #FOREIGN KEY#

    1.在MySQL里有个连表查询(两个表以上有关联)就是外边一张表的主键相当于当前表就叫做外键  

    2.作用:可以查询另外一张表的某条具体的数据

    #CHECK#条件检查(没什么用),确保一列中的所有值满足一定条件

    #DEFAULT#默认为

    #AUTOINCREMENT#自增型变量,当设置一个integer类型的数据字段,它会自增加一

    2.3部分基础SQL语句

    1.建表(create table 表名)

    2.插入(insert into 表名(字段1,字段2,字段3) values (值1,值2,值3))

     

    3.更新(update 表名 set 字段1名 = 修改值1,字段2名 = 修改值2 where 条件)

    4.删除(delete from 表名 where 条件)

    5.查询(select 要查找的字段 from 表名 where 条件)

     2.4延伸---单例

    2.5关于数据库操作源代码

    DataBaseHandle.h

    //创建一个类写成单例,方便外部使用

    +(DataBaseHandle *)shareDataBaseHandle;

    //打开数据库

    - (void) openDB;

    //关闭数据库

    - (void)closeDB;

    //创建表

    - (void)createTable;

    //插入数据

    - (void)insertName:(NSString *)name  gender:(NSString *)gender  age:(NSInteger)age;

    //通过uid去更新数据

    - (void)updateWithUID:(NSInteger)uid;

    //通过uid去删除数据

    - (void)deleteWithUID:(NSInteger)uid;

    //查找所有数据

    - (void)searchAll;

    //根据名字去查找相关的数据信息

    - (void)searchWithName:(NSString *)name;

    DataBaseHandle.m

    #import "DataBaseHandle.h"

    //引入数据库操作的头文件

    #import <sqlite3.h>

    //延展定义

    @interface DataBaseHandle()

    @property (nonatomic,copy) NSString *dbPath;

    @end

    static DataBaseHandle *dataBase;

    @implementation DataBaseHandle 

    +(DataBaseHandle *)shareDataBaseHandle {

        if (dataBase == nil) {

            dataBase = [[DataBaseHandle alloc]init];

        }

        return dataBase;

    }

    //懒加载需要给数据库路径赋值

    - (NSString *)dbPath {

        if (_dbPath == nil) {

            //需求:路径存储在Docments文件夹下,数据库文件为person.splite

            NSString *documentsPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

            _dbPath = [documentsPath stringByAppendingPathComponent:@"person.sqlite"];

        }

        return _dbPath;

    }

    //打开数据库(好多地方都会使用到数据库,所以初始化一个数据库的静态变量)

    static sqlite3 *db = nil;

    - (void)openDB {

        //打开数据库,使用int去接收打开的结果

        //第一个参数:filename代表数据库的存储路径

        //第二个参数:二级指针,数据库的地址

        int result = sqlite3_open([self.dbPath UTF8String], &db);

        

        //result是个枚举值,有很多情况

        if (result == SQLITE_OK) {

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

        }else {

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

        }

     }

    //关闭数据库

    - (void)closeDB {

        int result = sqlite3_open([self.dbPath UTF8String], &db);

        if (result == SQLITE_OK) {

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

        }else {

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

        }

    }

    //创建table

    - (void)createTable {

        //创建一个person表,字段:uid integer类型  主键 自增 不能为空 ,name text类型,gender text类型,age integer类型

        NSString *createStr = @"create table person(uid integer primary key autoincrement not null, name text, gender text, age integer)";

        //第一个参数:数据库

        //第二个参数:sql语句,需要进行编码

        //第三个参数:结果回调的函数

        //第四个参数:回调函数的一个参数

        //第五个参数:回调函数的一个参数

        //自己查找(nil和null的区别)

        int result = sqlite3_exec(db, [createStr UTF8String], NULL, NULL, NULL);

        if (result == SQLITE_OK) {

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

        }else {

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

        }

        //打印数据库路径,检查表是否创建成功

        NSLog(@"_dbPath = %@",_dbPath);

    }

    //插入数据

    - (void)insertName:(NSString *)name

                gender:(NSString *)gender

                   age:(NSInteger) age {

        //当values不确定的情况下,使用英文下问号?代替,之后会进行其值绑定的过程

        NSString *insertStr = @"insert into person (name,gender,age) values (?,?,?)";

        //伴随指针

        sqlite3_stmt *stmt = nil;

        //预执行语句

        //第一个参数:数据库

        //第二个参数:sql语句

        //第三个参数:有正负之分,例如:1.代表只往后读一个字节;如果为负值,遇到特殊符号才会结束读取(00,u000);

        //第四个参数:伴随指针,会随着数据库的相关操作确定其中?的值

        //第五个参数:取值的时候取得不全,剩下的值都存在这里

        int result = sqlite3_prepare(db, insertStr.UTF8String, -1, &stmt, NULL);

        if (result == SQLITE_OK) {

            //在操作成功的方法里进行?值得一些绑定设置

            //第一个参数:伴随指针

            //第二个参数:?的位置,从1开始

            //第三个参数:表示要插入的值

            //第四个参数:和上面的-1一样一样的

            //第五个参数:回调函数

            sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);

            sqlite3_bind_text(stmt, 2, gender.UTF8String, -1, NULL);

            sqlite3_bind_int64(stmt, 3, age);

            //sql语句执行完毕

            //执行伴随指针,根据伴随指针的情况判定是否插入成功[SQLITE_DONE代表伴随指针执行数据成功]

            

            if (sqlite3_step(stmt) == SQLITE_DONE) {

                NSLog(@"插入成功");

            }

            else {

                NSLog(@"插入失败");

            }

    }else {

            NSLog(@"result = %d",result);

        }

        //一定要释放伴随指针

        sqlite3_finalize(stmt);

    }

    //通过uid去更新数据

    - (void)updateWithUID:(NSInteger)uid {

        //伴随指针

        sqlite3_stmt *stmt = nil;

        NSString *updateStr = @"update person set name ='afu' where uid = ? ";

        int result = sqlite3_prepare(db, updateStr.UTF8String, -1 , &stmt,NULL);

        if (result == SQLITE_OK) {

            sqlite3_bind_int64(stmt, 1, uid);

            

            if (sqlite3_step(stmt) == SQLITE_DONE) {

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

            }else {

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

            }

            

        }else {

            NSLog(@"result = %d",result);

        }

        //释放

        sqlite3_finalize(stmt);

    }

    //通过uid去删除数据

    - (void)deleteWithUID:(NSInteger)uid {

        NSString *deleteStr = [NSString stringWithFormat:@"delete from person where uid = %ld",uid];

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

        if (result == SQLITE_OK) {

            NSLog(@"删除成功");

            

        }else {

            NSLog(@"删除失败");

        }

    }

    //查找所有数据

    - (void)searchAll {

        NSString *searchAllStr = @"select * from person ";

        sqlite3_stmt *stmt = nil;

        //预执行

        int result = sqlite3_prepare(db, searchAllStr.UTF8String, -1, &stmt, NULL);

        if (result == SQLITE_OK) {

            //查询数据的时候当不知道有多少次的时候使用while循环

            //sqlite3_step(stmt) == SQLITE_ROW代表逐行执行数据

            

            while (sqlite3_step(stmt) == SQLITE_ROW) {

                //第一个参数:伴随指针

                //第二个参数:代表这个字段的位置坐标(只有带问号的是从1开始,其余所有的都从0开始)

                int uid = sqlite3_column_int(stmt, 0);

                NSLog(@"uid = %d",uid);

                //在oc代码中要使用c语言的 相关内容,应该使用utf - 8

                NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];

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

                

                NSString *gender = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(stmt, 2)];

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

                

                int age = sqlite3_column_int(stmt, 3);

                NSLog(@"age = %d",age);

                }

            

        }else {

            NSLog(@"result = %d",result);

        }

        //释放伴随指针

        sqlite3_finalize(stmt);

    }

    //根据名字去查找相关的数据信息

    - (void)searchWithName:(NSString *)name {

        NSString *searchStr = @"select uid,gender,age from person where name =  ?";

        sqlite3_stmt *stmt = nil;

        int result = sqlite3_prepare(db, searchStr.UTF8String, -1, &stmt, NULL);

        if (result == SQLITE_OK) {

            //绑定

            sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);

            while (sqlite3_stmt_busy(stmt) == SQLITE_ROW) {

                

                int uid = sqlite3_column_int(stmt, 0);

                

                NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];

                

                int age = sqlite3_column_int(stmt, 3);

                NSLog(@"++++uid = %d,gender = %@,age = %d",uid,gender,age);

            }

        }else {

            NSLog(@"result = %d",result);

        }

        sqlite3_finalize(stmt);

        

    }

     

     

     

     

     

  • 相关阅读:
    The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored(E F G H I)
    Ubuntu iso下载地址(14、16、18)
    JS解决在提交form表单时某个值不存在 alter弹窗点确定不刷新界面
    搞搞电脑微信表情的破解(.dat转png or jpg)
    12.29 模拟赛
    bzoj 2151 种树
    bzoj 5110 Yazid的新生舞会
    【系列】 点分治
    12.8 模拟赛
    12.17 模拟赛
  • 原文地址:https://www.cnblogs.com/zhoulina/p/5459694.html
Copyright © 2020-2023  润新知