数据库-SQLite
技术博客http://www.cnblogs.com/ChenYilong/
新浪微博http://weibo.com/luohanchenyilong
数据库-SQLite
技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong
iOS应用数据存取的常用方式
• XML属性列表 -- PList
• NSKeyedArchiver 归档 •Preference(偏好设置) • SQLite3
• Core Data(以面向对象的方式操作数据库SQLite)
为什么要使用数据库?
• 大量的数据


• 数据库的种类:
• 主流数据库 Ø PC端:DB2、Oracle、Sybase、MySQL、SQLServer Ø 嵌入式\客户端:SQLite



• 数据库的存储结构跟excel类似 - 表(table)
- 记录(row),每行都有很多个字段 - 字段(column)
• SQL语句
- SQL(structured query language):结构化查询语言,一种对关系数据库
中的数据进行定义和操作的句法
- 要操作和访问数据库中存储的数据,必须编写SQL语句
- SQL语句是不区分大小写的(即大小写一样)
- SQL语句都以分号;结尾

• 数据定义语言(DDL:Data Definition Language)
Ø 其语句包括动词CREATE和DROP
Ø 在数据库中创建新表或删除表(CREAT TABLE 或DROP TABLE)
• 数据操作语言(DML:Data Manipulation Language)
Ø 其语句包括INSERT,UPDATE和DELETE,它们分别用于添加,修改和删除表
中的行
Ø 也称为动作查询语言
• 数据查询语言(DQL:Data Query Language)
Ø 也称为“数据检索语句”,用以从表中获得数据
Ø 保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留 字有WHERE,ORDER BY,GROUP BY和HAVING

• 创表 CREATE TABLE 表名 (字段名1 字段类型1, 字段名2 字段类型2, ...);
CREATE TABLE IF NOT EXISTS 表名 (字段名1 字段类型1,字段名2 字段类型2, ...);
示例:
CREATE TABLE IF NOT EXISTS T_Person (id INTEGER, name TEXT, gender INTEGER, age INTEGER, height REAL);
• 删表 DROP TABLE 表名;
示例:
DROP TABLE T_Person;

• SQLite将数据值的存储划分为以下几种存储类型:
Ø NULL: 表示该值为NULL值
Ø INTEGER: 无符号整型值
Ø REAL: 浮点值
Ø TEXT: 文本字符串
Ø BLOB: 二进制数据(比如文件)
• 实际上SQLite是无类型的,建表时声明或不声明类型都可以,也就意味着创表 语句可以这么写:
create table t_student(name, age);
• 注意:为了保持良好的编程规范,方便程序员之间的交流,编写建表语句的 时候最好加上每个字段的具体类型

• 插入数据(INSERT) INSERT INTO 表名(字段1, 字段2, ...)VALUES (字段1的值, 字段2的值, ...); 示例:INSERT INTOT_Person (name, age) VALUES ('张三', 18); 注意:数据库中的字符串内容应该用单引号’括住 • 更新数据(UPDATE) UPDATE 表名 SET 字段1 = 字段1的值, 字段2 = 字段2的值, ... ;
示例:UPDATE T_Person SET name = '李四', age = 20; 注意:这里会将T_Person表中所有记录的name都改为李四,age都改为20 • 删除数据(DELETE) DELETE FROM 表名;
示例:DELETE FROM T_Person;
注意:这里会将T_Person表中所有记录都删掉

• 如果只想更新或者删除某些固定的记录,就需要在DML语句后加上一 些条件
• 条件语句的格式如下: WHERE 字段 = 某个值AND 字段 > 某个值; WHERE 字段 = 某个值 OR 字段= 某个值;
• 示例 • 将年龄大于10并且姓名不等于jack的记录年龄都改为5
UPDATE T_Person SET age = 5 WHERE age > 10AND name != ‘张三’;
• 删除年龄小于等于10或者年龄大于30的记录DELETE FROM T_Person WHERE age < 10 OR age > 30;

• DQL语句就是查询语句,格式如下: SELECT 字段1,字段2, ... FROM 表名; SELECT name, age FROMT_Person;
• 如果想查询所有的字段可以用: SELECT * FROM表名;
SELECT * FROM T_Person;
• 也可以添加条件语句 SELECT * FROM T_PersonWHERE age > 10;
• 计算记录的数量可以用count(字段)或者count(*)SELECT count(*) FROM T_Person;
SELECT count(*) FROM T_Person WHERE height < 1.68;

