您的位置:首页 > 移动开发 > Objective-C

iOS object-c语言使用SQLite数据库增删改查

2017-08-14 14:38 274 查看
原文地址: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的数据不存在是不应该显示删除成功的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sqlite