UI数据库
一、数据库
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:@"芳芳女神"];
}
浙公网安备 33010602011771号