• 查询出来的结果可以用order by进行排序SELECT * FROM T_Person ORDER BY 字段; SELECT* FROM T_Person ORDER BY age;
• 默认是按照升序排序(由小到大),也可以变为降序(由大到小) SELECT * FROM T_Person ORDER BY age DESC; // 降序 SELECT * FROM T_PersonORDER BY age ASC; // 升序(默认)
• 也可以用多个字段进行排序 SELECT * FROMT_Person ORDER BY age ASC, height DESC; 先按照年龄排序(升序),年龄相等就按照身高排序(降序)

SELECT * FROM 表名 LIMIT 数值1, 数值2; SELECT *FROM T_Person LIMIT 4, 8; 上面的语句,可以这么理解: •跳过最前面4条语句,然后取8条记录
• LIMIT常用来做分页查询,比如每页固定显示6条数据,那么每一页应该这样 取数据:
第1页:LIMIT 0, 6 第2页:LIMIT 6, 6 第3页:LIMIT 12, 6 ...
第n页:LIMIT 6*(n-1), 6
SELECT * FROM T_Person LIMIT 5;

• 建表的时候可以给特定的字段 设置 一些约束条件
Ø 用NOT NULL指定字段的值不能为null
Ø 用UNIQUE指定字段的值必须唯一
Ø 用DEFAULT指定字段的默认值
CREATE TABLE T_Student (id INTEGER, name TEXTNOT NULL UNIQUE, age INTEGER NOT NULL DEFAULT 1);
Ø name字段不能为NULL,并且唯一

这些数据,造成数据库的记录不唯一,这样不方便管理数据
• 良好的数据库编程规范应该是要保证每条记录的唯一性,为此,增加
了主键约束
• 主键是用来唯一地标识某一条记录的,可以是一个字段或多个字段
• 比如T_Person可以增加一个id字段作为主键,相当于人的身份证
• 主键的设计原则:

• 只要声明为PRIMARYKEY,就说明是⼀一个主键字段,主键字段默认就 包含了NOT NULL和UNIQUE两个约束
• 如果想要让主键⾃自动增⻓长(integer类型),应该增加 AUTOINCREMENT
CREATE TABLE T_Student (id integer PRIMARY KEY AUTOINCREMENT, name text, age integer);
• 新建一个外键
CREATE TABLE T_Student (
id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL,
age INTEGER NOT NULL DEFAULT 1,
book_id INTEGER,
FOREIGN KEY (book_id) REFERENCES T_Book (id)ON DELETE SET NULL,
UNIQUE ("name" ASC) )
T_Student表中有⼀一个外键book_id引⽤用着T_Book的主键id

• 查询拥有《如来神掌》这本书的所有学生
SELECT s.name, s.age, b.name bookNameFROM T_Student s
JOIN T_Book b ON b.id = s.book_id; WHEREb.name = ‘如来神掌';
• JOIN和ON用来建立两个表之间的关联关系

存开销小
• SQLite3是无类型的,意味着可以保存任何类型的数据到任意表的任意 字段中。比如下列的创表语句是合法的:
CREATE TABLE T_Person(name, age);
• 为了保证可读性,建议还是把字段类型加上:
CREATE TABLE T_Person(name text, age integer);
• SQLite3常用的5种数据类型:text、integer、float、boolean、blob
• 在iOS中要使用SQLite3,需要添加库文件:libsqlite3.dylib并导入主头 文件,这是一个C语言的库

1. 创建数据库(sqlite3_opendb) 2. 单步执行操作(sqlite3_exec)
- 创建数据表 - 数据操作
• 插入数据
• 更新数据
• 删除数据
3. 查询操作
- sqlite3_prepare_v2检查sql的合法性
- sqlite3_step逐行获取查询结果
- sqlite3_coloum_xxx获取对应类型的内容
- sqlite3_finalize释放stmt

