sqlite3 的一些整理和补充
一,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], -, &statement, nil) == SQLITE_OK) {
sqlite3_bind_text(statement, , [field1Value UTF8String], -,NULL);
sqlite3_bind_text(statement, , [field2Value UTF8String], -,NULL);
sqlite3_bind_text(statement, , [field3Value UTF8String], -,NULL);
}
if (sqlite3_step(statement) != SQLITE_DONE) {
NSAssert(, @"插入数据失败!");
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:];
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, -, &stmt, NULL)==SQLITE_OK) {//SQL语句没有问题
NSLog(@"查询语句没有问题");
//每调用一次sqlite3_step函数,stmt就会指向下一条记录
while (sqlite3_step(stmt)==SQLITE_ROW) {//找到一条记录
//取出数据
//(1)取出第0列字段的值(int类型的值)
int ID=sqlite3_column_int(stmt, );
//(2)取出第1列字段的值(text类型的值)
const unsigned char *name=sqlite3_column_text(stmt, );
//(3)取出第2列字段的值(int类型的值)
int age=sqlite3_column_int(stmt, );
// 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
sqlite3 的一些整理和补充的更多相关文章
- sqlite3简单教程整理
一.Ubuntu下安装sqlite3 1.介绍:sqlite3是linux上的小巧的数据库,一个文件就是一个数据库. 2.安装: 要安装sqlite3,可以在终端提示符后运行下列命令: sud ...
- sqlite3错误码整理
#define SQLITE_OK /* 成功 | Successful result */ /* 错误码开始 */ #define SQLITE_ERROR /* SQL错误 或 丢失数据库 | S ...
- ACM算法整理(不断补充ing)
动态规划 1.背包问题 (1)01背包 ,n) DFR(v,V,C[i]) F[v]=max(F[v],F[v-C[i]]+W[i]); } //初始化时 //若背包不一定装满F全初始化为0 //若装 ...
- Java并发编程面试题 Top 50 整理版
本文在 Java线程面试题 Top 50的基础上,对部分答案进行进行了整理和补充,问题答案主要来自<Java编程思想(第四版)>,<Java并发编程实战>和一些优秀的博客,当然 ...
- 补充NTP知识的初中高
前言 网上流传阿里穆工对NTP知识梳理的初级和中级版本.我从时钟服务器厂商在实践中的经验对穆工的文档进行再次整理和补充,希望对使用此设备的客户和对此有兴趣的同学给出一些指引. 个人认为对知识的了解应该 ...
- SQL2008 无日志附加MDF文件
SQL数据在附加的时候..有时会因为日志文件过大..或者一些其他问题造成附加失败.. 笔者遇到的问题是数据库主文件(*.mdf)超过25G..日志文件超过200G..附加的耗时简直日了狗了..最后超时 ...
- 20160128.CCPP体系详解(0007天)
以下内容有所摘取,进行了某些整理和补充 论浮点数的存储原理:float浮点数与double浮点数的二进制存储原理–>阶码 浮点数转二进制 1.整数int类型和浮点数float类型都是占用4个字节 ...
- MySQL_日期函数汇总
如果转载,请注明博文来源: www.cnblogs.com/xinysu/ ,版权归 博客园 苏家小萝卜 所有.望各位支持! 关于MySQL日期时间函数,每回总 ...
- 如何学习LoadRunner性能测试?
最近组内同事针对性能测试LR的脚本部分做了介绍,是个不错的分享.会后反思自己也有很长一段时间没做性能测试了,根据以往的经验,有必要做些整理和补充,本文主要介绍一些Loadrunner性能测试的学习方法 ...
随机推荐
- 没有动态库链接:可执行的文件大小一个就有几百兆 Dynamic-Link Libraries
dynamic link library Dynamic-Link Libraries (Windows) https://msdn.microsoft.com/en-us/library/windo ...
- HTML 标签大全及属性
基本结构标签: <HTML>,表示该文件为HTML文件 <HEAD>,包含文件的标题,使用的脚本,样式定义等 <TITLE>---</TITLE>,包含 ...
- /var/spool/postfix/maildrop 出现大量文件原因和解决办法
今天发现服务器硬盘报警,出现空间不足的情况,后经查看发现是 /var/spool/postfix/maildrop 有大量文件,但服务器本身没有启动 postfix服务. 继续上网查资料,发现是cro ...
- mysql 数据操作 多表查询 目录
mysql 数据操作 多表查询 准备 多表连接查询介绍 mysql 数据操作 多表查询 多表连接查询 笛卡尔积 mysql 数据操作 多表查询 多表连接查询 内连接 mysql 数据操作 多表查询 多 ...
- 多作者wordpress博客彻底屏蔽可视化编辑
如果你的wordpress博客支持多作者,但是难免有些作者会加入过多的链接,怎么办呢?可以考虑屏蔽可视化编辑 在 functions.php 添加如下代码即可: add_filter('user_ca ...
- android加载gif图片
Android加载GIF图片的两种方式 方式一:使用第三开源框架直接在布局文件中加载gif 1.在工程的build.gradle中添加如下 buildscript { repositories { m ...
- R实现的最小二乘lsfit函数学习
1.源码 function (x, y, wt = NULL, intercept = TRUE, tolerance = 1e-, yname = NULL) { x <- as.matrix ...
- 正态分布及3Sigma原理
针对这个问题,用一两句话是难以说清楚的,这是数理统计学的内容,当质量特性呈正态分布时(实际上,当样本足够大时,二项分布.泊松分布等均趋近于正态分布),3Sigma水平代表了99.73%的合格率
- python ddt 实现数据驱动一
ddt 是第三方模块,需安装, pip install ddt DDT包含类的装饰器ddt和两个方法装饰器data(直接输入测试数据) 通常情况下,data中的数据按照一个参数传递给测试用例,如果da ...
- js全选反选
<style type="text/css"> table { width: 800px; text-align: left; border-collapse: col ...