SQLite3-各个函数
首先,添加framework:libsqlite3.0.dylib需要在对应文件的头文件中加入:#import "/usr/include/sqlite3.h"
并在Frameworks中加入所需的库,否则会报错:Undefined symbols: "_sqlite3_open", referenced from:
加入库的方法是:image
选择sqlite库:image
选择完的效果:image
下面是代码://sqlite [self openDataBase]; //[self createTable]; //[self insertTable]; [self queryTable]; [self deleteTable]; [self queryTable];
实现://open database
- (void)openDataBase
{ NSArray *documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask , YES); NSString *databaseFilePath=[[documentsPaths objectAtIndex:0] stringByAppendingPathComponent:@"db.sql"]; if (sqlite3_open([databaseFilePath UTF8String], &database)==SQLITE_OK) { NSLog(@"open sqlite db ok."); } else { NSLog( @"can not open sqlite db " ); //close database sqlite3_close(database); }
} //create table
- (void)createTable
{ char *errorMsg; const char *createSql="create table if not exists persons (id integer primary key autoincrement,name text)"; if (sqlite3_exec(database, createSql, NULL, NULL, &errorMsg)==SQLITE_OK) { NSLog(@"create ok."); } else { NSLog( @"can not create table" ); [self ErrorReport:(NSString *)createSql]; }
} //insert table
- (void)insertTable
{ char *errorMsg; const char *insertSql="insert into persons (name) values ('田周辉')"; if (sqlite3_exec(database, insertSql, NULL, NULL, &errorMsg)==SQLITE_OK) { NSLog(@"insert ok."); } else { NSLog( @"can not insert it to table" ); [self ErrorReport: (NSString *)insertSql]; }
} //error
- (void)ErrorReport: (NSString *)item
{ char *errorMsg; if (sqlite3_exec(database, (const char *)item, NULL, NULL, &errorMsg)==SQLITE_OK) { NSLog(@"%@ ok.",item); } else { NSLog(@"error: %s",errorMsg); sqlite3_free(errorMsg); }
} //query table
- (void)queryTable
{ const char *selectSql="select id,name from persons"; sqlite3_stmt *statement; if (sqlite3_prepare_v2(database, selectSql, -1, &statement, nil)==SQLITE_OK) { NSLog(@"select ok."); while (sqlite3_step(statement)==SQLITE_ROW)//SQLITE_OK SQLITE_ROW { int _id=sqlite3_column_int(statement, 0); NSString *name=[[NSString alloc] initWithCString:(char *)sqlite3_column_text(statement, 1) encoding:NSUTF8StringEncoding]; NSLog(@"row>>id %i, name>> %@",_id,name); } } else { //error [self ErrorReport: (NSString *)selectSql]; } sqlite3_finalize(statement);
} //delete table
- (void)deleteTable
{ char *errorMsg; [self openDataBase]; const char *sql = "DELETE FROM persons where id=24"; if (sqlite3_exec(database, sql, NULL, NULL, &errorMsg)==SQLITE_OK) { NSLog(@"delete ok."); } else { NSLog( @"can not delete it" ); [self ErrorReport: (NSString *)sql]; } }
命令行:sqlite3 database //创建数据库 crate table tableFile(id smallint, file_name varchar(256), up_state smallint, file_size smallint); //创建一个表格 insert into tableFile values(1, "200110101.rcu", 100, 4500); //插入数据
5 如何访问SQLite3数据库
sqlite3_open //打开数据库
sqlite3_prepare //将UTF-8格式的SQL语句转换为指向已备语句的指针
sqlite3_column_string //返回某一行的字符串
sqlite3_finalize //删除一条已备语句
sqlite3_close //关闭数据库 6 source code - (id)lookupSingularSQL:(NSString *)sql forType:(NSString *)rettype { sqlite3_stmt *statement; id result; if (statement = [self prepare:sql]) { if (sqlite3_step(statement) == SQLITE_ROW) { if ([rettype compare:@"text"] == NSOrderedSame) { char temp_buf[256]; memset(temp_buf, 0, 256); sprintf(temp_buf, "%s %s %s %s", (char *)sqlite3_column_text(statement,0), (char *)sqlite3_column_text(statement,1), (char *)sqlite3_column_text(statement,2), (char *)sqlite3_column_text(statement,3) ); result = [NSString stringWithUTF8String:temp_buf]; //result = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,0)]; } else if ([rettype compare:@"integer"] == NSOrderedSame) { result = (id)sqlite3_column_int(statement,0); } } } sqlite3_finalize(statement); return result; }
应该有个成员变量,比如我的代码:@interface DetailViewController : UIViewController {
UIPopoverController *popoverController;
UIToolbar *toolbar;
id detailItem;
UILabel *detailDescriptionLabel;
sqlite3 *database;
打开数据库SQLite数据库是文件数据库,是保存在文件系统中的。因此需要知道文件保存到哪里,可参见iOS中对文件的操作。比如本文保存到Documents目录下。代码:NSArray *documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory
, NSUserDomainMask
, YES);
NSString *databaseFilePath=[[documentsPaths objectAtIndex:0] stringByAppendingPathComponent:@"mydb"];
if (sqlite3_open([databaseFilePath UTF8String], &database)==SQLITE_OK) {
NSLog(@"open sqlite db ok.");
}
通过ssh查看Documents目录,发现mydb文件已经创建。sqlite的策略是如果有该文件就打开,如果没有就创建文件,也就是创建数据库。这里要注意,使用的是C语法,sqlite3_open传入的是database的地址。关闭数据库数据库使用完毕后,要关闭,比如退出应用的时候:- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
sqlite3_close(database);
self.popoverController = nil;
}
建表语句数据库打开以后,如果没有表,建表:char *errorMsg;
const char *createSql="create table if not exists persons (id integer primary key autoincrement,name text)";
if (sqlite3_exec(database, createSql, NULL, NULL, &errorMsg)==SQLITE_OK) {
NSLog(@"create ok.");
}
这里要特别注意errorMsg传的是地址,因为该函数要通过地址引用来写报错字符信息。向表中插入记录和建表语句类似:const char *insertSql="insert into persons (name) values(‘张三’)";
if (sqlite3_exec(database, insertSql, NULL, NULL, &errorMsg)==SQLITE_OK) {
NSLog(@"insert ok.");
}
错误信息的处理如果在多个地方使用errorMsg,那么每次使用完毕要清空一下字串,比如这样:if (sqlite3_exec(database, createSql, NULL, NULL, &errorMsg)==SQLITE_OK) {
NSLog(@"create ok.");
}else {
NSLog(@"error: %s",errorMsg);
sqlite3_free(errorMsg);
}
查询结果集结果集的查询,需要用到statement:const char *selectSql="select id,name from persons";
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database, selectSql, -1, &statement, nil)==SQLITE_OK) {
NSLog(@"select ok.");
}
while (sqlite3_step(statement)==SQLITE_ROW) {
int _id=sqlite3_column_int(statement, 0);
char *name=(char *)sqlite3_column_text(statement, 1);
NSLog(@"row>>id %i, name %s",_id,name);
}
sqlite3_finalize(statement);
不过这里有个问题,看看打印的日志:image
乱码。因为直接用的char类型来做的。解决办法是,用nsstring替代char:while (sqlite3_step(statement)==SQLITE_ROW) {
int _id=sqlite3_column_int(statement, 0);
NSString *name=[[NSString alloc] initWithCString:(char *)sqlite3_column_text(statement, 1) encoding:NSUTF8StringEncoding];
NSLog(@"row>>id %i, name %@",_id,name);
}
char生成nsstring的时候做一次显式的编码。问题解决:image
这说明:写入数据库,用char的方式没有问题,写入数据库的编码是对的;从库中取出,可能默认使用ascii解码,造成显示乱码。使用sqlite c api,要经常参考官方函数文档:http://www.sqlite.org/c3ref/funclist.html
转载于:https://www.cnblogs.com/deng37s/p/4599922.html
SQLite3-各个函数相关推荐
- sqlite3入门基础、sqlite3常用函数
1.打开/创建一个数据库 int sqlite3_open(const char *filename, sqlite3 **ppDb ); 功能:打开数据库链接 参数:filename:数据库的路径和 ...
- sqlite3: sqlite3_step 函数
上一篇文章中,我们通过sqlite3_prepare_v2初始化sqlite3_stmt 数据(预编译)后,就可以通过sqlite3_step函数来执行. 返回值: SQLITE_BUSY:当前数据库 ...
- 【iOS】sqlite3的使用(増删改查)
目录: 一.sqlite3常用函数 二.将sqlite3集成到项目,实现増删改查 三.封装DBManager 四.Demo 一.sqlite3常用函数及解释 (1)sqlite3_open: 用来创建 ...
- c++:MFC中sqlite3的使用(附实际案例)
MFC中sqlite3的使用 sqlite3介绍 sqlite3安装 常用API函数 操作流程 接口函数 执行sql语句函数 回调函数 MFC中案例实践 控制台实践 sqlite3介绍 SQLite ...
- sqlite3API函数
回顾: DDL 表的创建.修改.删除 create table 表名(字段名 字段类型 [约束],...); alter table 表名 {rename to 新名字 | add column 字段 ...
- sqlite3修改表内容python_Python sqlite3数据库模块使用攻略
Python作为数据科学主流语言,被广泛用于数据读存.处理.分析.建模,可以说是无所不能. 数据一般存放在本地文件或者数据库里,之前介绍过如何使用python读取本地文件,也对# PyMySQL.cx ...
- Sqlite3 ---------------用法
前序: Sqlite3 的确很好用.小巧.速度快.但是因为非微软的产品,帮助文档总觉得不够.这些天再次研究它,又有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记. 这里要注明,我是一个跨 ...
- SQLite的sqlite3_column_blob函数
SQLite3利用函数sqlite3_column_blob来返回blob字段的内容的指针,并通过sqlite3_column_bytes来返回对应该字段的长度. 只是一直有一个疑问就是通过sqlit ...
- Linux下sqlite3移植与编程
目标平台:LOONGSON-1B开发板 内核:Linux 3.0 编译平台:ubuntu10.04 交叉工具链:gcc-3.4.6-2f 简介 sqlite3一款主要用于嵌入式的轻量级数据库,本文旨在 ...
- 不容错过, Paintinglite轻量级Sqlite3框架
Paintinglite 安装 直接通过GitHub下载到本地,将Paintinglite拖到项目中,即可体验Paintinglite.需要在项目中添加Sqlite3支持的libsqlite3.tbd ...
最新文章
- oracle 表空间初始分配,在Oracle中创建用户时,若未提及DEFAULT TABLESPACE关键字,则Oracle就将哪个表空间分配给用户作为默认表空间。...
- mybatis-plus自定义配置方式
- .f' '或者.F' '或者string.format(args)
- GhostNet网络
- python 多进程 调用模块内函数_python--多进程的用法详解实例
- 苹果通过电商渠道降价20天后,iPhone在中国销量猛增八成
- tp3.2 URL模式
- 推荐算法之协同过滤算法详解(原理,流程,步骤,适用场景)
- Python-初应用:乌龟吃鱼(菜菜狂踩雷现场、典型低级错误)
- 最近一直在好奇一个问题,QWE到底等不等于ABC? -.- .. --.- .-.. .-- - ..-. -.-. --.- --. -. ... --- --- flag格式:CTF{xxx}
- ajax调取mysql数据显示在html_ajax实现从后台拿数据显示在HTML前端的方法
- 2023秋招大厂经典面试题及答案整理归纳(101-120)校招必看
- 揭秘Microsoft Windows LDM
- 互动媒体技术——编程习作集
- iOS10新特性,适配教程,XCode8新特性
- 高效开发:你的项目有接口聚合服务吗?
- hdu-4933-Miaomiao's Function(BC#4 1003)
- LA@线性方程组解的结构@Cramer法则@高斯消元法
- 创新案例|“丑鞋”Crocs如何做到年收入增长67%?
- 电位触发,空翻,主从触发器