一,sqlite3数据库打开时的返回值及其所代表的含义
返回值 | 描述 | 返回值 | 描述 |
SQLITE_OK=0 | 返回成功 | SQLITE_FULL=13 | 数据库满,插入失败 |
SQLITE_ERROR=1 | Sql错误或错误的数据库 | SQLITE_CANTOPEN=14 | 不能打开数据库文件 |
SQLITE_INTERNAL=2 | Sqlite的内部逻辑错误 | SQLITE_PROTOCOL=15 | 数据库锁定协议错误 |
SQLITE_PERM=3 | 拒绝访问 | SQLITE_EMPTY=16 | 数据库表为空 |
SQLITE_ABORT=4 | 回调函数请求中断 | SQLITE_SCHEMA=17 | 数据库模式改变 |
SQLITE_BUSY=5 | 数据库文件被锁 | SQLITE_TOOBIG=18 | 一个表数据行过多 |
SQLITE_LOCKED=6 | 数据库中的一个表被锁 | SQLITE_CONSTRAINT=19 | 由于约束冲突而中止 |
SQLITE_NOMEN=7 | 内存分配失败 | SQLITE_MISMATCH=20 | 数据类型不匹配 |
SQLITE_READONLY=8 | 试图对一个只读数据库进行写操作 | SQLITE_MISUSE=21 | 数据库错误使用 |
SQLITE_INTERRUPT=9 | 由sqlite_interrupt()结束操作 | SQLITE_NOLFS=22 | 使用主机操作系统不支持的特性 |
SQLITE_IOERR=10 | 磁盘I/O发生错误 | SQLITE_AUTH=23 | 非法授权 |
SQLITE_CORRUPT=11 | 数据库磁盘镜像畸形 | SQLITE_FORMAT=24 | 辅助数据库格式错误 |
SQLITE_NOTFOUND=12 | (Internal Only)表或记录不存在 | SQLITE_NOTADB=26 | 打开的不是一个数据库文件 |
二,常用函数说明:
1.打开数据库
int sqlite3_open(
const char *filename, // 数据库的文件路径
sqlite3 **ppDb // 数据库实例
);
2.执行任何SQL语句
int sqlite3_exec( sqlite3*, // 一个打开的数据库实例 const char *sql, // 需要执行的SQL语句 int (*callback)(void*,int,char**,char**), // SQL语句执行完毕后的回调 void *, // 回调函数的第1个参数 char **errmsg // 错误信息 );
************************************
//方法2:变量的绑定方法
NSString *sql = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES (?, ?, ?)",tableName, field1, field2, field3]; sqlite3_stmt *statement; if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) { sqlite3_bind_text(statement, 1, [field1Value UTF8String], -1,NULL); sqlite3_bind_text(statement, 2, [field2Value UTF8String], -1,NULL); sqlite3_bind_text(statement, 3, [field3Value UTF8String], -1,NULL); } if (sqlite3_step(statement) != SQLITE_DONE) { NSAssert(0, @"插入数据失败!"); sqlite3_finalize(statement); }
}
*************************************
3.检查SQL语句的合法性(查询前的准备)
int sqlite3_prepare_v2( sqlite3 *db, // 数据库实例 const char *zSql, // 需要检查的SQL语句 int nByte, // SQL语句的最大字节长度 sqlite3_stmt **ppStmt, // sqlite3_stmt实例,用来获得数据库数据 const char **pzTail );
**************************************************
int sqlite3_prepare_v2(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
int nByte, /* Maximum length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
const char **pzTail /* OUT: Pointer to unused portion of zSql */
);
参数:
db:数据指针
zSql:sql语句,使用UTF-8编码
nByte:如果nByte小于0,则函数取出zSql中从开始到第一个0终止符的内容;如果nByte不是负的,那么它就是这个函数能从zSql中读取的字节数的最大值。如果nBytes非负,zSql在第一次遇见’/000/或’u000’的时候终止
pzTail:上面提到zSql在遇见终止符或者是达到设定的nByte之后结束,假如zSql还有剩余的内容,那么这些剩余的内容被存放到pZTail中,不包括终止符
ppStmt:能够使用sqlite3_step()执行的编译好的准备语句的指针,如果错误发生,它被置为NULL,如假如输入的文本不包括sql语句。调用过程必须负责在编译好的sql语句完成使用后使用sqlite3_finalize()删除它。
说明
如果执行成功,则返回SQLITE_OK,否则返回一个错误码。推荐在现在任何的程序中都使用sqlite3_prepare_v2这个函数,sqlite3_prepare只是用于前向兼容
************************************************************
4.查询一行数据
int sqlite3_step(sqlite3_stmt*); // 如果查询到一行数据,就会返回SQLITE_ROW
5.利用stmt获得某一字段的值(字段的下标从0开始)
double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮点数据
int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型数据
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 长整型数据
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二进制文本数据
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串数据
详细的见:
http://www.cnblogs.com/kfqcome/archive/2011/06/27/2136999.html
三,数据库操作过程:
1,打开数据库,创建表
//该方法用于返回数据库在Documents文件夹中的全路径信息
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documents = [paths objectAtIndex:0]; NSString *database_path = [documents stringByAppendingPathComponent:@"vivien.sqlite"]; NSLog(@"path: %@",database_path); if (sqlite3_open([database_path UTF8String], &db3) != SQLITE_OK) { sqlite3_close(db3); NSLog(@"数据库打开失败"); } else { NSLog(@"打开数据库成功"); NSString *sqlCreateTable = @"CREATE TABLE IF NOT EXISTS PERSONINFO (ID INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, address TEXT)"; [self execSql:sqlCreateTable];
2,用于除查询外的插入,删除,修改等
-(void)execSql:(NSString *)sql { char *err; if (sqlite3_exec(db3, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) { sqlite3_close(db3); } }
3,查询
- (IBAction)select { const char *sql="SELECT id,name,age FROM t_students WHERE age<20;"; sqlite3_stmt *stmt=NULL;
//进行查询前的准备工作 if (sqlite3_prepare_v2(self.db, sql, -1, &stmt, NULL)==SQLITE_OK) {//SQL语句没有问题 NSLog(@"查询语句没有问题"); //每调用一次sqlite3_step函数,stmt就会指向下一条记录 while (sqlite3_step(stmt)==SQLITE_ROW) {//找到一条记录 //取出数据 //(1)取出第0列字段的值(int类型的值) int ID=sqlite3_column_int(stmt, 0); //(2)取出第1列字段的值(text类型的值) const unsigned char *name=sqlite3_column_text(stmt, 1); //(3)取出第2列字段的值(int类型的值) int age=sqlite3_column_int(stmt, 2); // NSLog(@"%d %s %d",ID,name,age); printf("%d %s %d\n",ID,name,age); } }else { NSLog(@"查询语句有问题"); } }
http://www.cnblogs.com/wengzilin/archive/2012/03/27/2419203.html