SQLite关系型数据库的使用

数据库(Database): 存放数据的仓库, 存放的是一张的表, 特别像Excel, Numbers, 都以表格的形式存放数据, 可以创建多张表。

常见的数据库: sqlite, MySQL, SQLServer, Oracle, Access。

使用数据库,主要是因为文件读写和归档读取数据需要一次把数据全部读出来, 占用内存开销大;其次是数据库数据效率高, 体现在增删改查。

数据库存储数据的步骤

1、新建一个数据库

2、新建一张表(table)

3、添加多个字段(column,列,属性)

4、添加多行记录(row,每行存放多个字段对应的值)

数据库的操作语句 (增删改查),即SQL(Structured Query Language)

SQL 语句不区分大小写, 字符串需要加""或‘‘

常用语法:(主键: 是一条数据的唯一标示符, 一张表只能有一个主键, 主键不能够重复, 一般把主键名设为"id", 不需要赋值, 会自增;*代表所有的字段;where是条件)

1 表操作

(1)创建表: creat table 表名 (字段名字段数据类型 是否为主键, 字段名 字段数据类型, 字段名 字段数据类型...)

(2)修改表名:ALTER TABLE 旧表名  RENAME TO 新表名

(3)删除表:DROP TABLE 表名

(4)表添加一列:ALTER TABLE 表名 ADD COLUMN 列名数据类型 限定符

2 表数据操作

(1)查: select 字段名 (或者*) from 表名 where 字段名 = 值

(2)加: insert into 表名 (字段1, 字段2...) values (值1, 值2...)

(3)改: update 表名 set 字段 = 值 where 字段 = 值

(4)删: delete from 表名 where 字段 = 值

SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就足够了。它的处理速度比Mysql、PostgreSQL这两款著名的数据库都还快。

SQLite名词解释

2个重要结构体

1 sqlite3 *pdb(数据库句柄,跟文件句柄FILE类似)

2 sqlite3_stmt *stmt(这个相当于ODBC的Command对象,用于保存编译好的SQL语句)

5个主要函数

1 sqlite3_open()(打开数据库)

2 sqlite3_exec()(执行非查询的sql语句)

3 sqlite3_prepare()(准备sql语句,执行select语句或者要使用parameterbind时,用这个函数(封装了sqlite3_exec))

4 Sqlite3_step()(在调用sqlite3_prepare后,使用这个函数在记录集中移动)

5 Sqlite3_close()(关闭数据库文件)

SQLite 存储类

1 NULL(值是一个 NULL 值)

2 INTEGER(值是一个带符号的整数,根据值的大小存储在1、2、3、4、6 或 8 字节中)

3 REAL(值是一个浮点值,存储为 8 字节的 IEEE 浮点数字)

4 TEXT (值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储)

5 BLOB (值是一个 blob 数据,完全根据它的输入存储)

SQLite常用语句

1、打开数据库 sqlite3_open函数

2、预处理SQL语句sqlite3_prepare_v2函数

3、绑定参数sqlite3_bind_text函数

4、执行SQL语句sqlite3_step函数(状态:*SQLITE_BUSY-数据库被锁定、*SQLITE_DONE-成功执行过程、*SQLITE_ROW-返回一行结果、*SQLITE_ERROR-运行错误、*SQLITE_MISUSE-错误的使用了本函数)

5、提取字段数据sqlite3_column_text、sqlite3_column_blob、sqlite3_column_int等函数

6、释放statement对象资源 sqlite3_finalize函数

7、关闭数据库 sqlite3_close函数

SQLite的使用

1、在iOS中使用SQLite时,首先需要添加库文件libsqlite3.tbd

2、导入主头文件 #import<sqlite3.h>

3、数据库操作(注:设置数据库名称及路径)

示例代码:

设置数据库路径

- (void)setSQLitePath

{

if (self.filePath == nil)

{

// document目录下

NSArray *documentArray =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);

NSString *document = [documentArray objectAtIndex:0];

_filePath = [document stringByAppendingPathComponent:SQLiteFile];

}

NSLog(@"filePath %@", _filePath);

}

打开数据库,创建表

- (void)New

{

NSString *sql = @"CREATE TABLE IF NOT EXISTS STUDENT(NAME TEXTPRIMARY KEY, ADDRESS TEXT, PHONE TEXT)";

if (sql && 0 != sql.length)

{

[self setSQLitePath];

if ([[NSFileManager defaultManager] fileExistsAtPath:self.filePath])

{

// 打开数据库

sqlite3 *dataBase; // sqlite3

const char *fileName = [self.filePath UTF8String]; // [xxx UTF8String]是将NSString转换为C字符串,因为SQLite3是采用可移植的C(而不是            Objective-C)编写的,它不知道什么是NSString.

int openStatus = sqlite3_open(fileName, &dataBase);

if (openStatus != SQLITE_OK)

{

// 数据库打开失败,关闭数据库

sqlite3_close(dataBase);

NSAssert(0, @"打开数据库失败");

NSLog(@"打开数据库失败");

}

NSLog(@"打开数据库成功");

// 创建表

char *errorMsg;

const char *execSql = [sql UTF8String];

int execStatus = sqlite3_exec(dataBase,execSql, NULL, NULL, &errorMsg);

if (execStatus != SQLITE_OK)

{

// 创建表失败,关闭数据库

sqlite3_close(dataBase);

NSAssert1(0, @"创建表失败:%s",errorMsg);

}

NSLog(@"创建表成功");

}

}

}

插入数据

- (void)Insert

{

// ?号表示一个未定的值

NSString *sql = @"INSERT OR REPLACE INTO STUDENT (NAME, ADDRESS,PHONE) VALUES (?,?,?)";

if (sql && 0 != sql.length)

{

[self setSQLitePath];

if ([[NSFileManager defaultManager] fileExistsAtPath:self.filePath])

{

// 打开数据库

sqlite3 *dataBase; // sqlite3

const char *fileName = [self.filePath UTF8String];

int openStatus = sqlite3_open(fileName,&dataBase);

if (openStatus != SQLITE_OK)

{

// 数据库打开失败,关闭数据库

sqlite3_close(dataBase);

NSAssert(0, @"打开数据库失败");

NSLog(@"打开数据库失败");

}

NSLog(@"打开数据库成功");

const char *execSql = [sql UTF8String];

sqlite3_stmt *statment;

int execStatus = sqlite3_prepare_v2(dataBase, execSql, -1,&statment, nil); // 接口把一条SQL语句解析到statement结构里去. 使用该接口访问数据库是当前比较好的的一种方法

if (execStatus == SQLITE_OK)

{

NSLog(@"插入更新表成功");

// 绑定参数开始

// 这里的数字1,2,3代表上面的第几个问号,这里将三个值绑定到三个绑定变量

sqlite3_bind_text(statment, 1,[@"zhangshaoyu" UTF8String], -1, NULL);

sqlite3_bind_text(statment, 2,[@"meizhou" UTF8String], -1, NULL);

sqlite3_bind_text(statment, 3,[@"13800138000" UTF8String], -1, NULL);

// 执行SQL语句 执行插入

if (sqlite3_step(statment) !=SQLITE_DONE)

{

NSAssert(NO, @"插入更新表失败。");

}

else

{

NSLog(@"插入更新表成功");

}

}

else

{

NSLog(@"插入更新表失败");

}

// 释放sqlite3_stmt对象资源

sqlite3_finalize(statment);

// 关闭数据库

sqlite3_close(dataBase);

}

}

}

修改更新数据

- (void)Update

