微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一个SQLite3的小例子

写了一个比较简单的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语句的长度。如果小于0sqlite自动计算它的长度(把sql语句当成以\0结尾的字符串)。

//第四个参数是sqlite3_stmt的指针的指针。解析以后的sql语句就放在这个结构里。

//第五个参数我也不知道是干什么的。为nil就可以了。

//如果这个函数执行成功(返回值是sqlITE_OKstatement不为NULL),那么下面就可以开始插入二进制数据。

//如果sql语句解析出错的话程序返回

if(sqlReturn !=sqlITE_OK) {

NSLog(@"Error: Failed to prepare statement:create test table");

returnNO;

}

//执行sql语句

intsuccess =sqlite3_step(statement);

//释放sqlite3_stmt

sqlite3_finalize(statement);

//执行sql语句失败

if( success !=sqlITE_DONE) {

NSLog(@"Error: Failed to dehydrate:create table test");

returnNO;

}

NSLog(@"Create table 'testTable' successed.");

returnYES;

}


//插入数据

-(BOOL) insertTestList:(sqlTestList*)insertList {

//先判断数据库是否打开

if([selfopenDB]) {

sqlite3_stmt*statement;

//这个sql语句特别之处在于values里面有个?号。在sqlite3_prepare函数里,?号表示一个未定的值,它的值等下才插入。

staticchar*sql ="INSERT INTO testTable(testID,testValue) VALUES(?,?)";

intsuccess2 =sqlite3_prepare_v2(_database,NULL);

if(success2 !=sqlITE_OK) {

NSLog(@"Error: Failed to insert:testTable");

sqlite3_close(_database);

returnNO;

}

//这里的数字123代表第几个问号,这里将两个值绑定到两个绑定变量

sqlite3_bind_int(statement,1,insertList.sqlID);

sqlite3_bind_text(statement,2,[insertList.sqlTextUTF8String],sqlITE_TRANSIENT);


//执行插入语句

success2 =sqlite3_step(statement);

//释放statement

sqlite3_finalize(statement);

//如果插入失败

if(success2 ==sqlITE_ERROR) {

NSLog(@"Error: Failed to insert into the database with message.");

//关闭数据库

sqlite3_close(_database);

returnNO;

}

//关闭数据库

sqlite3_close(_database);

returnYES;

}

returnNO;

}


//获取数据

- (NSMutableArray*)getTestList{

NSMutableArray*array = [NSMutableArrayarrayWithCapacity:10];

//判断数据库是否打开

if([selfopenDB]) {

sqlite3_stmt*statement =nil;

//sql语句

char*sql ="SELECT testID,testValue FROM testTable";

if(sqlite3_prepare_v2(_database,NULL) !=sqlITE_OK) {

NSLog(@"Error: Failed to prepare statement with message:get testValue.");

returnNO;

}

else{

//查询结果集中一条一条的遍历所有的记录,这里的数字对应的是列值。

while(sqlite3_step(statement) ==sqlITE_ROW) {

sqlTestList* sqlList = [[sqlTestListalloc]init] ;

sqlList.sqlID =sqlite3_column_int(statement,0);

char* strText = (char*)sqlite3_column_text(statement,1);

sqlList.sqlText= [NsstringstringWithUTF8String:strText];

[arrayaddobject:sqlList];

[sqlListrelease];

}

}

sqlite3_finalize(statement);

sqlite3_close(_database);

}

return[arrayretain];

}


//更新数据

-(BOOL) updateTestList:(sqlTestList*)updateList{

if([selfopenDB]) {

//我想下面几行已经不需要我讲解了,嘎嘎

sqlite3_stmt*statement;

//组织sql语句

char*sql ="update testTable set testValue = ? WHERE testID = ?";

//sql语句放入sqlite3_stmt

intsuccess =sqlite3_prepare_v2(_database,NULL);

if(success !=sqlITE_OK) {

NSLog(@"Error: Failed to update:testTable");

sqlite3_close(_database);

returnNO;

}

//这里的数字123代表第几个问号。这里只有1个问号,这是一个相对比较简单的数据库操作,真正的项目中会远远比这个复杂

//当掌握了原理后就不害怕复杂了

sqlite3_bind_text(statement,[updateList.sqlTextUTF8String],sqlITE_TRANSIENT);

sqlite3_bind_int(statement,updateList.sqlID);

//执行sql语句。这里是更新数据库

success =sqlite3_step(statement);

//释放statement

sqlite3_finalize(statement);

//如果执行失败

if(success ==sqlITE_ERROR) {

NSLog(@"Error: Failed to update the database with message.");

//关闭数据库

sqlite3_close(_database);

returnNO;

}

//执行成功后依然要关闭数据库

sqlite3_close(_database);

returnYES;

}

returnNO;

}

//删除数据

- (BOOL) deleteTestList:(sqlTestList*)deletList{

if([selfopenDB]) {

sqlite3_stmt*statement;

//组织sql语句

staticchar*sql ="delete from testTable where testID = ? and testValue = ?";

//sql语句放入sqlite3_stmt

intsuccess =sqlite3_prepare_v2(_database,NULL);

if(success !=sqlITE_OK) {

NSLog(@"Error: Failed to delete:testTable");

sqlite3_close(_database);

returnNO;

}

//这里的数字123代表第几个问号。这里只有1个问号,这是一个相对比较简单的数据库操作,真正的项目中会远远比这个复杂

//当掌握了原理后就不害怕复杂了

sqlite3_bind_int(statement,deletList.sqlID);

sqlite3_bind_text(statement,[deletList.sqlTextUTF8String],sqlITE_TRANSIENT);

//执行sql语句。这里是更新数据库

success =sqlite3_step(statement);

//释放statement

sqlite3_finalize(statement);

//如果执行失败

if(success ==sqlITE_ERROR) {

NSLog(@"Error: Failed to delete the database with message.");

//关闭数据库

sqlite3_close(_database);

returnNO;

}

//执行成功后依然要关闭数据库

sqlite3_close(_database);

returnYES;

}

returnNO;

}

//查询数据

- (NSMutableArray*)searchTestList:(int)searchID{

NSMutableArray*array = [NSMutableArrayarrayWithCapacity:10];

//判断数据库是否打开

if([selfopenDB]) {

sqlite3_stmt*statement =nil;

//sql语句

char*sql ="SELECT testID,testValue FROM testTable WHERE testID = ?";

if(sqlite3_prepare_v2(_database,NULL) !=sqlITE_OK) {

NSLog(@"Error: Failed to prepare statement with message:search testValue.");

returnNO;

}

else{

sqlite3_bind_int(statement,searchID);

//查询结果集中一条一条的遍历所有的记录,这里的数字对应的是列值。

while(sqlite3_step(statement) ==sqlITE_ROW) {

sqlTestList* sqlList = [[sqlTestListalloc]init] ;

sqlList.sqlID =sqlite3_column_int(statement,1);

sqlList.sqlText= [NsstringstringWithUTF8String:strText];

[arrayaddobject:sqlList];

[sqlListrelease];

}

}

sqlite3_finalize(statement);

sqlite3_close(_database);

}

return[arrayretain];

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