最近在仿写「掌上英雄联盟」的时候,有个搜索文章的功能。在搜索的时候会将搜索记录保存下来,所以有用到sqlite
导入 sqlite 依赖库
在代码中导入头文件
我在第一次使用的时候,导入了头文件也没有反应了。重启一下项目,就 OK 了
基本的使用
- 创建数据库
//数据库句柄
static sqlite3 *database = nil;
//用于保存编译好的 sql 语句
static sqlite3_stmt *statement = nil;
//懒加载方式设置数据库路径
-(NSString *)fileName
{
if (!_fileName) {
_fileName = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"search.sqlite"];
}
return _fileName;
}
//创建数据库
-(BOOL) openAndCreateTable{
BOOL isSuccess = YES;
NSFileManager *filemgr = [NSFileManager defaultManager];
if ([filemgr fileExistsAtPath: self.fileName ] == NO){ //判断数据库是否已经存在
const char *dbpath = [self.fileName UTF8String]; //由于 sqlite3是 c 语言,所以没有NSString 类型。**使用 UTF8String 转换为 char* 类型**
if (sqlite3_open(dbpath, &database) == SQLITE_OK) //打开数据库
{
char *errMsg;
const char *sql_stmt ="create table SerchRecord (serchWord varchar(30) primary key)"; //sql 语句的编写
if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) //执行 sql 语句
!= SQLITE_OK)
{
isSuccess = NO;
NSLog(@"Failed to create table %s",errMsg);
}
sqlite3_close(database); //关闭数据库
return isSuccess;
}
else {
isSuccess = NO;
NSLog(@"Failed to open/create database");
}
}
return isSuccess;
}
- 增、删、查、改
-(BOOL) deleteRecord:(NSString *)recordString
{
const char *dbpath = [self.fileName UTF8String];
if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{
//编写 sql 语句。这里只写了删除的 其他的一样一样的
NSString *sqlString = [NSString stringWithFormat:@"DELETE from SerchRecord where serchWord='%@'",recordString];
NSLog(@"%@",sqlString);
const char *deleteStm = [sqlString UTF8String];
//编译 sql 语句
sqlite3_prepare_v2(database, deleteStm,-1, &statement, NULL);
if (sqlite3_step(statement) == SQLITE_DONE) //执行 sql语句
{
NSLog(@"删除成功");
sqlite3_reset(statement); //在关闭数据库,之前一定要清除sqlite3_stmt 中绑定的 sql 指令
sqlite3_close(database);
return YES;
}
else {
sqlite3_reset(statement);
sqlite3_close(database);
return NO;
}
}
return NO;
}
一些常见的 sqlite 函数 和结构体
sqlite3 *database //数据库句柄,跟文件句柄FILE很类似
sqlite3_stmt *stmt, //这个相当于ODBC的Command对象,用于保存编译好的SQL语句
sqlite3_open() //打开数据库
sqlite3_exec() //执行非查询的sql语句
sqlite3_prepare() // 准备sql语句,执行select语句或者要使用parameter bind时,用这个函数(封装了sqlite3_exec).
sqlite3_finalize(stmt) //释放 sqlite3_stmt 的 sql
Sqlite3_step(), //在调用sqlite3_prepare后,使用这个函数在记录集中移动。
Sqlite3_close(), //关闭数据库文件
sqlite3_column_text() // 取text类型的数据。
sqlite3_column_blob() //取blob类型的数据
sqlite3_column_int() //取int类型的数据