加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

一个SQLite3的小例子

发布时间:2020-12-13 00:16:46 所属栏目:百科 来源:网络整理
导读:写了一个比较简单的SQLite3的简单demo只实现了增加 更新 删除 获取全部数据 查找 数据库部分有详细注释 界面也比较简陋主要是实现一下数据库部分 资源地址:http://download.csdn.net/detail/decemberd/3899232 部分代码如下: // 获取 document 目录并返回

写了一个比较简单的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语句当成以结尾的字符串)。

//第四个参数是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];

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读