写了一个比较简单的sqlite3的简单demo只实现了增加 更新 删除 获取全部数据 查找 数据库部分有详细注释 界面也比较简陋主要是实现一下数据库部分
资源地址:http://download.csdn.net/detail/decemberd/3899232
部分代码如下:
//获取document目录并返回数据库目录
- (Nsstring*)datafilePath{
NSArray*paths =NSSearchPathForDirectorIEsInDomains(NSdocumentDirectory,NSUserDomainMask,YES);
Nsstring*documentsDirectory = [pathsobjectAtIndex:0];
return[documentsDirectorystringByAppendingPathComponent:kfilename];
}
//创建,打开数据库
- (BOol)openDB {
//获取数据库路径
Nsstring*path = [selfdatafilePath];
//文件管理器
NSfileManager*fileManager = [NSfileManagerdefaultManager];
//判断数据库是否存在
BOolfind = [fileManagerfileExistsAtPath:path];
//如果数据库存在,则用sqlite3_open直接打开(不要担心,如果数据库不存在sqlite3_open会自动创建)
if(find) {
NSLog(@"Database file have already existed.");
//打开数据库,这里的[path UTF8String]是将Nsstring转换为C字符串,因为sqlite3是采用可移植的C(而不是
//Objective-C)编写的,它不知道什么是Nsstring.
if(sqlite3_open([pathUTF8String],&_database) !=sqlITE_OK) {
//如果打开数据库失败则关闭数据库
sqlite3_close(self._database);
NSLog(@"Error: open database file.");
returnNO;
}
//创建一个新表
[selfcreateTestList:self._database];
returnYES;
}
//如果发现数据库不存在则利用sqlite3_open创建数据库(上面已经提到过),与上面相同,路径要转换为C字符串
if(sqlite3_open([pathUTF8String],&_database) ==sqlITE_OK) {
//创建一个新表
[selfcreateTestList:self._database];
returnYES;
}else{
//如果创建并打开数据库失败则关闭数据库
sqlite3_close(self._database);
NSLog(@"Error: open database file.");
returnNO;
}
returnNO;
}
//创建表
- (BOol) createTestList:(sqlite3*)db {
//这句是大家熟悉的sql语句
char*sql ="create table if not exists testtable(ID INTEGER PRIMARY KEY autoINCREMENT,testID int,testValue text)";
sqlite3_stmt*statement;
//sqlite3_prepare_v2接口把一条sql语句解析到statement结构里去.使用该接口访问数据库是当前比较好的的一种方法
NSIntegersqlReturn =sqlite3_prepare_v2(_database,sql,-1,&statement,nil);
//第一个参数跟前面一样,是个sqlite3 *类型变量,
//第二个参数是一个sql语句。
//第三个参数我写的是-1,这个参数含义是前面sql语句的长度。如果小于0,sqlite会自动计算它的长度(把sql语句当成以结尾的字符串)。
//sqlite3_stmt第四个参数是sql的指针的指针。解析以后的语句就放在这个结构里。
//nil第五个参数我也不知道是干什么的。为就可以了。
//sqlITE_OK如果这个函数执行成功(返回值是statement且NulL不为),那么下面就可以开始插入二进制数据。
//sql如果语句解析出错的话程序返回
ifsqlITE_OK(sqlReturn !=) {
NSLog();@"Error: Failed to prepare statement:create test table"
return;NO
}
执行//语句sql
intsqlite3_stepsuccess =(statement);
释放//sqlite3_stmt
(statement);sqlite3_finalize
执行//语句失败sql
ifsqlITE_DONE( success !=) {
NSLog();@"Error: Failed to dehydrate:create table test"
return;NO
}
NSLog();@"Create table 'testtable' successed."
return;YES//
}
BOol插入数据
-(sqlTestList) insertTestList:(*)insertList {
//先判断数据库是否打开
ifself([openDB]) {
sqlite3_stmt*statement;
//sql这个values语句特别之处在于?里面有个sqlite3_prepare号。在?函数里,号表示一个未定的值,它的值等下才插入。
staticchar*sql =;"INSERT INTO testtable(testID,testValue) VALUES(?,?)"
intsqlite3_prepare_v2success2 =_database(NulL,);
ifsqlITE_OK(success2 !=) {
NSLog();@"Error: Failed to insert:testtable"
(sqlite3_close_database);
return;NO
}
//1这里的数字2,3,代表第几个问号,这里将两个值绑定到两个绑定变量
sqlite3_bind_int1(statement,sqlID,insertList.);
sqlite3_bind_text2(statement,sqlText,[insertList.UTF8StringsqlITE_TRANSIENT],);
//执行插入语句
sqlite3_stepsuccess2 =(statement);
释放//statement
(statement);sqlite3_finalize
//如果插入失败
ifsqlITE_ERROR(success2 ==) {
NSLog();@"Error: Failed to insert into the database with message."
关闭数据库//
(sqlite3_close_database);
return;NO
}
//关闭数据库
(sqlite3_close_database);
return;YES
}
return;NO//
}
NSMutableArray获取数据
- (*)getTestList{
*array = [NSMutableArrayNSMutableArrayarrayWithCapacity:10];
//判断数据库是否打开
ifself([openDB]) {
sqlite3_stmtnil*statement =;
语句//sql
char*sql =;"SELECT testID,testValue FROM testtable"
ifsqlite3_prepare_v2(_database(NulL,sqlITE_OK) !=) {
NSLog();@"Error: Failed to prepare statement with message:get testValue."
return;NO
}
else{
//查询结果集中一条一条的遍历所有的记录,这里的数字对应的是列值。
whilesqlite3_step(sqlITE_ROW(statement) ==) {
sqlTestListsqlTestList* sqlList = [[allocinit]] ;
sqlIDsqlList.sqlite3_column_int =0(statement,);
charchar* strText = (sqlite3_column_text*)1(statement,);
sqlTextsqlList.Nsstring= [stringWithUTF8Stringaddobject:strText];
[array:sqlList];
release[sqlList];
}
}
(statement);sqlite3_finalize
(sqlite3_close_database);
}
returnretain[array//];
}
BOol更新数据
-(sqlTestList) updateTestList:(*)updateList{
ifself([openDB]) {
//我想下面几行已经不需要我讲解了,嘎嘎
sqlite3_stmt*statement;
组织//语句sql
char*sql =;"update testtable set testValue = ? WHERE testID = ?"
将//语句放入sql中sqlite3_stmt
intsqlite3_prepare_v2success =_database(NulL,);
ifsqlITE_OK(success !=) {
NSLog();@"Error: Failed to update:testtable"
(sqlite3_close_database);
return;NO
}
//1这里的数字2,3,1代表第几个问号。这里只有个问号,这是一个相对比较简单的数据库 *** 作,真正的项目中会远远比这个复杂
//当掌握了原理后就不害怕复杂了
sqlite3_bind_textsqlText(statement,[updateList.UTF8StringsqlITE_TRANSIENT],);
sqlite3_bind_intsqlID(statement,updateList.);
//sql执行语句。这里是更新数据库
sqlite3_stepsuccess =(statement);
释放//statement
(statement);sqlite3_finalize
//如果执行失败
ifsqlITE_ERROR(success ==) {
NSLog();@"Error: Failed to update the database with message."
关闭数据库//
(sqlite3_close_database);
return;NO
}
//执行成功后依然要关闭数据库
(sqlite3_close_database);
return;YES
}
return;NO//
}
BOol删除数据
- (sqlTestList) deleteTestList:(*)deletList{
ifself([openDB]) {
sqlite3_stmt*statement;
组织//语句sql
staticchar*sql =;"delete from testtable where testID = ? and testValue = ?"
将//语句放入sql中sqlite3_stmt
intsqlite3_prepare_v2success =_database(NulL,);
ifsqlITE_OK(success !=) {
NSLog();@"Error: Failed to delete:testtable"
(sqlite3_close_database);
return;NO
}
//1这里的数字2,3,1代表第几个问号。这里只有个问号,这是一个相对比较简单的数据库 *** 作,真正的项目中会远远比这个复杂
//当掌握了原理后就不害怕复杂了
sqlite3_bind_intsqlID(statement,deletList.);
sqlite3_bind_textsqlText(statement,[deletList.UTF8StringsqlITE_TRANSIENT],);
//sql执行语句。这里是更新数据库
sqlite3_stepsuccess =(statement);
释放//statement
(statement);sqlite3_finalize
//如果执行失败
ifsqlITE_ERROR(success ==) {
NSLog();@"Error: Failed to delete the database with message."
关闭数据库//
(sqlite3_close_database);
return;NO
}
//执行成功后依然要关闭数据库
(sqlite3_close_database);
return;YES
}
return;NO
//
}
NSMutableArray查询数据
- (int*)searchTestList:()searchID{
*array = [NSMutableArrayNSMutableArrayarrayWithCapacity:10];
//判断数据库是否打开
ifself([openDB]) {
sqlite3_stmtnil*statement =;
语句//sql
char*sql =;"SELECT testID,testValue FROM testtable WHERE testID = ?"
ifsqlite3_prepare_v2(_database(NulL,sqlITE_OK) !=) {
NSLog();@"Error: Failed to prepare statement with message:search testValue."
return;NO
}
else{
sqlite3_bind_int(statement,searchID);
//查询结果集中一条一条的遍历所有的记录,这里的数字对应的是列值。
whilesqlite3_step(sqlITE_ROW(statement) ==) {
sqlTestListsqlTestList* sqlList = [[allocinit]] ;
sqlIDsqlList.sqlite3_column_int =1(statement,);
sqlTextsqlList.Nsstring= [stringWithUTF8Stringaddobject:strText];
[array:sqlList];
release[sqlList];
}
}
(statement);sqlite3_finalize
(sqlite3_close_database);
}
returnretain[array];
}
总结以上是内存溢出为你收集整理的一个SQLite3的小例子全部内容,希望文章能够帮你解决一个SQLite3的小例子所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)