sqlite封装
在.h中 #import <Foundation/Foundation.h> #import <sqlite3.h>
@interface DataBase : NSObject
-(void)craeteTable:(NSString *)sql;
//插入数据,修改数据,删除数据 //参数:sql:sql语句 //返回值,是否执行成功 -(BOOL)dealData:(NSString *)sql paramsarray:(NSArray *)parame;
/* 查询数据 参数: sql:SQL语句 返回值[“1”,“2”, “3”] */
-(NSMutableArray *)selectData:(NSString *)sql columns:(int)number;
.m #import "DataBase.h" #define kfileName @"data.sqlite"
@implementation DataBase
-(NSString *)filePath{ NSString *filePath = [NSHomeDirectory()stringByAppendingFormat:@"/Documents/%@",kfileName]; return filePath; }
-(void)craeteTable:(NSString *)sql{ sqlite3 *sqlite =nil;
//打开数据库
if (sqlite3_open([self.filePathUTF8String],&sqlite) != SQLITE_OK) { NSLog(@"打开数据库失败"); } sqlite3_close(sqlite); return;
//创建表 char *errmsg =nil; if (sqlite3_exec(sqlite,[sqlUTF8String],nil,&errmsg) !=SQLITE_OK) { NSLog(@"创建表失败%s",errmsg); } sqlite3_close(sqlite);
}
-(BOOL)dealData:(NSString *)sql paramsarray:(NSArray *)parame{ sqlite3 *sqlite =nil; sqlite3_stmt *stmt =nil; //打开数据库
if (sqlite3_open([self.filePathUTF8String],&sqlite) != SQLITE_OK) { NSLog(@"打开数据库失败"); sqlite3_close(sqlite); returnNO; }
//编译sql语句 if (sqlite3_prepare_v2(sqlite,-1,&stmt,nil)!= SQLITE_OK) { NSLog(@"编译sql语句失败"); sqlite3_close(sqlite); returnNO; } //绑定数据 for (int i =0; i < parame.count ; i++) { NSString *value = [parameobjectAtIndex:i]; sqlite3_bind_text(stmt,i+1,[valueUTF8String],nil); } //执行sql语句 if (sqlite3_step(stmt) ==SQLITE_ERROR) { NSLog(@"sql执行失败"); sqlite3_close(sqlite); returnNO; }
//关闭数据库 sqlite3_finalize(stmt); returnYES; } /* 查询数据 参数: sql:SQL语句 返回值 [ [“1”,“2”, “3”] ["1" "2" "3"] ] */
-(NSMutableArray *)selectData:(NSString *)sql columns:(int)number;{ sqlite3 *sqlite =nil; sqlite3_stmt *stmt =nil;
//打开数据库 if (sqlite3_open([self.filePathUTF8String],&sqlite) != SQLITE_OK) { NSLog(@"打开数据库失败"); sqlite3_close(sqlite);
}
//编译sql语句 if (sqlite3_prepare_v2(sqlite,nil)!= SQLITE_OK) { NSLog(@"编译sql语句失败"); sqlite3_close(sqlite);
} int result =sqlite3_step(stmt); NSMutableArray *data = [NSMutableArrayarray]; while (result ==SQLITE_ROW) { NSMutableArray *row = [NSMutableArrayarrayWithCapacity:3]; for (int i =0; i < number ; i++) { char *columnTest = (char *)sqlite3_column_text(stmt,i); NSString *string = [NSStringstringWithCString:columnTestencoding:NSUTF8StringEncoding]; [row addObject:string]; } }
return data;
}
@end 操作数据库 #import "UserBase.h" #import "UserModel.h"
@implementation UserBase
-(void)createTable{ NSString *sql =@"CREATE TABLE IF NOT EXISTS User(username TEXT primary key,password TEXT,age TEXT)"; [selfcraeteTable:sql];
}
-(BOOL)addUser:(UserModel *)userModel{ NSString *sql =@"INSERT OR REPLACE INTO UserTable (username,password,age)VALUES(?,?,?)";
NSArray *params = [NSArrayarrayWithObjects:userModel.username,userModel.password,userModel.age,nil]; return [selfdealData:sqlparamsarray:params]; }
-(NSArray *)findUsers{ NSString *sql =@"SELECT username,age FROM User"; NSArray * data = [selfselectData:sqlcolumns:3]; NSMutableArray *users = [NSMutableArrayarray]; for(NSArray *rowin data){ NSString *username = [rowobjectAtIndex:0]; NSString *password = [rowobjectAtIndex:1]; NSString *age = [rowobjectAtIndex:2];
UserModel *user = [[UserModelalloc]init]; user.username = username; user.password = password; user.age = age; [users addObject:user]; } return users; }
用户模型对象 @interface UserModel : NSObject @property (nonatomic,copy)NSString *username; @property (nonatomic,copy)NSString *password; @property (nonatomic,copy)NSString *age;
附加 在使用数据库的时候,主要任务是建立和数据库之间的连接,执行SQL语句。 SQLite中有下面两个重要的对象(指向结构体的指针): sqlite3, 代表数据库连接的对象。 sqlite3_stmt, 代表SQL语句的对象。 SQLite中的重要函数: sqlite3_open(), 打开数据库的函数,返回值为整型,指代了打开操作的结果,若结果等于SQLITE_OK这个常量,则说明成功打开数据库。若打开失败,会返回相应的错误代码。 sqlite3_prepare(), 要执行SQL语句,必须先把它编译成字节码。sqlite3_prepare函数就是负责编译SQL语句。 sqlite3_step(), 使用sqlite3_prepare函数将SQL语句编译好了以后,可以使用step函数来执行。对于有返回值的执行语句(如select),调用一次sqlite_step函数将会执行并记录一行(row)有效的结果到sqlite3_stmt里。要继续获取后面的运行结果,就要再执行sqlite3_step函数直到所有结果都记录完毕。比如,sqlite3_stmt中有语句“select * from studentTable order by id”,若结果包含多条数据,则使用sqlite3_step()函数只能得到第一行的内容,继续调用该函数直到所有结果都已记录完毕。而对于没有返回值的语句(如INSERT/UPDATE/DELETE),执行一次即可。 sqlite3_column(), 对于select语句,在使用sqlite3_step运行后,需要将结果读出来。实际上不存在一个叫sqlite3_column()的函数,这是一系列函数的代称,它们共同的作用就是从当前的结果中按列号取出值。比如一个select语句运行后,其中的一条结果为 01 “what_if” "male"。这个结果就包含3列,那么就可以利用该函数,找出特定某一列的值,根据值类型的不同,需要调用不同的函数,比如针对第一列,类型为整型,调用sqlite3_column_int(stmt,0)来返回第一列的值;而第二列的数据类型是文本(text),相应地,调用sqlite3_column_text(stmt,1)得到第二列的文本信息。该函数还有字节类型(byte)、双精度型(double)等。 sqlite3_finalize(),sans-serif; font-size:13px; line-height:19.5px"> sqlite3_stmt使用完毕,用sqlite3_finalize()函数来销毁。如果把sqlite3_stmt看作对象的话,这个函数就相当于是它的析构函数。在结束使用sqlite3_stmt,必须要调用该函数,否则会造成内存泄露。 sqlite3_close(),sans-serif; font-size:13px; line-height:19.5px"> 数据库操作结束后,需要将数据库连接关闭。用sqlite3_close()函数来关闭,显然,这是和sqlite_open()成对出现的。在关闭之前,需要使用sqlite3_finalize()来销毁所有sqlite3_stmt对象。 sqlite3_exec(),sans-serif; font-size:13px; line-height:19.5px"> sqlite3_exec()为执行sql语句提供了一种便捷的方法,只需要将sql语句的字符串(char *)传递给该函数即可。我们指定回调函数(callback)来处理执行后的返回值。不过一般情况下,sqlite3_exec()函数多用于执行无返回值的语句(CREATE/DROP等),对于有返回值的操纵(如select),常结合使用sqlite3_prepare、sqlite3_step()、sqlite3_clumn()获得执行结果。
附表: 最重要的SQLite API命令 1.函数:sqlite3_open(参数:文件名、数据库地址) 打开数据库
使用SQLite数据库的一般步骤: 1.打开数据库; 2.以每次一条的方式准备语句; 3.遍历结果--读取字段; 4.删除语句; 5.关闭数据库。 也可以用sqlite3_exec()和sqlite3_get_table()来简化上面的步骤。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |