iOS开发数据库篇—SQLite的应用

一、简单说明

  在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入主头文件。

  

导入头文件,可以使用库中的函数(是纯C语言的)

二、具体说明

新建一个项目,在项目的主界面中放四个按钮(分别是,增加、删除、修改、查询)。

1.sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)函数的一些说明:

(1)作用:把一个文件名称传递给他,它会自动检测这个文件是否存在,如果不存在的话,会自动创建相应的文件(这里为数据库文件,刚创建为空)。

(2)参数:它的第一个参数为文件的名称(需转换为C语言的),第二个参数是数据库的实例,sqlite3 *db;

  说明:sqlite3是一种类型,db是数据库的句柄,就是数据库的象征,如果要进行增删改查,就得操作db这个实例。

(3)返回值:它的返回值为int型的,根据函数的返回值可以知道,打开数据库文件是成功还是失败,如果返回值是SQLITE_OK则说明成功,否则为失败。

2.打开数据库

  实现代码和显示:

查看沙盒内创建的数据库文件:

  

双击打开,查看发现打开的数据库连接名称为students,默认为文件名的前缀,数据库创建成功。

  

3.创建表

  函数说明:

  

  参数:第一个参数为数据库的句柄(db),第二个参数为sql语句,第三个参数为回调参数,是一个指向函数的指针,如果把callback前面的*改成^则就是一个block代码段,第四个参数可以写NULL,第五个参数为错误信息,用以代码调试。

     //1.打开数据库文件(如果数据库文件不存在,那么该函数会自动创建数据库文件)
int result = sqlite3_open(cfileName, &db);
if (result==SQLITE_OK) { //打开成功
NSLog(@"成功打开数据库"); //2.创建表
const char *sql="CREATE TABLE IF NOT EXISTS t_students (id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);";
char *errmsg=NULL;
result = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if (result==SQLITE_OK) {
NSLog(@"创表成功");
}else
{
NSLog(@"创表失败----%s",errmsg);
}
}else
{
NSLog(@"打开数据库失败");
}

  执行后,创表成功,打开创建的表查看:

调试技巧:

    if (result==SQLITE_OK) {
NSLog(@"创表成功");
}else
{
// NSLog(@"创表失败----%s",errmsg);
printf("创表失败---%s----%s---%d",errmsg,__FILE__,__LINE__);
}

  __FILE__宏打印文件名,

  __LINE__宏打印行号。

  

4.插入数据

  实现代码:

 - (IBAction)insert {
for (int i=; i<; i++) {
//1.拼接SQL语句
NSString *name=[NSString stringWithFormat:@"文晓--%d",arc4random_uniform()];
int age=arc4random_uniform()+;
NSString *sql=[NSString stringWithFormat:@"INSERT INTO t_students (name,age) VALUES ('%@',%d);",name,age]; //2.执行SQL语句
char *errmsg=NULL;
sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, &errmsg);
if (errmsg) {//如果有错误信息
NSLog(@"插入数据失败--%s",errmsg);
}else
{
NSLog(@"插入数据成功");
}
}
}

  打印查看:

查看数据库里t_students表中的数据:

5.选择(select)查询操作

  函数说明:

  select操作也可以使用sqlite3_exec函数实现,但通常使用下面的函数。

  

  参数:第一个参数为数据库的句柄,第二个参数为sql语句,第三个参数为sql的长度(如果设置为-1,则代表系统会自动计算sql语句的长度),第四个参数用来取数据,第五个参数为尾部一般用不上可直接写NULL。

  示例代码:

 - (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(@"查询语句有问题");
} }

  打印查看查询结果:

三、补充

  完整代码:

   YYViewController.m文件

 //
// YYViewController.m
// 02-SQLite的应用
// #import "YYViewController.h"
#import <sqlite3.h> @interface YYViewController ()
//db是数据库的句柄,就是数据库的象征,要对数据库进行增删改查,就得操作这个实例
@property(nonatomic,assign)sqlite3 *db;
- (IBAction)insert;
- (IBAction)delete;
- (IBAction)update;
- (IBAction)select; @end @implementation YYViewController - (void)viewDidLoad
{
[super viewDidLoad]; // sqlite3 *db; //获得数据库文件的路径
NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *fileName=[doc stringByAppendingPathComponent:@"students.sqlite"];
//将OC字符串转换为c语言的字符串
const char *cfileName=fileName.UTF8String; //1.打开数据库文件(如果数据库文件不存在,那么该函数会自动创建数据库文件)
int result = sqlite3_open(cfileName, &_db);
if (result==SQLITE_OK) { //打开成功
NSLog(@"成功打开数据库"); //2.创建表
const char *sql="CREATE TABLE t_students (id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);";
char *errmsg=NULL;
result = sqlite3_exec(self.db, sql, NULL, NULL, &errmsg);
if (result==SQLITE_OK) {
NSLog(@"创表成功");
}else
{
// NSLog(@"创表失败----%s",errmsg);
printf("创表失败---%s----%s---%d",errmsg,__FILE__,__LINE__);
}
}else
{
NSLog(@"打开数据库失败");
}
} - (IBAction)insert {
for (int i=; i<; i++) {
//1.拼接SQL语句
NSString *name=[NSString stringWithFormat:@"文晓--%d",arc4random_uniform()];
int age=arc4random_uniform()+;
NSString *sql=[NSString stringWithFormat:@"INSERT INTO t_students (name,age) VALUES ('%@',%d);",name,age]; //2.执行SQL语句
char *errmsg=NULL;
sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, &errmsg);
if (errmsg) {//如果有错误信息
NSLog(@"插入数据失败--%s",errmsg);
}else
{
NSLog(@"插入数据成功");
}
}
} - (IBAction)delete {
} - (IBAction)updata {
} - (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(@"查询语句有问题");
} }
@end