数据库-SQLite的更多相关文章
- Android学习---如何创建数据库,SQLite(onCreate,onUpgrade方法)和SQLiteStudio的使用
一.android中使用什么数据库? SQLite是遵守ACID的关系数据库管理系统,它包含在一个相对小的C程式庫中.它是D.RichardHipp建立的公有领域项目.SQLite 是一个软件库,实现 ...
- python 学习笔记6(数据库 sqlite)
26. SQLite 轻量级的关系型数据库 SQLite是python自带的数据库,可以搭配python存储数据,开发网站等. 标准库中的 sqlite3 提供该数据库的接口. 1. 基本语法如下 c ...
- 数据库SQLite在Qt5+VS2012使用规则总结---中文乱码
VS2012默认格式为 "GB2312-80",而有时我们用到字符串需要显示中文时,就会出现乱码.下面仅就Qt5和VS2012中使用数据库SQLite时,做一个简单的备忘录 #in ...
- Python信息采集器使用轻量级关系型数据库SQLite
1,引言Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.SQLite作为后端数据库,可以搭配Python建网站,或者为python网络爬虫存储数据.SQLite还在其它 ...
- (转)轻量级数据库 SQLite
SQLite Expert – Personal Edition SQLite Expert 提供两个版本,分别是个人版和专业版.其中个人版是免费的,提供了大多数基本的管理功能. SQLite Exp ...
- iOS基础 - 数据库-SQLite
一.iOS应用数据存取的常用方式 XML属性列表 —— PList NSKeyedArchiver 归档 Preference(偏好设置) SQLite3 Core Data(以面向对象的方式操作数据 ...
- [深入浅出iOS库]之数据库 sqlite
一,sqlite 简介 前面写了一篇博文讲如何在 C# 中使用 ADO 访问各种数据库,在移动开发和嵌入式领域也有一个轻量级的开源关系型数据库-sqlite.它的特点是零配置(无需服务器),单磁盘文件 ...
- 数据库sqlite 存储图片
SQLite可以存储 BLOB(binary large object,二进制大对象)格式数据,利用它可以在安卓应用开发中存储图片资源. 这里先讲下,怎样把数据从数据库中取出,并显示在imagView ...
- 数据库SQLite
一.数据库 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等.离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式: 归档:NSKeyedArchiver 偏好设置:NSU ...
随机推荐
- 运维学习笔记(七)之T02-01计算机网络 、 数制 、 网络通信参考模型
计算机网络 计算机网络概述 什么是计算机网络 硬件方面:通过线缆将网络设备和计算机连接起来 软件方面:操作系统.应用软件.应用程序通过通信线路互连 实现资源共享.信息传递 功能 数据通信/资源共享/增 ...
- css3 关于文字,字体属性(转载)
1.text-overflow属性(实现省略号效果) text-overflow用来设置是否使用一个省略标记(…)标示对象内文本的溢出. [语法] ❤text-overflow只是用来说明文字溢出时用 ...
- Python2 读取表格类型文件
resp = My_Request_Get(xls_url) # My_Request_Get是我自己封装的请求函数,可修改为requests请求f = ]) nrows = table._dimnr ...
- p2 钢体
钢体可以控制沿x方向移动,沿y方向移动, 不旋转等. fixedX, fixedY, fixedRotaion 1)addBody和removeBody:World类中的addBody()和remov ...
- mysql(五)查询缓存
mysql的逻辑架构图如下: 当开启查询缓存时,mysql会将查询结果缓存到查询缓存区域,结果对应的key是使用查询语句,数据库名称,客户端协议的版本等因素算出的一个hash值. 在下次查询时,根据一 ...
- jmeter之JDBC的使用
一.配置JDBC Request 1.添加需要的驱动jar包 使用不同的数据库,我们需要引入不同的jar包. 方式1:直接将jar包复制到jmeter的lib目录 mysql数据库:下载mysql- ...
- Django之form表单提交并验证
1.提交的时候会报错 2. 需要在setting里面注释掉一句话,关闭跨站请求检查. 3. 注释掉以后,理论上就不报错了.可我还是卡壳了. 4. 通过在网上找方法,修复错误. 原因:表单action字 ...
- C++11——引入的新关键字
1.auto auto是旧关键字,在C++11之前,auto用来声明自动变量,表明变量存储在栈,很少使用.在C++11中被赋予了新的含义和作用,用于类型推断. auto关键字主要有两种用途:一是在变量 ...
- 【原创】【1】rich editor系列教程。前期准备,兼容
[1]前期准备,兼容 索引目录:http://www.cnblogs.com/henryli/p/3439642.html rich editor的原理无非是启用iframe的编辑模式或者div的co ...
- 【bzoj2844】albus就是要第一个出场
Time Limit: 6 Sec Memory Limit: 128 MBSubmit: 2254 Solved: 934[Submit][Status][Discuss] Descriptio ...