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性能测试的学习方法 ...
随机推荐
- Set-cookie无效(失效)
今天做爬虫的时候遇到网站响应response返回的数据中有Set-Cookie,但是使用Linux的curl请求网页保存cookie始终为空,换句话说也就是Set-Cookie设置无效,所以我一直Go ...
- Is It A Tree?----poj1308
http://poj.org/problem?id=1308 #include<stdio.h> #include<string.h> #include<iostream ...
- 在Java中谈尾递归--尾递归和垃圾回收的比较
我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...
- Win10系统 Eclipse 下'Publishing to Tomcat'has encountered a problem解决办法
首先贴出来错误: 详情为:Publishing failedCould not publish to the server.There were issues during deployment to ...
- Core Data with Mantle
Mantle makes it easy to write a simple model layer for your Cocoa or Cocoa Touch application. Mantl ...
- 对innodb_flush_log_at_commit参数的写日志和刷盘行为进行图解
对innodb_flush_log_at_commit参数的写日志和刷盘行为进行图解
- vertx异步编程测试
vertx是异步编程的框架,性能较高,开发简单.异步编程就是当一个请求来了,vertx将其交由一个事件进行处理,然后继续向下执行,等处理完成,返回结果,通知客户端.这是一个由服务端反向调用客户端的过程 ...
- HTML输入框的默认显示内容
在某些情况下我们会需要在输入框里默认显示一些内容,比如在登录的时候不在输入框前面显示用户名和密码,直接在输入框里显示,这时只要在input的标签里添加属性 placeholder="用户名 ...
- 软件包管理:rpm命令管理-校验和文件提取
校验主要用于判断文件是否做了更改 修改标志: 会用-V,会看输出结果即可. 当有误操作,比如删了某一个文件,只需知道他属于哪一个rpm包,可用提取找回覆盖就行.并不把整个rpm包安装,而是提取其中的某 ...
- VUE滚动条插件——vue-happy-scroll
最近自己在自学vue2.0,然后就自己摸索做一个简单的后台管理系统,在做的过程中,总感觉不同浏览器自带的滚动条样式不统一,也很难看,所以就在网上找一些使用vue的滚动条插件.最开始用的是Easy-sc ...