数据缓存——SQLite关系型数据库的使用
数据库(Database):存放数据的仓库,存放的是一张的表,特别像Excel,Numbers,都以表格的形式存放数据,可以创建多张表。
常见的数据库:sqlite,MySQL,SQLServer,Oracle,Access。
使用数据库,主要是因为文件读写和归档读取数据需要一次把数据全部读出来,占用内存开销大;其次是数据库数据效率高,体现在增删改查。
数据库存储数据的步骤
1、新建一个数据库
2、新建一张表(table)
3、添加多个字段(column,列,属性)
4、添加多行记录(row,每行存放多个字段对应的值)
数据库的操作语句(增删改查),即SQL(StructuredQueryLanguage)
SQL语句不区分大小写,字符串需要加""或''''
常用语法:(主键:是一条数据的唯一标示符,一张表只能有一个主键,主键不能够重复,一般把主键名设为"id",不需要赋值,会自增;代表所有的字段;where是条件)
1表操作
(1)创建表:creattable表名(字段名字段数据类型是否为主键,字段名字段数据类型,字段名字段数据类型...)
(2)修改表名:ALTERTABLE旧表名RENAMETO新表名
(3)删除表:DROPTABLE表名
(4)表添加一列:ALTERTABLE表名ADDCOLUMN列名数据类型限定符
2表数据操作
(1)查:select字段名(或者)from表名where字段名=值
(2)加:insertinto表名(字段1,字段2...)values(值1,值2...)
(3)改:update表名set字段=值where字段=值
(4)删:deletefrom表名where字段=值
SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就足够了。它的处理速度比MySQL、PostgreSQL这两款著名的数据库都还快。
SQLite名词解释
2个重要结构体
1sqlite3pdb(数据库句柄,跟文件句柄FILE类似)
2sqlite3_stmtstmt(这个相当于ODBC的Command对象,用于保存编译好的SQL语句)
5个主要函数
1sqlite3_open()(打开数据库)
2sqlite3_exec()(执行非查询的sql语句)
3sqlite3_prepare()(准备sql语句,执行select语句或者要使用parameterbind时,用这个函数(封装了sqlite3_exec))
4Sqlite3_step()(在调用sqlite3_prepare后,使用这个函数在记录集中移动)
5Sqlite3_close()(关闭数据库文件)
SQLite存储类
1NULL(值是一个NULL值)
2INTEGER(值是一个带符号的整数,根据值的大小存储在1、2、3、4、6或8字节中)
3REAL(值是一个浮点值,存储为8字节的IEEE浮点数字)
4TEXT(值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)存储)
5BLOB(值是一个blob数据,完全根据它的输入存储)
SQLite常用语句
1、打开数据库sqlite3_open函数
2、预处理SQL语句sqlite3_prepare_v2函数
3、绑定参数sqlite3_bind_text函数
4、执行SQL语句sqlite3_step函数(状态:SQLITE_BUSY-数据库被锁定、SQLITE_DONE-成功执行过程、SQLITE_ROW-返回一行结果、SQLITE_ERROR-运行错误、SQLITE_MISUSE-错误的使用了本函数)
5、提取字段数据sqlite3_column_text、sqlite3_column_blob、sqlite3_column_int等函数
6、释放statement对象资源sqlite3_finalize函数
7、关闭数据库sqlite3_close函数
SQLite的使用
在iOS中使用SQLite时,首先需要添加库文件libsqlite3.tbd
3、数据库操作(注:设置数据库名称及路径)
示例代码:
设置数据库路径
[objc]viewplaincopy在CODE上查看代码片派生到我的代码片
-(void)setSQLitePath
{
if(self.filePath==nil)
{
//document目录下
NSArraydocumentArray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSStringdocument=[documentArrayobjectAtIndex:0];
_filePath=[documentstringByAppendingPathComponent:SQLiteFile];
}
NSLog(@"filePath%@",_filePath);
}
打开数据库,创建表
[objc]viewplaincopy在CODE上查看代码片派生到我的代码片
-(void)New
{
NSStringsql=@"CREATETABLEIFNOTEXISTSSTUDENT(NAMETEXTPRIMARYKEY,ADDRESSTEXT,PHONETEXT)";
if(sql&&0!=sql.length)
{
[selfsetSQLitePath];
if([[NSFileManagerdefaultManager]fileExistsAtPath:self.filePath])
{
//打开数据库
sqlite3dataBase;//sqlite3
constcharcharfileName=[self.filePathUTF8String];//[xxxUTF8String]是将NSString转换为C字符串,因为SQLite3是采用可移植的C(而不是Objective-C)编写的,它不知道什么是NSString.
intopenStatus=sqlite3_open(fileName,&dataBase);
if(openStatus!=SQLITE_OK)
{
//数据库打开失败,关闭数据库
sqlite3_close(dataBase);
NSAssert(0,@"打开数据库失败");
NSLog(@"打开数据库失败");
}
NSLog(@"打开数据库成功");
//创建表
charcharerrorMsg;
constcharcharexecSql=[sqlUTF8String];
intexecStatus=sqlite3_exec(dataBase,execSql,NULL,NULL,&errorMsg);
if(execStatus!=SQLITE_OK)
{
//创建表失败,关闭数据库
sqlite3_close(dataBase);
NSAssert1(0,@"创建表失败:%s",errorMsg);
}
NSLog(@"创建表成功");
}
}
}
插入数据
[objc]viewplaincopy在CODE上查看代码片派生到我的代码片
-(void)Insert
{
//?号表示一个未定的值
NSStringsql=@"INSERTORREPLACEINTOSTUDENT(NAME,ADDRESS,PHONE)VALUES(?,?,?)";
if(sql&&0!=sql.length)
{
[selfsetSQLitePath];
if([[NSFileManagerdefaultManager]fileExistsAtPath:self.filePath])
{
//打开数据库
sqlite3dataBase;//sqlite3
constcharcharfileName=[self.filePathUTF8String];
intopenStatus=sqlite3_open(fileName,&dataBase);
if(openStatus!=SQLITE_OK)
{
//数据库打开失败,关闭数据库
sqlite3_close(dataBase);
NSAssert(0,@"打开数据库失败");
NSLog(@"打开数据库失败");
}
NSLog(@"打开数据库成功");
constcharcharexecSql=[sqlUTF8String];
sqlite3_stmtstatment;
intexecStatus=sqlite3_prepare_v2(dataBase,execSql,-1,&statment,nil);//接口把一条SQL语句解析到statement结构里去.使用该接口访问数据库是当前比较好的的一种方法
if(execStatus==SQLITE_OK)
{
NSLog(@"插入更新表成功");
//绑定参数开始
//这里的数字1,2,3代表上面的第几个问号,这里将三个值绑定到三个绑定变量
sqlite3_bind_text(statment,1,[@"zhangshaoyu"UTF8String],-1,NULL);
sqlite3_bind_text(statment,2,[@"meizhou"UTF8String],-1,NULL);
sqlite3_bind_text(statment,3,[@"13800138000"UTF8String],-1,NULL);
//执行SQL语句执行插入
if(sqlite3_step(statment)!=SQLITE_DONE)
{
NSAssert(NO,@"插入更新表失败。");
}
else
{
NSLog(@"插入更新表成功");
}
}
else
{
NSLog(@"插入更新表失败");
}
//释放sqlite3_stmt对象资源
sqlite3_finalize(statment);
//关闭数据库
sqlite3_close(dataBase);
}
}
}
修改更新数据
[objc]viewplaincopy在CODE上查看代码片派生到我的代码片
-(void)Update
{
NSStringsql=@"UPDATESTUDENTSETADDRESS=?whereNAME=?";
if(sql&&0!=sql.length)
{
[selfsetSQLitePath];
if([[NSFileManagerdefaultManager]fileExistsAtPath:self.filePath])
{
//打开数据库
sqlite3dataBase;//sqlite3
constcharcharfileName=[self.filePathUTF8String];
intopenStatus=sqlite3_open(fileName,&dataBase);
if(openStatus!=SQLITE_OK)
{
//数据库打开失败,关闭数据库
sqlite3_close(dataBase);
NSAssert(0,@"打开数据库失败");
NSLog(@"打开数据库失败");
}
NSLog(@"打开数据库成功");
constcharcharexecSql=[sqlUTF8String];
sqlite3_stmtstatment;
intexecStatus=sqlite3_prepare_v2(dataBase,execSql,-1,&statment,nil);
if(execStatus==SQLITE_OK)
{
NSLog(@"更新表成功");
//绑定text类型的数据库数据
//这里的数字1,2,3代表第几个问号。这里只有1个问号,这是一个相对比较简单的数据库操作,真正的项目中会远远比这个复杂
sqlite3_bind_text(statment,1,[@"meizhouWUHUA"UTF8String],-1,NULL);
sqlite3_bind_text(statment,2,[@"zhangshaoyu"UTF8String],-1,NULL);
//执行插入
if(sqlite3_step(statment)!=SQLITE_DONE)
{
NSAssert(NO,@"更新表失败。");
}
else
{
NSLog(@"更新表成功");
}
}
else
{
NSLog(@"更新表失败");
}
//释放sqlite3_stmt对象资源
sqlite3_finalize(statment);
//关闭数据库
sqlite3_close(dataBase);
}
}
}
查找数据
[objc]viewplaincopy在CODE上查看代码片派生到我的代码片
-(void)Select
{
NSStringsql=@"SELECTFROMSTUDENT";
if(sql&&0!=sql.length)
{
[selfsetSQLitePath];
if([[NSFileManagerdefaultManager]fileExistsAtPath:self.filePath])
{
//打开数据库
sqlite3dataBase;//sqlite3
constcharcharfileName=[self.filePathUTF8String];
intopenStatus=sqlite3_open(fileName,&dataBase);
if(openStatus!=SQLITE_OK)
{
//数据库打开失败,关闭数据库
sqlite3_close(dataBase);
NSAssert(0,@"打开数据库失败");
NSLog(@"打开数据库失败");
}
NSLog(@"打开数据库成功");
constcharcharexecSql=[sqlUTF8String];
sqlite3_stmtstatment;
intexecStatus=sqlite3_prepare_v2(dataBase,execSql,-1,&statment,nil);
if(execStatus==SQLITE_OK)
{
NSLog(@"查询成功");
//查询成功,执行遍历操作
//查询结果集中一条一条的遍历所有的记录,这里的数字对应的是列值,注意这里的列值,跟上面sqlite3_bind_text绑定的列值不一样!一定要分开,不然会crash,只有这一处的列号不同,注意!
while(sqlite3_step(statment)==SQLITE_ROW)
{
constcharcharNAME=(char)sqlite3_column_text(statment,0);
if(NAME!=NULL)
{
NSStringname=[[NSStringalloc]initWithUTF8String:NAME];
NSLog(@"NAME%@",name);
}
charcharADDRESS=(char)sqlite3_column_text(statment,1);
if(ADDRESS!=NULL)
{
NSStringaddress=[[NSStringalloc]initWithUTF8String:ADDRESS];
NSLog(@"ADDRESS%@",address);
}
charcharPHONE=(char)sqlite3_column_text(statment,2);
if(PHONE!=NULL)
{
NSStringphone=[[NSStringalloc]initWithUTF8String:PHONE];
NSLog(@"PHONE%@",phone);
}
}
}
else
{
NSLog(@"查询失败");
}
//释放sqlite3_stmt对象资源
sqlite3_finalize(statment);
//关闭数据库
sqlite3_close(dataBase);
}
}
}
删除数据
[objc]viewplaincopy在CODE上查看代码片派生到我的代码片
-(void)Delete
{
//NSStringsql=@"DELETEFROMSTUDENT";//方法1
NSStringsql=@"DELETEFROMSTUDENTwhereNAME=?";//方法2
if(sql&&0!=sql.length)
{
[selfsetSQLitePath];
if([[NSFileManagerdefaultManager]fileExistsAtPath:self.filePath])
{
//打开数据库
sqlite3dataBase;//sqlite3
constcharcharfileName=[self.filePathUTF8String];
intopenStatus=sqlite3_open(fileName,&dataBase);
if(openStatus!=SQLITE_OK)
{
//数据库打开失败,关闭数据库
sqlite3_close(dataBase);
NSAssert(0,@"打开数据库失败");
NSLog(@"打开数据库失败");
}
NSLog(@"打开数据库成功");
constcharcharexecSql=[sqlUTF8String];
sqlite3_stmtstawww.shanxiwang.nettment;
intexecStatus=sqlite3_prepare_v2(dataBase,execSql,-1,&statment,nil);
if(execStatus==SQLITE_OK)
{
//绑定text类型的数据库数据
//这里的数字1,2,3代表第几个问号。这里只有1个问号,这是一个相对比较简单的数据库操作,真正的项目中会远远比这个复杂
sqlite3_bind_text(statment,1,[@"zhangshaoyu"UTF8String],-1,NULL);
//执行删除
if(sqlite3_step(statment)!=SQLITE_DONE)
{
NSAssert(NO,@"删除数据失败。");
NSLog(@"删除数据失败");
}
else
{
NSLog(@"删除数据成功");
}
}
else
{
NSLog(@"删除数据失败");
}
//释放sqlite3_stmt对象资源
sqlite3_finalize(statment);
//关闭数据库
sqlite3_close(dataBase);
}
}
}
删除表
[objc]viewplaincopy在CODE上查看代码片派生到我的代码片
-(void)DeleteTable
{
NSStringsql=@"DROPTABLESTUDENT";
if(sql&&0!=sql.length)
{
[selfsetSQLitePath];
if([[NSFileManagerdefaultManager]fileExistsAtPath:self.filePath])
{
//打开数据库
sqlite3dataBase;//sqlite3
constcharcharfileName=[self.filePathUTF8String];
intopenStatus=sqlite3_open(fileName,&dataBase);
if(openStatus!=SQLITE_OK)
{
//数据库打开失败,关闭数据库
sqlite3_close(dataBase);
NSAssert(0,@"打开数据库失败");
NSLog(@"打开数据库失败");
}
NSLog(@"打开数据库成功");
constcharcharexecSql=[sqlUTF8String];
sqlite3_stmtstatment;
intexecStatus=sqlite3_prepare_v2(dataBase,execSql,-1,&statment,nil);
if(execStatus==SQLITE_OK)
{
//执行删除
if(sqlite3_step(statment)!=SQLITE_DONE)
{
NSAssert(NO,@"删除表失败。");
NSLog(@"删除表失败");
}
else
{
NSLog(@"删除表成功");
}
}
else
{
NSLog(@"删除表失败");
}
//释放sqlite3_stmt对象资源
sqlite3_finalize(statment);
//关闭数据库
sqlite3_close(dataBase);
}
}
}
数据查看
|
|