配色: 字号:
数据缓存——SQLite关系型数据库的使用
2016-11-10 | 阅:  转:  |  分享 
  
数据缓存——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);

}

}

}







数据查看







献花(0)
+1
(本文系网络学习天...首藏)