码迷,mamicode.com
首页 > 移动开发 > 详细

iOS-senior2-数据库

时间:2016-05-04 21:05:46      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:

数据库知识点:

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.代表只往后读一个字节;如果为负值,遇到特殊符号才会结束读取(\000,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);

    

}

 

运行结果如图所示: 

技术分享

 

2.结果

技术分享

 

3.结果

 技术分享

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

iOS-senior2-数据库

标签:

原文地址:http://www.cnblogs.com/zhoulina/p/5459694.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!