首先,添加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-各个函数相关推荐

  1. sqlite3入门基础、sqlite3常用函数

    1.打开/创建一个数据库 int sqlite3_open(const char *filename, sqlite3 **ppDb ); 功能:打开数据库链接 参数:filename:数据库的路径和 ...

  2. sqlite3: sqlite3_step 函数

    上一篇文章中,我们通过sqlite3_prepare_v2初始化sqlite3_stmt 数据(预编译)后,就可以通过sqlite3_step函数来执行. 返回值: SQLITE_BUSY:当前数据库 ...

  3. 【iOS】sqlite3的使用(増删改查)

    目录: 一.sqlite3常用函数 二.将sqlite3集成到项目,实现増删改查 三.封装DBManager 四.Demo 一.sqlite3常用函数及解释 (1)sqlite3_open: 用来创建 ...

  4. c++:MFC中sqlite3的使用(附实际案例)

    MFC中sqlite3的使用 sqlite3介绍 sqlite3安装 常用API函数 操作流程 接口函数 执行sql语句函数 回调函数 MFC中案例实践 控制台实践 sqlite3介绍 SQLite ...

  5. sqlite3API函数

    回顾: DDL 表的创建.修改.删除 create table 表名(字段名 字段类型 [约束],...); alter table 表名 {rename to 新名字 | add column 字段 ...

  6. sqlite3修改表内容python_Python sqlite3数据库模块使用攻略

    Python作为数据科学主流语言,被广泛用于数据读存.处理.分析.建模,可以说是无所不能. 数据一般存放在本地文件或者数据库里,之前介绍过如何使用python读取本地文件,也对# PyMySQL.cx ...

  7. Sqlite3 ---------------用法

    前序: Sqlite3 的确很好用.小巧.速度快.但是因为非微软的产品,帮助文档总觉得不够.这些天再次研究它,又有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记. 这里要注明,我是一个跨 ...

  8. SQLite的sqlite3_column_blob函数

    SQLite3利用函数sqlite3_column_blob来返回blob字段的内容的指针,并通过sqlite3_column_bytes来返回对应该字段的长度. 只是一直有一个疑问就是通过sqlit ...

  9. Linux下sqlite3移植与编程

    目标平台:LOONGSON-1B开发板 内核:Linux 3.0 编译平台:ubuntu10.04 交叉工具链:gcc-3.4.6-2f 简介 sqlite3一款主要用于嵌入式的轻量级数据库,本文旨在 ...

  10. 不容错过, Paintinglite轻量级Sqlite3框架

    Paintinglite 安装 直接通过GitHub下载到本地,将Paintinglite拖到项目中,即可体验Paintinglite.需要在项目中添加Sqlite3支持的libsqlite3.tbd ...

最新文章

  1. oracle 表空间初始分配,在Oracle中创建用户时,若未提及DEFAULT TABLESPACE关键字,则Oracle就将哪个表空间分配给用户作为默认表空间。...
  2. mybatis-plus自定义配置方式
  3. .f' '或者.F' '或者string.format(args)
  4. GhostNet网络
  5. python 多进程 调用模块内函数_python--多进程的用法详解实例
  6. 苹果通过电商渠道降价20天后,iPhone在中国销量猛增八成
  7. tp3.2 URL模式
  8. 推荐算法之协同过滤算法详解(原理,流程,步骤,适用场景)
  9. Python-初应用:乌龟吃鱼(菜菜狂踩雷现场、典型低级错误)
  10. 最近一直在好奇一个问题,QWE到底等不等于ABC? -.- .. --.- .-.. .-- - ..-. -.-. --.- --. -. ... --- --- flag格式:CTF{xxx}
  11. ajax调取mysql数据显示在html_ajax实现从后台拿数据显示在HTML前端的方法
  12. 2023秋招大厂经典面试题及答案整理归纳(101-120)校招必看
  13. 揭秘Microsoft Windows LDM
  14. 互动媒体技术——编程习作集
  15. iOS10新特性,适配教程,XCode8新特性
  16. 高效开发:你的项目有接口聚合服务吗?
  17. hdu-4933-Miaomiao's Function(BC#4 1003)
  18. LA@线性方程组解的结构@Cramer法则@高斯消元法
  19. 创新案例|“丑鞋”Crocs如何做到年收入增长67%?
  20. 电位触发,空翻,主从触发器

热门文章

  1. Linux 多应用程序docker自动部署脚本
  2. java代码审查规范
  3. Corosync Pacemaker 高可用 Mariadb
  4. 第一个小项目 - 去掉指定文件中的注释
  5. Linux开启路由转发功能(透明代理环境搭建)
  6. 【markdown】图片的处理
  7. 2018-11-25
  8. Java学习之路-4_集合知识总结
  9. MySQL的存储引擎与日志说明
  10. 柱状折线图2-双柱状重合堆积折线-重写图例点击事件