{

NSString *sql = @"UPDATE STUDENT SET ADDRESS = ? where NAME =?";

if (sql && 0 != sql.length)

{

[self setSQLitePath];

if ([[NSFileManager defaultManager]fileExistsAtPath:self.filePath])

{

// 打开数据库

sqlite3 *dataBase; // sqlite3

const char *fileName = [self.filePath UTF8String];

int openStatus = sqlite3_open(fileName, &dataBase);

if (openStatus != SQLITE_OK)

{

// 数据库打开失败,关闭数据库

sqlite3_close(dataBase);

NSAssert(0, @"打开数据库失败");

NSLog(@"打开数据库失败");

}

NSLog(@"打开数据库成功");

const char *execSql = [sql UTF8String];

sqlite3_stmt *statment;

int execStatus = sqlite3_prepare_v2(dataBase, execSql, -1,&statment, nil);

if (execStatus == SQLITE_OK)

{

NSLog(@"更新表成功");

// 绑定text类型的数据库数据

// 这里的数字1,2,3代表第几个问号。这里只有1个问号,这是一个相对比较简单的数据库操作,真正的项目中会远远比这个复杂

sqlite3_bind_text(statment, 1,[@"meizhouWUHUA" UTF8String], -1, NULL);

sqlite3_bind_text(statment, 2,[@"zhangshaoyu" UTF8String], -1, NULL);

// 执行插入

if (sqlite3_step(statment) !=SQLITE_DONE)

{

NSAssert(NO, @"更新表失败。");

}

else

{

NSLog(@"更新表成功");

}

}

else

{

NSLog(@"更新表失败");

}

// 释放sqlite3_stmt对象资源

sqlite3_finalize(statment);

// 关闭数据库

sqlite3_close(dataBase);

}

}

}

查找数据

- (void)Select

{

NSString *sql = @"SELECT * FROM STUDENT";

if (sql && 0 != sql.length)

{

[self setSQLitePath];

if ([[NSFileManager defaultManager] fileExistsAtPath:self.filePath])

{

// 打开数据库

sqlite3 *dataBase; // sqlite3

const char *fileName = [self.filePath UTF8String];

int openStatus = sqlite3_open(fileName, &dataBase);

if (openStatus != SQLITE_OK)

{

// 数据库打开失败,关闭数据库

sqlite3_close(dataBase);

NSAssert(0, @"打开数据库失败");

NSLog(@"打开数据库失败");

}

NSLog(@"打开数据库成功");

const char *execSql = [sql UTF8String];

sqlite3_stmt *statment;

int execStatus = sqlite3_prepare_v2(dataBase, execSql, -1,&statment, nil);

if (execStatus == SQLITE_OK)

{

NSLog(@"查询成功");

// 查询成功,执行遍历操作

// 查询结果集中一条一条的遍历所有的记录,这里的数字对应的是列值,注意这里的列值,跟上面sqlite3_bind_text绑定的列值不一样!一定要分开,不然会crash,只有这一处的列号不同,注意!

while(sqlite3_step(statment) ==SQLITE_ROW)

{

const char *NAME = (char*)sqlite3_column_text(statment, 0);

if (NAME != NULL)

{

NSString *name =[[NSString alloc] initWithUTF8String:NAME];

NSLog(@"NAME%@", name);

}

char *ADDRESS = (char*)sqlite3_column_text(statment, 1);

if (ADDRESS != NULL)

{

NSString *address =[[NSString alloc] initWithUTF8String:ADDRESS];

NSLog(@"ADDRESS%@", address);

}

char *PHONE = (char*)sqlite3_column_text(statment, 2);

if (PHONE != NULL)

{

NSString *phone =[[NSString alloc] initWithUTF8String:PHONE];

NSLog(@"PHONE%@", phone);

}

}

}

else

{

NSLog(@"查询失败");

}

// 释放sqlite3_stmt对象资源

sqlite3_finalize(statment);

// 关闭数据库

sqlite3_close(dataBase);

}

}

}

删除数据

- (void)Delete

