sqlite 数据库的初级使用

使用步骤

1. 引入头文件:在工程的 Build Phases  下将要用到的 frameworks 和 libraries 添加。下图中我已经将要用的 sqlite3 添加到工程。

2. 指定数据库存储路径:数据库一般都是存储在沙盒根目录下地 Documents 文件夹下,在指定路径的时候,要将数据库的名称也写上

NSString *sandBox = NSHomeDirectory();
NSString *filePath = [sandBox stringByAppendingPathComponent:@"Documents/db_student.sqlite"];  // 创建的数据库名是 db_student.sqlite

3.打开数据库

3.1 首先将 OC 的路径字符串转化为 C 的字符串

const char * path = [filePath UTF8String];

3.2 打开数据库

sqlite3_open(path, &_db);

需要知道的是这句代码有两个作用:

1)如果数据库不存在,则创建数据库,然后打开;

2)如果数据库已经存在,则直接打开数据库。

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

这是这句代码的函数声明:从中可以看到

第一个参数要求的是 数据库的文件名,并且是经过 UTF-8 转化过的 C 字符串;

第二个参数要求的是 sqlite3  类型的双指针,所以传递过来的是一个地址指针;

最后一点:如果成功打开数据库,则返回一个值 SQLITE_OK

#define SQLITE_OK 0 /* Successful result */

4.创建表

4.1 创建表的 sql 语句:注意是 C 语言的字符串而不是 OC 类型的字符串

const char *sql = "create table if not exists tb_student (id integer primary key,sex boolean,name text)";

4.2 执行 DDL 语句,只有是 DDL 语句时才调用 exec 函数

int sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg);
/* 第一个参数:数据库的变量,一个已经打开i数据库
   第二个参数:创建表的语句
   第三个参数:回调函数,即语句执行完要执行的函数,通常填写 nil
   第四个参数:回调函数的第一个参数;通常填 nil
   第五个参数:错误信息;可以填 nil;注意是双指针
*/
sqlite3_exec(_db, createSql, NULL, NULL,NULL);  //所以创建表的语句可以这样写
这句代码同样有个返回值,返回 SQLITE_OK 表示表成功创建。

5.对数据表进行增、删、改、查的操作

5.1 有占位符的 sql  语句

添加  insert into tb_student (name, sex) values (?, ?);

1) 请不要被语句里的 ? 给吓到了,在这里它的作用是占位符的作用,表示这里需要一个值,而这个值不是给定的,而是一个不确定值,例如可以根据文本框获得。

当然了,如果直接使用这种语句操作数据表,那是万万不能的,为啥丫,人家不认识你呗,也许你就说了,那我直接写成确定值,这样总可以吧!答案依然还是不行,这个我也觉得很坑哪([email protected][email protected]=)

那么要怎么办呢 —— 将 sql 语句转化为 sqlite3_stmt 类型(现在都一家人了,总不能还不待见我吧)

sqlite3_stmt * stmt = nil;
sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL) //不要小看这两句代码:把字符串类型的 sql 语句,转化为 stmt 类型;只有转化后,才能把问号(?)替换为对应的数据,注意不管 sql 语句里面有没有问号,都要进行转化成这种 stmt  类型

下面这个 C 函数就是上面第二句代码的原型

/*
    第一个参数:数据库变量
    第二个参数:sql语句
    第三个参数:字符串的长度;-1表示系统计算长度;
    第四个参数:语句转化之后的存储位置的指针;
    第五个参数:超出指定长度的数据的存放位置;通常填null;
*/
int sqlite3_prepare_v2(sqlite3 *db,const char *zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail);

2)接下来的共走就是将语句里面的 ?给替换掉了:这个就要根据你的字段类型来决定使用哪个方法了,如果是字符串类型(即 text 类型), 就使用函数

/*
  第一个参数:stmt结构
  第二个参数:替换哪一个问号;从1开始;
  第三个参数:替换的内容
  第四个参数:字符串的长度,- 1 表示系统计算长度
  第五个参数:回调函数;通常写null
*/
int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*))

有返回值 SQLITE_OK,表示转化成功

则调用的时候

sqlite3_bind_text(stmt, 1, name, -1, NULL); // name 是通过文本框获取的内容

如果是 int 类型或 boolean 类型则简单多了

sqlite3_bind_int(stmt, 2, sex); // sex 是同过文本框获得的内容

3)执行  sqlite3_step(stmt)

执行成功的时候返回 SQLITE_DONE,所以可以通过返回值来判断语句是否成功执行

4)当插入的动作执行完成的时候,不要忘记将 stmt 销毁

sqlite3_finalize(stmt);

5)关闭数据库

插入完成,不再进行其他操作时,关闭数据库

sqlite3_close(_db);

5.2 没有占位符的查询语句

即使没有 sql 语句中没有占位符,也要将 sqll 语句转化为 stmt  类型

5.3 查询语句

查询语句有两个不同的地方

1)查询成功的返回值不同 SQLITE_ROW

2)运行的机制也有所不同:在将表中所有数据遍历完成之前,一直在进行查询操作,每查询到一条符合条件的记录,就返回一个 SQLITE_ROW,所以可以用这个特性将表中符合条件的数据都取出来。

