sqlite3 使用

sqlite3 使用,第1张

概述 在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入主头文件   创建、打开、关闭数据库 创建或打开数据库 // path为:~/Documents/person.db sqlite3 *db = NULL; int result = sqlite3_open([path UTF8String], &db); 代码解析: sqlite3_open()将根据文件路径

在iOS中使用sqlite3,首先要添加库文件libsqlite3.dylib和导入主头文件

创建、打开、关闭数据库

创建或打开数据库
// path为:~/documents/person.db
sqlite3 *db = NulL;
int result = sqlite3_open([path UTF8String],&db);

代码解析:
sqlite3_open()将根据文件路径打开数据库,如果不存在,则会创建一个新的数据库。如果result等于常量sqlITE_OK,则表示成功打开数据库
sqlite3 *db:一个打开的数据库实例
数据库文件的路径必须以C字符串(而非Nsstring)传入

关闭数据库:sqlite3_close(db);

执行不返回数据的SQL语句

执行创表语句
char *errorMsg = NulL; // 用来存储错误信息
char *sql = "create table if not exists t_person(ID integer primary key autoincrement,name text,age integer);";
int result = sqlite3_exec(db,sql,NulL,&errorMsg);

代码解析:
sqlite3_exec()可以执行任何SQL语句,比如创表、更新、插入和删除 *** 作。但是一般不用它执行查询语句,因为它不会返回查询到的数据
sqlite3_exec()还可以执行的语句:
开启事务:begin transaction;
回滚事务:rollback;
提交事务:commit;

带占位符插入数据

char *sql = "insert into t_person(name,age) values(?,?);";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db,-1,&stmt,NulL) == sqlITE_OK) {
sqlite3_bind_text(stmt,1,"母鸡",NulL);
sqlite3_bind_int(stmt,2,27);
}
if (sqlite3_step(stmt) != sqlITE_DONE) {
NSLog(@"插入数据错误");
}
sqlite3_finalize(stmt);

代码解析:
sqlite3_prepare_v2()返回值等于sqlITE_OK,说明SQL语句已经准备成功,没有语法问题

sqlite3_bind_text():大部分绑定函数都只有3个参数
第1个参数是sqlite3_stmt *类型
第2个参数指占位符的位置,第一个占位符的位置是1,不是0
第3个参数指占位符要绑定的值
第4个参数指在第3个参数中所传递数据的长度,对于C字符串,可以传递-1代替字符串的长度
第5个参数是一个可选的函数回调,一般用于在语句执行后完成内存清理工作
sqlite_step():执行SQL语句,返回sqlITE_DONE代表成功执行完毕
sqlite_finalize():销毁sqlite3_stmt *对象

查询数据

char *sql = "select ID,name,age from t_person;";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(db,NulL) == sqlITE_OK) {
while (sqlite3_step(stmt) == sqlITE_ROW) {
int _ID = sqlite3_column_int(stmt,0);
char *_name = (char *)sqlite3_column_text(stmt,1);
Nsstring *name = [Nsstring stringWithUTF8String:_name];
int _age = sqlite3_column_int(stmt,2);
NSLog(@"ID=%i,name=%@,age=%i",_ID,_age);
}
}
sqlite3_finalize(stmt);
代码解析
sqlite3_step()返回sqlITE_ROW代表遍历到一条新记录
sqlite3_column_*()用于获取每个字段对应的值,第2个参数是字段的索引,从0开始

使用实例

////  IWStudentTool.m//  02-sqlite的封装////  Created by apple on 14-5-22.//#import "IWStudentTool.h"#import "IWStudent.h"#import <sqlite3.h>@implementation IWStudentTool// static的作用:能保证_db这个变量只被IWStudentTool.m直接访问static sqlite3 *_db;+ (voID)initialize{    // 0.获得沙盒中的数据库文件名    Nsstring *filename = [[NSSearchPathForDirectorIEsInDomains(NSdocumentDirectory,NSUserDomainMask,YES) lastObject] stringByAppendingPathComponent:@"student.sqlite"];        // 1.创建(打开)数据库(如果数据库文件不存在,会自动创建)    int result = sqlite3_open(filename.UTF8String,&_db);    if (result == sqlITE_OK) {        NSLog(@"成功打开数据库");                // 2.创表        const char *sql = "create table if not exists t_student (ID integer primary key autoincrement,age integer);";        char *errorMesg = NulL;        int result = sqlite3_exec(_db,&errorMesg);        if (result == sqlITE_OK) {            NSLog(@"成功创建t_student表");        } else {            NSLog(@"创建t_student表失败:%s",errorMesg);        }    } else {        NSLog(@"打开数据库失败");    }}+ (BOol)addStudent:(IWStudent *)student{    Nsstring *sql = [Nsstring stringWithFormat:@"insert into t_student (name,age) values('%@',%d);",student.name,student.age];    char *errorMesg = NulL;    int result = sqlite3_exec(_db,sql.UTF8String,&errorMesg);        return result == sqlITE_OK;}+ (NSArray *)students{    // 0.定义数组    NSMutableArray *students = nil;        // 1.定义SQL语句    const char *sql = "select ID,age from t_student;";        // 2.定义一个stmt存放结果集    sqlite3_stmt *stmt = NulL;        // 3.检测SQL语句的合法性    int result = sqlite3_prepare_v2(_db,NulL);    if (result == sqlITE_OK) {        NSLog(@"查询语句是合法的");        students = [NSMutableArray array];                // 4.执行SQL语句,从结果集中取出数据        while (sqlite3_step(stmt) == sqlITE_ROW) { // 真的查询到一行数据            // 获得这行对应的数据                        IWStudent *student = [[IWStudent alloc] init];                        // 获得第0列的ID            student.ID = sqlite3_column_int(stmt,0);                        // 获得第1列的name            const unsigned char *sname = sqlite3_column_text(stmt,1);            student.name = [Nsstring stringWithUTF8String:(const char *)sname];                        // 获得第2列的age            student.age = sqlite3_column_int(stmt,2);                        // 添加到数组            [students addobject:student];        }    } else {        NSLog(@"查询语句非合法");    }        return students;}+ (NSArray *)studentsWithCondition:(Nsstring *)condition{    // 0.定义数组    NSMutableArray *students = nil;        // 1.定义SQL语句    const char *sql = "select ID,age from t_student where name like ?;";        // 2.定义一个stmt存放结果集    sqlite3_stmt *stmt = NulL;        // 3.检测SQL语句的合法性    int result = sqlite3_prepare_v2(_db,NulL);    if (result == sqlITE_OK) {        NSLog(@"查询语句是合法的");        students = [NSMutableArray array];                // 填补占位符的内容        Nsstring *newCondition = [Nsstring stringWithFormat:@"%%%@%%",condition];//        NSLog(@"%@",newCondition);        sqlite3_bind_text(stmt,newCondition.UTF8String,NulL);                // 4.执行SQL语句,从结果集中取出数据        while (sqlite3_step(stmt) == sqlITE_ROW) { // 真的查询到一行数据            // 获得这行对应的数据                        IWStudent *student = [[IWStudent alloc] init];                        // 获得第0列的ID            student.ID = sqlite3_column_int(stmt,2);                        // 添加到数组            [students addobject:student];        }    } else {        NSLog(@"查询语句非合法");    }        return students;}@end
总结

以上是内存溢出为你收集整理的sqlite3 使用全部内容,希望文章能够帮你解决sqlite3 使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1171128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存