原文地址:http://www.tpyyes.com/a/kuozhan/2017/0318/86.html
ios开发中如何使用sqlite数据库增删改查呢?下面上ios object-c语言对sqlite数据库增删改查的代码,如果想使用sqlite可视化工具,推荐下载sqlitestudio,如何使用sqlitestudio可视化工具,只需要选择数据库文件夹所在的路径如user.db文件的绝对路径就好,如下(本人没有选择,抱歉)。
object-c中如何使用sqlite数据库呢?首先需要在项目中添加sqlite框架,如图。
然后在ios项目文件中导入sqlite3框架,如下。
#import <sqlite3.h>
下面是sqlite数据库增删改查的使用方法,如下。
#import "ViewController.h"
#import <sqlite3.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString *path = [self getPath];
//结果集定义
sqlite3_stmt *stmt;
//创建或打开数据库
sqlite3 *database;
//错误信息定义
char *erro = 0;
int sqlStatus = sqlite3_open_v2([path UTF8String], &database,SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE,NULL);
if (sqlStatus == SQLITE_OK) {
NSLog(@"数据库创建成功");
}
//创建数据库表
const char *sql = "create table if not exists siteList(id char,name char,parentSiteId char,userCount int)";
int tabelStatus = sqlite3_exec(database, sql, NULL, NULL, &erro);
if (tabelStatus == SQLITE_OK) {
NSLog(@"表创建成功");
}
//插入数据
const char *insertSql = "insert into siteList (id,name,parentSiteId,userCount) values('5','赵六','呀呀',10)";
int insertResult = sqlite3_exec(database, insertSql, NULL,NULL, &erro);
if (insertResult == SQLITE_OK) {
NSLog(@"表数据增加成功!");
}
//删除数据
const char *delSql = "delete from siteList where id = '2'";
int delResult = sqlite3_exec(database, delSql, NULL,NULL,&erro);
if (delResult == SQLITE_OK) {
NSLog(@"表数据删除成功!%s",erro);
}
//修改表数据
const char *updateSql = "update siteList set name = '小红' where id = '5'";
int updateResult = sqlite3_exec(database, updateSql, NULL, NULL, &erro);
if (updateResult == SQLITE_OK) {
NSLog(@"表数据修改成功!%d",delResult);
}
//查询数据
const char *selsql = "select id,name,parentSiteId,userCount from siteList where id = '6'";
int searchResult = sqlite3_prepare_v2(database, selsql, -1, &stmt, NULL);
if (searchResult != SQLITE_OK) {
NSLog(@"查询失败,%d",searchResult);
}else{
// 查询的结果可能不止一条,直到 sqlite3_step(stmt) == SQLITE_ROW 说明查询到了数据
while (sqlite3_step(stmt) == SQLITE_ROW) {
const unsigned char *id = sqlite3_column_text(stmt, 0);
const unsigned char *name = sqlite3_column_text(stmt, 1);
const unsigned char *parentSiteId = sqlite3_column_text(stmt, 2);
const unsigned int userCount = sqlite3_column_int(stmt, 3);
NSLog(@"%s===%s===%s===%d",id,name,parentSiteId,userCount);
//汉字有可能会出现编码问题,转换编码方法如下
NSString *finalName = [NSString stringWithUTF8String:(const char*)name];
NSString *finalParentSite = [NSString stringWithUTF8String:(const char*)parentSiteId];
NSLog(@"UTF-8编码后的汉字:%@===%@",finalName,finalParentSite);
}
}
//销毁stmt,回收资源
sqlite3_finalize(stmt);
//关闭数据库
sqlite3_close(database);
}
//封装db数据库所在的document路径,打算将数据库放在document目录下,如:/user/xxx/document/user.db
-(NSString *)getPath{
NSString *filename = @"user.db";
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [doc stringByAppendingPathComponent:filename];
NSLog(@"%@",filePath);
return filePath;
}
@end
注意事项:sqlite3_exec()和sqlite3_prepare_v2()这两个方法返回的int类型的值,两个方法的区别就是前者是执行增删改的操作,后者只执行查询语句的操作:
const char *delSql = "delete from siteList where id = '2'";
int delResult = sqlite3_exec(database, delSql, NULL,NULL,&erro);
if (delResult == SQLITE_OK) {
NSLog(@"表数据删除成功!%s",erro);
}else{
NSLog(@"表数据删除不成功!%s",erro);
}
如delResult只有当sql语句语法出错的时候才会显示删除不成功,也就是说“delResult == SQLITE_OK”如果delSql语句没有错误,即使id=2的数据不存在,也是会进入if语句并显示删除成功。所以在删除一条数据时,应该先根据id查询id=2的数据是否存在,如果存在后执行sqlite的删除语句,这时候如果仍然显示成功才算是真正的删除成功了,否则会与业务不符合,也就是说id=2的数据不存在是不应该显示删除成功的。