写了一个比较简单的sqlite3的简单demo只实现了增加 更新 删除 获取全部数据 查找 数据库部分有详细注释 界面也比较简陋主要是实现一下数据库部分
资源地址:http://download.csdn.net/detail/decemberd/3899232
部分代码如下:
- (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语句当成以\0结尾的字符串)。
//第四个参数是sqlite3_stmt的指针的指针。解析以后的sql语句就放在这个结构里。
//第五个参数我也不知道是干什么的。为nil就可以了。
//如果这个函数执行成功(返回值是sqlITE_OK且statement不为NULL),那么下面就可以开始插入二进制数据。
//如果sql语句解析出错的话程序返回
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;
}
//这里的数字1,2,3代表第几个问号,这里将两个值绑定到两个绑定变量
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 = ?";
intsuccess =sqlite3_prepare_v2(_database,NULL);
if(success !=sqlITE_OK) {
NSLog(@"Error: Failed to update:testTable");
sqlite3_close(_database);
returnNO;
}
//这里的数字1,2,3代表第几个问号。这里只有1个问号,这是一个相对比较简单的数据库操作,真正的项目中会远远比这个复杂
//当掌握了原理后就不害怕复杂了
sqlite3_bind_text(statement,[updateList.sqlTextUTF8String],sqlITE_TRANSIENT);
sqlite3_bind_int(statement,updateList.sqlID);
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 = ?";
intsuccess =sqlite3_prepare_v2(_database,NULL);
if(success !=sqlITE_OK) {
NSLog(@"Error: Failed to delete:testTable");
sqlite3_close(_database);
returnNO;
}
//这里的数字1,2,3代表第几个问号。这里只有1个问号,这是一个相对比较简单的数据库操作,真正的项目中会远远比这个复杂
//当掌握了原理后就不害怕复杂了
sqlite3_bind_int(statement,deletList.sqlID);
sqlite3_bind_text(statement,[deletList.sqlTextUTF8String],sqlITE_TRANSIENT);
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];
}