while (sqlite3_step(stmt) == SQLITE_ROW)
{
     /*
       第一个参数:stmt
       第二个参数:取哪一列的值 ;从0开始
     */
     int ID = sqlite3_column_int(stmt, 0);
     int sex = sqlite3_column_int(stmt, 2);
     const unsigned char *cName = sqlite3_column_text(stmt, 1);

     NSString *name = nil;
     if (cName != NULL)
     {
          name = [NSString stringWithUTF8String:(const char *)cName];
     }
     NSLog(@"_____ID: %d ____name: %@ _____ sex: %d", ID, name, sex);
}
时间: 2024-10-12 14:54:37

sqlite 数据库的初级使用的相关文章

在Android程序中使用已有的SQLite数据库

已经将这篇文章迁移至 Code问答,你也能够到这里查看这篇文章,请多多关注我的新技术博客CodeWenDa.com 在中文搜索中,没有找到一篇比較好的关于怎样在Android应用中使用自己事先创建好的数据库的文章,于是在谷歌上找到这篇英文文章,依照它的步骤,測试成功.决定把这篇文章大致的翻译一下,想看原文的能够点击这里:http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ .

iOS中 FMDB第三方SQLite数据库 UI_20

1.什么是FMDB? FMDB是iOS平台下SQLite数据库,只不过它是OC方式封装了C语言的SQLite语句,使用起来更加面向对象 2.FMDB的优点:1.使用起来更加面向对象; 2.对比苹果自带的 Core Data 数据管理工具更加的轻量级,更加的灵活,而且FMDB支持跨平台; 3.提供多线程下的数据安全保护机制,有效地防止数据混乱 3.FMDM中重要的类: FMDBDataBase: 它代表一个数据库对象,(我们需要创建数据库对象时就使用这个类) FMDBDataBaseQueue:

【Android】Sqlite数据库增删改查

Android系统内置一个Sqlite数据库,如果app需要使用Sqlite数据库数据库存储数据,Android会为此app生成一个.db文件.这个数据库在data/data/<package_name>/databases里面,其中<package_name>为该安卓app的工程包名,这个目录必须root后才能看到.在Windows,单机的应用程序,存储数据,基本放到一个文件里面,正如游戏的存档,基本就是把当前的游戏状态存到一个用户很难找到的文件里面.每次存档读档就是一个从这个存

Sqlite数据库创建、删除、降级笔记

(1).在创建sqlite数据库时需要注意oncreate()方法只有在第一次创建数据库时候运行.当数据库删除后也会执行,sqlite不支持数据库删除,但可以删除相应的文件,即删了数据库.当我们再次配置文件时候就会执行oncreate()了. (2).onUpgrade()只有在版本号发生改变(增加)时候才会执行,很多时候我们直接在onUpgrade()里添加我们想插入的表或者列,但会报错,那是因为你之前版本onUpgrade里的语句会再次执行,若之前插入了表.或者行,此时会再执行一次,因此每次

Python操作SQLite数据库

连接数据库 从2.5版本开始,Python的标准库中就有了一个专门用于SQLite的sqlite3模块.连接SQLite数据库方式如下: import sqlite3 as dbapi con = dbapi.connect('population.db') cur = con.cursor() 第一个语句用于引用数据库API: 第二个语句创建了一个到数据库的连接(connection):调用数据库模块的connect方法.该方法的参数是一个字符串,它定义了我们所要连接的那个数据库.由于SQLi

Android SQLite数据库使用示例

简单介绍一下,现在的主流移动设备像Android.iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧.对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取. 下面我们用SQLite来开发一个英语词典.下图是项目结构-- MySQLite.java package sn.qdj.sqlitedemo; im

Windows通过脚本建立SQLite数据库

用脚本建立一个SQLite数据库 依次建立以下两个文件: 1)一个BAT文件:script.bat @ECHO OFF C: CD %HOMEPATH%/Desktop SQLITE3 TEST_DB.DB < a.sql SQLITE3 TEST_DB.DB .dump > result.sql Sqlite3程序可以从Sqlite的官方网站上下载到 2)一个SQL文件:a.sql,里面存储了SQLite的建库脚本,如下例: --SQLite脚本 a.sql --创建PERSONS类 CRE

Android 使用存放在存assets文件夹下的SQLite数据库

因为这次的项目需要自带数据,所以就就把数据都放到一个SQLite的数据库文件中了,之后把该文件放到了assets文件夹下面.一开始打算每次都从assets文件夹下面把该文件夹拷贝到手机的SD卡或者手机自身的存储上之后再使用,后来考虑到每次都拷贝的话效率不高,并且如果涉及到对数据库的修改操作的话拷贝之后数据就被恢复了. 因此就写了该封装,该封装只是在第一次使用数据库文件的时候把该文件夹拷贝到手机的/data/data/应用程序报名/database文件夹下,之后就直接从这个地方使用了.并且它允许你

SqlIte数据库并发性

把遇到的一些小问题都记下来,告诉自己,一些小细节会铸成打错的 今天没事复习以前的知识,用sqlite做数据库,发现修改数据的时候等好久才有反应,而且还失败,可是过一会之后又会好,好了以后又是一样,种以为是自己的语句有问题,测试了好多次,感觉没问题,在到网上查查错误才发现,原来sqlite不可以并发处理数据,我要说的不是这个问题,一个好的习惯可以避免所有的小问题,前面的解决方法就是把datareader等要释放的释放,关闭的关闭就可以,这本来就是要的,但是自己却没有这么做,这一个小问题纠结了我一个