iOS开发数据库篇—SQLite的应用的更多相关文章

  1. iOS开发数据库篇—SQLite简单介绍

    iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...

  2. IOS开发数据库篇—SQLite模糊查询

    IOS开发数据库篇—SQLite模糊查询 一.示例 说明:本文简单示例了SQLite的模糊查询 1.新建一个继承自NSObject的模型 该类中的代码: // // YYPerson.h // 03- ...

  3. iOS开发数据库篇—SQLite常用的函数

    iOS开发数据库篇—SQLite常用的函数 一.简单说明 1.打开数据库 int sqlite3_open( const char *filename,   // 数据库的文件路径 sqlite3 * ...

  4. 【转】 iOS开发数据库篇—SQLite简单介绍

    开始学SQLite啦, 原文: http://www.cnblogs.com/wendingding/p/3868893.html iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中 ...

  5. iOS开发数据库篇—SQL

    iOS开发数据库篇—SQL 一.SQL语句 如果要在程序运行过程中操作数据库中的数据,那得先学会使用SQL语句 1.什么是SQL SQL(structured query language):结构化查 ...

  6. iOS开发数据库篇—FMDB简单介绍

    iOS开发数据库篇—FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来 ...

  7. iOS开发数据库篇—FMDB数据库队列

    iOS开发数据库篇—FMDB数据库队列 一.代码示例 1.需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库. 2.代码如下: // // YYViewContr ...

  8. iOS开发数据库篇—SQL代码应用示例

    iOS开发数据库篇—SQL代码应用示例 一.使用代码的方式批量添加(导入)数据到数据库中 1.执行SQL语句在数据库中添加一条信息 插入一条数据的sql语句: 点击run执行语句之后,刷新数据 2.在 ...

  9. iOS开发数据库-FMDB

    前言 FMDB是以OC的方式封装了SQLite的C语言API,使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码:对比苹果自带的Core Data框架,更加轻量级和灵活:提供了多线程安全的数据库操 ...

随机推荐

  1. HDU 3695 Computer Virus on Planet Pandora(AC自动机模版题)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  2. php实现实现代码多主从,切换,轮询,健康检查

    现在很多框架现在都提供数据库读写分离,比如CI,TP,YII,一般使用正则表达书判断sql语句是读操作,还是写操作,但是有个缺点,没有给用主动判断,比如写入操作必须去立即读取主数据库的,如果不能立即判 ...

  3. Codeforces Round #346 (Div. 2) E F

    因为很久没有个人认真做题了 昨天晚上开了场虚拟cf来锻炼个人手速 选的是第一次做cf的场 那时候7出3还被hack...之后也没补题 这次做的时候顺便回忆了一下以前比赛的时候是怎么想的 发现经验还是很 ...

  4. DropDownList 绑定DataTable并给默认值

    string sql = @"SELECT FG_Id, FG_Name, FG_Sort, FG_IsDel FROM dbo.FirstGestation";          ...

  5. cookbook学习第一弹

    1.1现在有一个包含N个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给N个变量 代码: >>>p = (4,5) >>>x,y = p >>&g ...

  6. LNMP-Linux下Nginx+MySQL+PHP+phpMyAdmin+eAcelerator一键安装包

    LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RadHat.Debian/Ubuntu VPS(VDS)或独立主机安装LNMP(Nginx.MySQL.PHP.phpMyA ...

  7. What is the difference between parameterized queries and prepared statements?

    Both parameterized queries and prepared statements are exactly the same thing. Prepared statement se ...

  8. Python开发【第七章】:Python面向对象进阶

    1.静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类 ...

  9. Python之路-python(paramiko,进程和线程的区别,GIL全局解释器锁,线程)

    一.paramiko 二.进程.与线程区别 三.python GIL全局解释器锁 四.线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生 ...

  10. fgets函数

    打开文件 fopen("需要打开的路径") 然后使用fgets函数读取行 #include <stdio.h> #include <stdlib.h> #i ...