标签:
一、数据库
SQL: SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集, 是一种功能齐全的数据库语言。
二、数据库管理系统
数据库特征:
1.以一定方式存储在一起
2.能为多个用户共享
3.具有尽可能少的冗余代码
4.与程序彼此独立的数据集合
三、表
表是数据库中一个非常重要的对象, 是其他对象的基础根据信息的分类情况, 一个数据库中可能包含若干个数据表
记录:是指对应于数据表中的一行信息的一组完整的相关信息
SQL字段的约束条件:
NOT NULL - 非空 (除主键以外, 其余任何字段都允许为空)
UNIQUE - 唯一 (表示确定的,只有一个该字段)
PRIMARY KEY - 主键 (不能为空, 唯一, 在一个表中最好设置主键)
FOREIGN - 外键 (数据库中有连表查询功能, 另外一张表的主键就是当前表的外键)
CHECK - 条件检查, 确保一列中的所有值满足一定条件 (CHECK在满足条件时会用到)
DEFAULT - 默认 (默认的)
AOTOINCREMENT - 自增型变量 (当设置一个integer类型的数据字段, 下一条会自增1)
SQL语句:
1.建表命令 (Create Table)
语法:
create table 表名(字段1 约束1 约束2, 字段2 约束1 约束2);
需求: 创建一个student表, 表中的字段有学号, 姓名, 年龄, 学号的约束条件: 作为主键, 自增, 不能为空; 姓名默认为‘无名氏‘; 年龄大于16岁
create table student (s_id integer primary key autoincrement not null, s_name text default ‘无名氏‘, s_age integer check (s_age > 16));
2.数据插入命令 (Insert)
语法:
insert into 表名 (字段1, 字段2, 字段3) values (值1, 值2, 值3);
事例:插入学生姓名, 年龄
insert into student (s_name, s_age) values (‘二芳‘, 30); insert into student (s_name, s_age) values (‘wq‘, 26);
3.数据库更新命令 (Update)
语法:
update 表名 set 字段名1 = 修改值1, 字段名2 = 修改值2 where 条件;
事例:
update student set s_age = 25 where s_age = 18;
4.数据库删除命令 (Delete)
语法:
delete from 表名 where 条件;
需求: 删除年龄为10岁的学生
delete from student where s_age = 10;
因为表中没有年龄为10岁的学生, 故查找不到
5. 数据库检索命令 (Select)
语法:
select 要查找的字段 from 表名 where 条件
需求:查询姓名为二芳的所有信息
select * from student where s_name = ‘二芳‘;
在Xcode中对数据库进行操作
DataBase.h
#import <Foundation/Foundation.h> @interface DataBaseHandle : NSObject //把该类写成单例, 方便外部使用 + (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; @end
DataBase.m
#import "DataBaseHandle.h" //引入数据库操作的头文件 #import <sqlite3.h> static DataBaseHandle *dataBase = nil; @interface DataBaseHandle() ///数据库的存储路径 @property (nonatomic, copy) NSString *dbPath; @end @implementation DataBaseHandle //懒加载需要给数据库路径赋值 - (NSString *)dbPath { if (_dbPath == nil) { //需求: 路径存储在Documents文件夹下, 数据库文件为person.sqlite NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; _dbPath = [documentPath stringByAppendingPathComponent:@"person.sqlite"]; } return _dbPath; } + (DataBaseHandle *)shareDataBaseHandle { if (dataBase == nil) { dataBase = [[DataBaseHandle alloc]init]; } return dataBase; } //数据库使用的场所有很多, 所以初始化一个数据库的静态变量 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_close(db); if (result == SQLITE_OK) { NSLog(@"数据库关闭成功"); }else { NSLog(@"数据库关闭失败"); } } - (void)createTable { //创建一个person表, 字段:uid integer类型 主键 自增 不能为空, name text类型, gender text类型, age integer类型 NSString *createStr = @"create table if not exists person (uid integer primary key autoincrement not null, name text, gender text, age integer)"; //第一个参数: 数据库 //第二个参数: sql语句, 需要进行编码 //第三个参数: 结果回调的一个函数 //第四个参数: 回调函数的一个参数 //第五个参数: 错误信息 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语句 //第三个参数: 有正、负之分, 如果为正: 向后读对应字节数, 如果为负: 遇到特殊符号才会结束读取 (\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); } - (void)updateWithUID:(NSInteger)uid { NSString *updateStr = @"update person set name = ‘悟空‘ where uid = ?"; sqlite3_stmt *stmt = nil; 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); } - (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 *selectAllStr = @"select * from person"; sqlite3_stmt *stmt = nil; //预执行 int result = sqlite3_prepare(db, selectAllStr.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代码中要使用数据库的相关内容, 应该使用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); int age = sqlite3_column_int(stmt, 3); NSLog(@"%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_step(stmt) == SQLITE_ROW) { int uid = sqlite3_column_int(stmt, 0); NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)]; int age = sqlite3_column_int(stmt, 2); NSLog(@"uid = %d, gender = %@, age = %d", uid, gender, age); } }else { NSLog(@"result = %d", result); } sqlite3_finalize(stmt); } @end
ViewController.m
#import "ViewController.h" #import "DataBaseHandle.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. DataBaseHandle *dataBaseHandle = [DataBaseHandle shareDataBaseHandle]; //打开数据库 [dataBaseHandle openDB]; // [dataBaseHandle closeDB]; [dataBaseHandle createTable]; //插入数据 [dataBaseHandle insertName:@"芳芳女神" gender:@"美女" age:25]; //更新数据 [dataBaseHandle updateWithUID:1]; [dataBaseHandle deleteWithUID:1]; [dataBaseHandle searchAll]; [dataBaseHandle searchWithName:@"芳芳女神"]; }
标签:
原文地址:http://www.cnblogs.com/dayihao/p/5460242.html