{

//   NSString *sql = @"DELETE FROM STUDENT"; // 方法1

NSString *sql = @"DELETE FROM STUDENT where NAME = ?"; // 方法2

if (sql && 0 != sql.length)

{

[self setSQLitePath];

if ([[NSFileManager defaultManager] fileExistsAtPath:self.filePath])

{

// 打开数据库

sqlite3 *dataBase; // sqlite3

const char *fileName = [self.filePath UTF8String];

int openStatus = sqlite3_open(fileName,&dataBase);

if (openStatus != SQLITE_OK)

{

// 数据库打开失败,关闭数据库

sqlite3_close(dataBase);

NSAssert(0, @"打开数据库失败");

NSLog(@"打开数据库失败");

}

NSLog(@"打开数据库成功");

const char *execSql = [sql UTF8String];

sqlite3_stmt *statment;

int execStatus = sqlite3_prepare_v2(dataBase, execSql, -1, &statment,nil);

if (execStatus == SQLITE_OK)

{

// 绑定text类型的数据库数据

// 这里的数字1,2,3代表第几个问号。这里只有1个问号,这是一个相对比较简单的数据库操作,真正的项目中会远远比这个复杂

sqlite3_bind_text(statment, 1,[@"zhangshaoyu" UTF8String], -1, NULL);

// 执行删除

if (sqlite3_step(statment) !=SQLITE_DONE)

{

NSAssert(NO, @"删除数据失败。");

NSLog(@"删除数据失败");

}

else

{

NSLog(@"删除数据成功");

}

}

else

{

NSLog(@"删除数据失败");

}

// 释放sqlite3_stmt对象资源

sqlite3_finalize(statment);

// 关闭数据库

sqlite3_close(dataBase);

}

}

}

删除表

- (void)DeleteTable

{

NSString *sql = @"DROP TABLE STUDENT";

if (sql && 0 != sql.length)

{

[self setSQLitePath];

if ([[NSFileManager defaultManager] fileExistsAtPath:self.filePath])

{

// 打开数据库

sqlite3 *dataBase; // sqlite3

const char *fileName = [self.filePath UTF8String];

int openStatus = sqlite3_open(fileName, &dataBase);

if (openStatus != SQLITE_OK)

{

// 数据库打开失败,关闭数据库

sqlite3_close(dataBase);

NSAssert(0, @"打开数据库失败");

NSLog(@"打开数据库失败");

}

NSLog(@"打开数据库成功");

const char *execSql = [sql UTF8String];

sqlite3_stmt *statment;

int execStatus = sqlite3_prepare_v2(dataBase, execSql, -1,&statment, nil);

if (execStatus == SQLITE_OK)

{

// 执行删除

if (sqlite3_step(statment) !=SQLITE_DONE)

{

NSAssert(NO, @"删除表失败。");

NSLog(@"删除表失败");

}

else

{

NSLog(@"删除表成功");

}

}

else

{

NSLog(@"删除表失败");

}

// 释放sqlite3_stmt对象资源

sqlite3_finalize(statment);

// 关闭数据库

sqlite3_close(dataBase);

}

}

}

数据查看

注意事项:

1、由于sqlite3是基于C语言编写的,而不是纯粹的object-c,所以有关字符串,我们不能使用NSString,因为它不识别,所以只能用c语言的字符串,char*,好在Nsstring提供了转换的方法,那就是
UTF8String。如:

NSString*sql = @"DELETE FROM STUDENT where NAME = ?";

constchar *execSql = [sql UTF8String];

2、sql语句中,不确定值使用?符号。如:

NSString*sql = @"DELETE FROM STUDENT where NAME = ?";

3、提取查询数据函数中的数字表示sql语句中的第几列(0~N)。如:

表示第1列:constchar *NAME = (char *)sqlite3_column_text(statment, 0);

4、绑定数据时函数中的数字表示sql语句中的第几个值。如:

NSString*sql = @"INSERT OR REPLACE INTO STUDENT (NAME, ADDRESS, PHONE) VALUES(?,?,?)";

表示第1个值:sqlite3_bind_text(statment,1, [@"zhangshaoyu" UTF8String], -1, NULL);

表示第2个值:sqlite3_bind_text(statment,2, [@"meizhou" UTF8String], -1, NULL);

表示第3个值:sqlite3_bind_text(statment,3, [@"13510213244" UTF8String], -1, NULL);

5、创建表时,必须设置一个主键PRIMARY KEY。如:

NSString*sql = @"CREATE TABLE IF NOT EXISTS STUDENT(NAME TEXT PRIMARY KEY, ADDRESSTEXT, PHONE TEXT)";

时间: 2024-11-05 12:24:14

SQLite关系型数据库的使用的相关文章

数据缓存——SQLite关系型数据库的使用

