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