ios中sqlite的使用.docx
- 文档编号:10605242
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:17
- 大小:19.62KB
ios中sqlite的使用.docx
《ios中sqlite的使用.docx》由会员分享,可在线阅读,更多相关《ios中sqlite的使用.docx(17页珍藏版)》请在冰豆网上搜索。
ios中sqlite的使用
Phone中支持通过sqlite3来访问iPhone本地的数据库。
具体使用方法如下
1:
添加开发包libsqlite3.0.dylib
首先是设置项目文件,在项目中添加iPhone版的sqlite3的数据库的开发包,在项目下的Frameworks点击右键,然后选择libsqlite3.0.dylib文件(如下图)。
。
。
。
libsqlite3.0.dylib文件地址:
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/usr/lib/libsqlite3.0.dylib
2,代码中的操作:
那么接下来是代码了。
1首先获取iPhone上sqlite3的数据库文件的地址
NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documentsDirectory=[pathsobjectAtIndex:
0];
NSString*path=[documentsDirectorystringByAppendingPathComponent:
@"database_name"];
2打开iPhone上的sqlite3的数据库文件
sqlite3*database;
sqlite3_open([pathUTF8String],&database);
3准备sql文---sql语句
sqlite3_stmt*stmt;
constchar*sql="SELECT*FROMtable_nameWHEREpk=?
andname=?
";
sqlite3_prepare_v2(database,sql,-1,&stmt,NULL);
4邦定参数
//邦定第一个int参数
sqlite3_bind_int(stmt,1,1);
//邦定第二个字符串参数
sqlite3_bind_text(stmt,2,[titleUTF8String],-1,SQLITE_TRANSIENT);
5执行sql文
sqlite3_step(stmt);
6释放sql文资源
sqlite3_finalize(stmt);
7关闭iPhone上的sqlite3的数据库
sqlite3_close(database);
以下演示一下使用sqlite的步骤,先创建一个数据库,然后查询其中的内容。
2个重要结构体和5个主要函数:
sqlite3*pdb,数据库句柄,跟文件句柄FILE很类似
sqlite3_stmt*stmt,这个相当于ODBC的Command对象,用于保存编译好的SQL语句
sqlite3_open(),打开数据库
sqlite3_exec(),执行非查询的sql语句
sqlite3_prepare(),准备sql语句,执行select语句或者要使用parameterbind时,用这个函数(封装了sqlite3_exec).
Sqlite3_step(),在调用sqlite3_prepare后,使用这个函数在记录集中移动。
Sqlite3_close(),关闭数据库文件
还有一系列的函数,用于从记录集字段中获取数据,如
sqlite3_column_text(),取text类型的数据。
sqlite3_column_blob(),取blob类型的数据
sqlite3_column_int(),取int类型的数据
PreparedStatement方式处理SQL请求的过程
特点:
可以绑定参数,生成过程。
执行的时候像是ADO一样,每次返回一行结果。
1.首先建立statement对象:
intsqlite3_prepare(
sqlite3*db,/*Databasehandle*/
constchar*zSql,/*SQLstatement,UTF-8encoded*/
intnBytes,/*LengthofzSqlinbytes.*/
sqlite3_stmt**ppStmt,/*OUT:
Statementhandle*/
constchar**pzTail/*OUT:
PointertounusedportionofzSql*/
);
2.绑定过程中的参数(如果有没有确定的参数)
intsqlite3_bind_xxxx(sqlite3_stmt*,int,...);
第二个int类型参数-表示参数的在SQL中的序号(从1开始)。
第三个参数为要绑定参数的值。
对于blob和text数值的额外参数:
第四参数是字符串(Unicode8or16)的长度,不包括结束'\0'。
第五个参数,类型为void(*)(void*),表示SQLite处理结束后用于清理参数字符串的函数。
没有进行绑定的未知参数将被认为是NULL。
3.执行过程
intsqlite3_step(sqlite3_stmt*);
可能的返回值:
*SQLITE_BUSY:
数据库被锁定,需要等待再次尝试直到成功。
*SQLITE_DONE:
成功执行过程(需要再次执行一遍以恢复数据库状态)
*SQLITE_ROW:
返回一行结果(使用sqlite3_column_xxx(sqlite3_stmt*,,intiCol)得到每一列的结果。
再次调用将返回下一行的结果。
*SQLITE_ERROR:
运行错误,过程无法再次调用(错误内容参考sqlite3_errmsg函数返回值)
*SQLITE_MISUSE:
错误的使用了本函数(一般是过程没有正确的初始化)
4.结束的时候清理statement对象
intsqlite3_finalize(sqlite3_stmt*pStmt);
应该在关闭数据库之前清理过程中占用的资源。
5.重置过程的执行
intsqlite3_reset(sqlite3_stmt*pStmt);
过程将回到没有执行之前的状态,绑定的参数不会变化。
其他工具函数
1.得到结果总共的行数
intsqlite3_column_count(sqlite3_stmt*pStmt);
如果过程没有返回值,如update,将返回0
2.得到当前行中包含的数据个数
intsqlite3_data_count(sqlite3_stmt*pStmt);
如果sqlite3_step返回SQLITE_ROW,可以得到列数,否则为零。
3.得到数据行中某个列的数据
sqlite3_column_xxx(sqlite3_stmt*,intiCol);
在sqlite3_step返回SQLITE_ROW后,使用它得到第iCol列的数据。
其中的xxx代表:
blob:
指向保存数据内存的指针
bytes,bytes16:
得到该blob类型数据的大小,或者text转换为UTF8/UTF16的字符串长度。
double,int,int64:
数值
text,text16:
字符串指针
type:
该列的数据类型(SQLITE_INTEGER,SQLITE_FLOAT,SQLITE_TEXT,SQLITE_BLOB,SQLITE_NULL)
注意:
如果对该列使用了不同与该列本身类型适合的数据读取方法,得到的数值将是转换过的结果。
4.得到数据行中某个列的数据的类型
intsqlite3_column_type(sqlite3_stmt*,intiCol);
返回值:
SQLITE_INTEGER,SQLITE_FLOAT,SQLITE_TEXT,SQLITE_BLOB,SQLITE_NULL
使用的方法和sqlite3_column_xxx()函数类似。
Ios中SQLite3.0的简单应用。
。
2011-12-2115:
22107人阅读评论(0)收藏举报
这两天终于把Sqlite数据库在iPhone中的应用搞懂了。
。
还是那些增删改查,却没有存储过程之类的,数据类型也少了。
为了初始化数据,自己感觉有两种方案可以执行,都可以使数据初始化一次:
一种是使用主键约束(sidintegerPRIMARYKEY),一种是在AppDelegate文件中初始化。
这样我自己感觉可以仅调用一次数据信息。
下面是iPhone程序中使用的部分代码信息:
第一部分:
用于检测该信息中是否已存在mydatabase.sql数据库信息,若存在则直接打开,若不存在则新建本数据库文件,然后在打开该数据库文件。
-(BOOL)open{
//获取路径数组
NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
//获取路径数组中第一个信息
NSString*documentsDirectory=[pathsobjectAtIndex:
0];
//选择创建的文件信息
NSString*path=[documentsDirectorystringByAppendingPathComponent:
@"mydatabase.sql"];
NSFileManager*fileManager=[NSFileManagerdefaultManager];
BOOLfind=[fileManagerfileExistsAtPath:
path];
if(find){
if(sqlite3_open([pathUTF8String],&database)!
=SQLITE_OK){
sqlite3_close(database);
NSLog(@"Sorror,OpeningdbfileError"); //使用NSLog用于显示错误状态
return NO;
}
returnYES;
}
else{
sqlite3_close(database);
NSLog(@"Sorror,OpeningdbfileError,andNotLinkDb");
returnNO;
}
}
第二部分:
创建表,可以由用户设置主键和SQLServer一样也可以设置自动增长信息。
//创建学生表信息
-(BOOL)CreateTableStudent:
(sqlite3*)db{
char*errorMsg;
// 本信息是用于删除表
// NSLog(@"firstDeletetabel");
// NSString*DeleteTable=@"droptablestudent";
//
// if(sqlite3_exec(db,[DeleteTableUTF8String],NULL,NULL,&errorMsg)==SQLITE_OK){
// //sqlite3_close(db);
// //NSAssert1(0,@"Errorcreatingtable:
%s",errorMsg);
// NSLog(@"delecttable------------------------");
// }
// NSLog(@"delecttable");
//表中设置主键可消除重复添加
NSString*createSql=@"Createtableifnotexistsstudent(sidintegerPRIMARYKEYautoincrement,nametext,sextext,ageinteger)";
// 在Sqlite中不可以直接使用字符串信息,必须使用UTF8String进行数据格式转化,但是至今不明白为什么
// 这样做
if(sqlite3_exec(db,[createSqlUTF8String],NULL,NULL,&errorMsg)!
=SQLITE_OK){
sqlite3_close(db);
NSAssert1(0,@"Errorcreatingtable:
%s",errorMsg);
}
NSLog(@"studentTableiscreatedsuccessfuly"); //显示创建成功
returnYES;
}
第三部:
初始化数据信息(增加数据信息),数据参数是从1开始的,values(?
?
?
?
)使用问号作为占位符,占位符的信息是从1开始计数的,这与查找是得Where语句后面的参数形式不是一致。
//学生表中初始化数据信息
-(void)InsertIntoStudentTable:
(sqlite3*)database{
char*insert="insertorreplaceintostudent(sid,name,sex,age)values(?
?
?
?
);";
sqlite3_stmt*stmt;
intcount=0; //用于计数,可以观察到数据信息插入的情况
if(sqlite3_prepare_v2(database,insert,-1,&stmt,nil)==SQLITE_OK){
sqlite3_bind_int(stmt,1,1);
sqlite3_bind_text(stmt,2,[@"zhixuan"UTF8String],-1,NULL);
sqlite3_bind_text(stmt,3,[@"F"UTF8String],-1,NULL);
sqlite3_bind_int(stmt,4,23);
count=count+1; //用于计数,可以观察到数据信息插入的情况
}
if(sqlite3_step(stmt)!
=SQLITE_DONE){
NSLog(@"inserterror.....");
}
if(sqlite3_prepare_v2(database,insert,-1,&stmt,nil)==SQLITE_OK){
sqlite3_bind_int(stmt,1,2);
sqlite3_bind_text(stmt,2,[@"liyan"UTF8String],-1,NULL);
sqlite3_bind_text(stmt,3,[@"M"UTF8String],-1,NULL);
sqlite3_bind_int(stmt,4,23);
count=count+1; //用于计数,可以观察到数据信息插入的情况
}
if(sqlite3_step(stmt)!
=SQLITE_DONE){
NSLog(@"inserterror.....");
}
if(sqlite3_prepare_v2(database,insert,-1,&stmt,nil)==SQLITE_OK){
sqlite3_bind_int(stmt,1,3);
sqlite3_bind_text(stmt,2,[@"zhangzhixuan"UTF8String],-1,NULL);
sqlite3_bind_text(stmt,3,[@"F"UTF8String],-1,NULL);
sqlite3_bind_int(stmt,4,23);
count=count+1;
}
if(sqlite3_step(stmt)!
=SQLITE_DONE){
NSLog(@"inserterror.....");
}
if(sqlite3_prepare_v2(database,insert,-1,&stmt,nil)==SQLITE_OK){
sqlite3_bind_int(stmt,1,4);
sqlite3_bind_text(stmt,2,[@"zhangliguang"UTF8String],-1,NULL);
sqlite3_bind_text(stmt,3,[@"F"UTF8String],-1,NULL);
sqlite3_bind_int(stmt,4,21);
count=count+1; //用于计数,可以观察到数据信息插入的情况
}
if(sqlite3_step(stmt)!
=SQLITE_DONE){
NSLog(@"inserterror.....");
}
if(sqlite3_prepare_v2(database,insert,-1,&stmt,nil)==SQLITE_OK){
sqlite3_bind_int(stmt,1,5);
sqlite3_bind_text(stmt,2,[@"liyanfen"UTF8String],-1,NULL);
sqlite3_bind_text(stmt,3,[@"M"UTF8String],-1,NULL);
sqlite3_bind_int(stmt,4,19);
count=count+1; //用于计数,可以观察到数据信息插入的情况
}
if(sqlite3_step(stmt)!
=SQLITE_DONE){
NSLog(@"inserterror.....");
}
if(sqlite3_prepare_v2(database,insert,-1,&stmt,nil)==SQLITE_OK){
sqlite3_bind_int(stmt,1,6);
sqlite3_bind_text(stmt,2,[@"zhangsan"UTF8String],-1,NULL);
sqlite3_bind_text(stmt,3,[@"F"UTF8String],-1,NULL);
sqlite3_bind_int(stmt,4,23);
count=count+1; //用于计数,可以观察到数据信息插入的情况
}
if(sqlite3_step(stmt)!
=SQLITE_DONE){
NSLog(@"inserterror.....");
}
if(sqlite3_prepare_v2(database,insert,-1,&stmt,nil)==SQLITE_OK){
sqlite3_bind_int(stmt,1,7);
sqlite3_bind_text(stmt,2,[@"wanggang"UTF8String],-1,NULL);
sqlite3_bind_text(stmt,3,[@"F"UTF8String],-1,NULL);
sqlite3_bind_int(stmt,4,23);
count=count+1; //用于计数,可以观察到数据信息插入的情况
}
if(sqlite3_step(stmt)!
=SQLITE_DONE){
NSLog(@"inserterror.....");
}
if(sqlite3_prepare_v2(database,insert,-1,&stmt,nil)==SQLITE_OK){
sqlite3_bind_int(stmt,1,8);
sqlite3_bind_text(stmt,2,[@"lisi"UTF8String],-1,NULL);
sqlite3_bind_text(stmt,3,[@"M"UTF8String],-1,NULL);
sqlite3_bind_int(stmt,4,25);
count=count+1; //用于计数,可以观察到数据信息插入的情况
}
if(sqlite3_step(stmt)!
=SQLITE_DONE){
NSLog(@"inserterror.....");
}
if(sqlite3_prepare_v2(database,insert,-1,&stmt,nil)==SQLITE_OK){
sqlite3_bind_int(stmt,1,9);
sqlite3_bind_text(stmt,2,[@"yanhua"UTF8String],-1,NULL);
sqlite3_bind_text(stmt,3,[@"M"UTF8String],-1,NULL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ios sqlite 使用