SQLite关系型数据库的使用 Demo下载地址 数据库(Database): 存放数据的仓库, 存放的是一张的表, 特别像Excel, Numbers, 都以表格的形式存放数据, 可以创建多张表. 常见的数据库: sqlite, MySQL, SQLServer, Oracle, Access. 使用数据库,主要是因为文件读写和归档读取数据需要一次把数据全部读出来, 占用内存开销大:其次是数据库数据效率高, 体现在增删改查. 数据库存储数据的步骤 1.新建一个数据库 2.新建一张表(table

SQLite关系型数据库

SQLiteOpenHelper的使用:       首先声明一个DatabaseHelper类,这个类继承于SQLiteOpenHelper类,首先得有构造函数,声明DatabaseHelper类如下: //DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能 //第一,getReadableDatabase(),getWriteableDatabase()可以获得SQLiteDatabase对象,通过该对象对数据库进行操作 //第二,提供了onCreate()和o

Android本地数据存储之SQLite关系型数据库 ——SQLiteDatabase

数据库的创建,获取,执行sql语句: 框架搭建:dao 思考: 1.数据库保存在哪里? 2.如何创建数据库?如何创建表? 3.如何更新数据库?如何更改表的列数据? 4.如何获取数据库? 5.如何修改数据库中的表的数据? 框架思想 思考:如何使得编程更加简单? 一个sql语言,容易写错: 1.使用占位符: 2.框架解析重建法:搭建框架,对增删改查功能进行单独封装,传入容器对象即可: 思考: 1.数据库保存在哪里? data/data/包名/databases/xiaoo.db 2.如何创建数据库?

SQLite -- 嵌入式关系型数据库

SQLite -- 嵌入式关系型数据库 1.SQLite的数据类型:Typelessness(无类型) 1,能够保存不论什么类型的数据到表的随意列中 2.支持常见的类型如: NULL, VARCHAR, TEXT, INTEGER, BLOB, CLOB等 3,唯一的例外:integer primary key 此字段仅仅能存储64位整数,即当主键被定义为integer时仅仅能存储64位整数 注意:SQLite数据库中列一旦创建不能改动,假设一定要改动,须要又一次创建表,拷贝数据 2,Andro

android开发之 SQLite(数据库)

SQLite数据库存储:SQLite是一款轻量级的关系型数据库,它的运算速度非常快, 占用资源很少,通常只需要几百 K的内存就足够了,因而特别适合在移动设备上使用. 第一: 创建一个数据库.(Android为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper帮 助类,借助这个类就可以非常简单地对数据库进行创建和升级.) SQLiteOpenHelper是一个抽象类,这意味着如果我们想要使用它的话, 就需要创建一个自己的帮助类去继承它.SQLiteOpenHelpe

关系型数据库与NoSQL的对比

SQL(结构化的查询语言)数据库是过去四十年间存储数据的主要方式.20世纪90年代末随着Web应用和MySQL.PostgreSQL和SQLite等开源数据库的兴起,用户爆炸式的增长. NoSQL数据库自从20世纪60年代就已经存在了,直到MongoDB, CouchDB, Redis 和 Apache Cassandra等数据库的流行才获取了更多的关注. 你可以很容易地找到许多关于如何使用一款特定的SQL或NoSQL的教程,但是很少有讨论你为什么优先的使用一款而不适用另一款.我希望我能够填补这

Linux安装SQLite轻量级数据库

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl.C#.PHP.Java等,还有ODBC接口,同样比起Mysql.PostgreSQL这两款开源的世界著名数据库管理

关系型数据库工作原理-时间复杂度(翻译自Coding-Geek文章)

本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies 本文翻译了如下章节: 一. 前言 谈到关系型数据库,我想不到有什么东西能缺少它,可以说关系型数据已经无处不在.存在各种不同的关系型数据库:从轻量有用的SQLite到功能强悍的数据仓库. 但是,这只是一篇介绍关系型数据库工作原

关系型数据库工作原理-事务管理(二)(翻译自Coding-Geek文章)

本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies 紧接上一篇文章,本文翻译了如下章节: 一. Log manager(日志管理) 通过前面的章节,我们已经知道,为了提升性能,数据库会将数据缓存在内存中.但是,如果在事务提交过程中,数据库服务器崩溃了.缓存在内存的数据就会丢失