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

  

时间: 2024-11-10 16:22:43

SQLite3-各个函数的相关文章

SQLite3时间函数小结

import sqlite3 conn = sqlite3.connect('/tmp/sqlite.db') cur = conn.cursor() 接下来干嘛呢?建一张表吧.这里需要注意的是,SQLite不支持在创建表的同时创建索引,所以要分两步走,先创建表然后再创建索引 create_table_stmt = '''CREATE TABLE IF NOT EXISTS test_table ( id INTEGER PRIMARY KEY AUTOINCREMENT, duration I

SQLite3 C/C++ 开发接口简介

SQLite3 C/C++ 开发接口简介 1.0 总览 SQLite3是SQLite一个全新的版本,它虽然是在SQLite 2.8.13的代码基础之上开发的,但是使用了和之前的版本不兼容的数据库格式和API. SQLite3是为了满足以下的需求而开发的: 支持UTF-16编码. 用户自定义的文本排序方法. 可以对BLOBs字段建立索引. 因此为了支持这些特性我改变了数据库的格式,建立了一个与之前版本不兼容的3.0版. 至于其他的兼容性的改变,例如全新的API等等,都将在理论介绍之后向你说明,这样

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

目录: 一.sqlite3常用函数 二.将sqlite3集成到项目,实现増删改查 三.封装DBManager 四.Demo 一.sqlite3常用函数及解释 (1)sqlite3_open: 用来创建和打开数据库文件,接收两个参数,第一个是数据库的名字,第二个是数据库的句柄.如果数据库文件不存在,将首先新建它,然后再打开它,否则只是打开它. (2)sqlite3_prepare_v2: 使用格式化的字符串来获得sql准备语句(prepared statement),然后转化为可被SQLite3识

Cocos数据篇[3.4](6) ——SQLite3数据库基础用法

[唠叨] 在Cocos2d-x中,简单数据存储,可以使用UserDefault.那么如何存储大量,不规则的数据?我们可以使用 SQLite数据库 存储数据.SQLite 是使用非常广泛的 嵌入式数据库 ,它有小巧 .高效.跨平台.开源免费和易操作的特点.所以大量的被用于手机.PDA.MP3播放器.以及机顶盒设备. SQLite数据库是使用C语言来编写的,因此在Cocos2d-x使用SQLite也是得心应手. 本文介绍一下SQLite3数据库的基础用法:增删改查. PS:另外对于SQLite的可视

sqlite3使用

在linux下我们首先要获取root权限 当然也可是使用 sudo命令 接着让我们来安装sqlite3吧!博主当然是已经安装好了! 别急,的确你是安装好了sqlite3但是有一点必须要记住,你还没有安装对应的api库,所谓的api库就是在你使用c接口编程时导致的各种没有定义和找不到! 于是我们接着安装好它的库,我的是已经安装好后的了! OK,下面便到了我们理解SQL语言的步骤了! sql功能 数据定义(DDL):用户定义.删除和修改数据模式 数据查询(DQL):用于查询数据 数据操纵(DML):

SQLITE3 使用总结

2009-09-16 07:36 2624人阅读 评论(10) 收藏 举报 前序: Sqlite3 的确很好用.小巧.速度快.但是因为非微软的产品,帮助文档总觉得不够.这些天再次研究它,又有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记. 这里要注明,我是一个跨平台专注者,并不喜欢只用 windows 平台.我以前的工作就是为 unix 平台写代码.下面我所写的东西,虽然没有验证,但是我已尽量不使用任何 windows 的东西,只使用标准 C 或标准C++.但是,我没有尝试过在别的

数据库sqlite3的使用-ios中引用方法

一.简单说明 在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入主头文件. 导入头文件,可以使用库中的函数(是纯C语言的) 二.具体说明 新建一个项目,在项目的主界面中放四个按钮(分别是,增加.删除.修改.查询). 1.sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)函数的一些说明: (1)作用:把一个文件名称传递给他,它会自动检测这个文件是否存在,如果不存在的话,会自动创建相应的

Xcode7.2使用sqlite3数据库的方法

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 之前版本的Xcode是可以直接连接sqlite3的库文件的,但是Xcode7.2中虽然有sqlite3.tbd文件,但是在编译连接时会报错无法找到该文件. 如果要在Xcode7.2中使用sqlite数据库,我们可以手动添加sqlite3的库文件,具体做法如下: 选择项目目标的Build Phases栏: 点击+按钮,在弹出的窗口中点击Add Other-按钮

iOS:转载sqlite3

SQLITE3 使用总结 2012-08-21 13:48:28 分类: SQLite/嵌入式数据库 SQLITE3 使用总结 2009-09-16 07:36 2624人阅读 评论(10) 收藏 举报 前序: Sqlite3 的确很好用.小巧.速度快.但是因为非微软的产品,帮助文档总觉得不够.这些天再次研究它,又有一些收获,这里把我对 sqlite3 的研究列出来,以备忘记. 这里要注明,我是一个跨平台专注者,并不喜欢只用 windows 平台.我以前的工作就是为 unix 平台写代码.下面我

Cocos2d-x数据篇06:SQLite3数据库基础用法

尊重原创:http://cn.cocos2d-x.org/tutorial/show?id=2430 [前言] 在Cocos2d-x中,简单数据存储,可以使用UserDefault.那么如何存储大量,不规则的数据?我们可以使用 SQLite数据库 存储数据.SQLite 是使用非常广泛的 嵌入式数据库 ,它有小巧 .高效.跨平台.开源免费和易操作的特点.所以大量的被用于手机.PDA.MP3播放器.以及机顶盒设备. SQLite数据库是使用C语言来编写的,因此在Cocos2d-x使用SQLite也