Android数据库(1)、SQLite数据库介绍
一、关系性数据库
- 强类型
- 引用完整性
- 事物
1、强类型:
2、引用完整性
- 如果给表A当中插入一行数据,该数据的外键值在表B当中没有,那么该操作则失败。
- 如果删除表B当中的一条数据,并且该条数据被表A当中的外键所引用,那么该操作失败
- 先插入表B当中的数据,然后插入表A当中的数据
- 先将表A当中引用表B的外键值置为null,然后删除表B当中数据
3、数据库事务
- 原子性:全部成功,全部失败,操作被视为一个单位,不能将操作分离
- 一致性:事务开启之前,数据库处于有效状态,那么事务开启之后,数据库仍然处于有效状态,不能因为事物导致数据约束被破坏
- 隔离性:执行完事物以后,数据库的状态可以通过依次执行事物中的命令达到同样的状态
- 持久性:事物一旦完毕,就不能丢失,比如电源故障等,物理环境都不能撼动。
二、SQL语言
1、DDL(数据定义语言)
1 #删除表结构
2 DROP TABLE users;
3
4 #创建一个新的表结构
5 CREATE TABLE users{
6 _id INTEGER PRIMARY KEY AUTOINCREMENT,
7 name_raw_user_id INTEGER REFERENCES raw_users(_id),
8 photo_id INTEGER REFERENCES data(_id),
9 photo_file_id INTEGER REFERENCES photo_files(_id),
10 custom_ringtone TEXT,
11 send_to_voicemail INTEGER NOT NULL DEFAULT 0,
12 time_contacted INTEGER NOT NULL DEFAULT 0,
13 last_time_contacted INTEGER,
14 starred INTEGER NOT NULL DEFAULT 0,
15 has_phone_number INTEGER NOT NULL DEFAULT 0,
16 lookup TEXT,
17 status_update_id INTEGER REFERENCES data(_id)
18
19 };
- 视图(View):
- 触发器(trigger):
- 索引(index):
2、DML(数据库操作语言)
1 #插入语句
2 INSERT INTO users(
3 name_raw_contact_id,photo_id,photo_file_id,
4 last_time_contacted,status_update_id)
5 VALUES(null,null,null,18944658190,null);
6
7 #更新语句
8 UPDATE users SET starred=1, has_phone_number=1 WHERE _id=3;
9
10 #删除语句
11 DELETE FROM users WHERE _id=2;
3、DQL(数据库查询语句)
1 #查询语句
2 SELECT rc.display_name, u.starred
3 FROM users u INNER JOIN raw_users ru
4 ON u.name_raw_contact_id=rc._id
5 WHERE NOT ru.display_name IS NULL
6 ORDER BY ru.display_name ASC;
三、SQLite入门
- 存储在里面的数据持久化的跨进程和电源存在。
- 跨越系统软件升级和重新安装
- 处理多种异常情况,非常优雅,比如:低内存环境、磁盘错误、电池电量不足、都不足矣破坏已经持久化的数据
1、SQLite语法
2、支持的数据类型
1 sqlite> create table test(
2 ...> c1 biginteger, c2 smalldatetime, c3 float(9,3));
3 sqlite> insert into test values("la","la","la");
4 sqlite> select * from test;
5 la|la|la
3、关于约束
1 sqlite> create table test(
2 ...> key integer primary key,
3 ...> val text);
4 sqlite> insert into test(val) values("something");
5 sqlite> insert into test(val) values("liusuansuan");
6 sqlite> select * from test;
7 1|something
8 2|liusuansuan
9 sqlite>
- pragma FOREIGN_KEYS=true
1 sqlite> creaet table people(
2 ...> name text, address integer references addresses(id));
3 Error: near "creaet": syntax error
4 sqlite> create table people(
5 ...> name text, address integer references addresses(id));
6 sqlite> create table addresses(
7 ...> id integer primary key, street text);
8 sqlite> insert into people values("liupengcheng",99);
9 sqlite> insert into addresses(street) values("shahe");
10 sqlite> select * from people;
11 liupengcheng|99
12 sqlite> select * from addresses;
13 1|shahe
14 sqlite> select * from people, addresses where address=id;
15 sqlite>
1 sqlite> create table people(
2 ...> name text, address integer references addresses(id));
3 sqlite> create table addresses(id integer primary key, street text);
4 sqlite> insert into addresses(street) values("北京");
5 sqlite> insert into addresses(street) values("上海");
6 sqlite> insert into people values("张飞“,1);
7 sqlite> insert into people values("张飞",1);
8 sqlite> insert into people values("关羽",2);
9 sqlite> insert into people values("刘备",2);
10 sqlite> select name,street from people,addresses where address=id;
11 张飞|北京
12 关羽|上海
13 刘备|上海
1 sqlite> create table test(
2 ...> c1 text unique, c2 text not null, c3 text check(c3 in ("OK","Dandy")));
3 sqlite> insert into test values("dandy","dandy","dandy");
4 Error: CHECK constraint failed: test
5 sqlite> insert into test values("dandy","dandy","Dandy");
6 sqlite> insert into test values("dandy","dandy","Dandy");
7 Error: UNIQUE constraint failed: test.c1
8 sqlite> insert into test values("dandy",null,"Dandy");
9 Error: NOT NULL constraint failed: test.c2
4、SQLite数据库示例
1 sqlite>.header on
2 sqlite>.mode column
3 sqlite>.timer on
1 sqlite> create table users(
2 ...> _id integer primary key autoincrement,
3 ...> name text not null);
4 sqlite>
1 sqlite> alter table users add last_modified_time text;
2 Run Time: real 0.003 user 0.000000 sys 0.000000
1 sqlite> create trigger t_users_audit_i
2 ...> after insert
3 ...> on users
4 ...> begin
5 ...> update users set last_modified_time=datetime('now','utc')
6 ...> where rowid=new.rowid; end;
7 Run Time: real 0.003 user 0.000000 sys 0.000000
8
9 sqlite> create trigger t_users_audit_u
10 ...> after update
11 ...> on users
12 ...> begin
13 ...> update users set last_modified=datetime('now','utc')
14 ...> where rowid=new.rowid;
15 ...> end;
16
17 Run Time: real 0.003 user 0.000000 sys 0.000000
上述触发器创建的时候用到了datetime数据库内置和日期相关的函数。具体内容可以查看http://www.runoob.com/sqlite/sqlite-date-time.html
1 sqlite> insert into users(name) values("liupengcheng");
2
3 Run Time: real 0.003 user 0.000000 sys 0.004000
4
5 sqlite> select * from users;
6
7 _id name last_modified_time
8 ---------- ------------ -------------------
9 2 liupengcheng 2018-03-09 09:50:40
10
11 Run Time: real 0.000 user 0.000000 sys 0.000000
我们的User可能需要地址,比如客户的收货地址,所以我们创建一个地址表,
1 sqlite> create table addresses(
2 ...> _id integer primary key autoincrement,
3 ...> number integer not null,
4 ...> unit text,
5 ...> street text not null,
6 ...> city integer references cities);
7
8 Run Time: real 0.004 user 0.000000 sys 0.000000
1 sqlite> create table users_addresses(
2 ...> users integer references users,
3 ...> address integer references addresses);
4
5 Run Time: real 0.004 user 0.000000 sys 0.004000
1 insert into users(name) values("wangyiqi");
2 insert into users(name) values("wwangpeng");
3 insert into users(name) values("liuna");
4 insert into users(name) values("yangqiqi");
5 sqlite> select * from users;
6
7 _id name last_modified_time
8 ---------- ------------ -------------------
9 2 liupengcheng 2018-03-09 09:50:40
10 3 wangyiqi 2018-03-09 10:18:42
11 4 wwangpeng 2018-03-09 10:18:42
12 5 liuna 2018-03-09 10:18:42
13 6 yangqiqi 2018-03-09 10:19:01
14 Run Time: real 0.003 user 0.000000 sys 0.000000
15
16
17 insert into addresses(number,street) values(651, "北京昌平");
18 insert into addresses(number,street) values(1600, "上海浦东");
19 insert into addresses(number,street) values(259, "哈尔滨江北");
20 insert into addresses(number,street) values(693, "甘肃天水");
21 insert into addresses(number,street) values(1658, "北京朝阳");
22 sqlite> select * from addresses;
23
24 _id number unit street city
25 ---------- ---------- ---------- ------------ ----------
26 1 651 北京昌平
27 2 1600 上海浦东
28 3 259 哈尔滨江
29 4 693 甘肃天水
30 5 1658 北京朝阳
31 Run Time: real 0.000 user 0.000000 sys 0.000000
32
33
34 insert into users_addresses(users,address) values(2,1);
35 insert into users_addresses(users,address) values(3,2);
36 insert into users_addresses(users,address) values(4,3);
37 insert into users_addresses(users,address) values(5,4);
38 insert into users_addresses(users,address) values(6,5);
39 sqlite> select * from users_addresses;
40
41 users address
42 ---------- ----------
43 2 1
44 3 2
45 4 3
46 5 4
47 6 5
48 Run Time: real 0.000 user 0.000000 sys 0.000000
现在数据也有了,关系也键全了,现在可以使用关联关系进行查看我们之前所编辑的数据实体了。
1 sqlite> select name,street,number from users,addresses,users_addresses where users._id = users_addresses.users and addresses._id = users_addresses.address;
2
3 name street number
4 ------------ ------------ ----------
5 liupengcheng 北京昌平 651
6 wangyiqi 上海浦东 1600
7 wwangpeng 哈尔滨江 259
8 liuna 甘肃天水 693
9 yangqiqi 北京朝阳 1658
10
11 Run Time: real 0.000 user 0.000000 sys 0.000000
如果我们想确定一个地址下面有多少用户,我们可以使用count函数和group by字句来实现。
1 select count(name),number,street
2 from users,addresses,users_addresses
3 where users._id=users_addresses.users
4 and addresses._id=users_addresses.address
5 group by number,street;
6
7 count(name) number street
8 ----------- ---------- ---------------
9 1 259 哈尔滨江北
10 1 651 北京昌平
11 1 693 甘肃天水
12 1 1600 上海浦东
13 1 1658 北京朝阳
14
15 Run Time: real 0.000 user 0.000000 sys 0.000000
Android数据库(1)、SQLite数据库介绍的更多相关文章
- Android 开发中 SQLite 数据库的使用
SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, ...
- iOS开发数据库篇—SQLite简单介绍
iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...
- Android版本升级同时Sqlite数据库的升级及之前数据的保留
http://www.cnblogs.com/wang340/archive/2013/05/06/3063135.html http://www.eoeandroid.com/forum.php?m ...
- Android数据库之SQLite数据库
Android数据库之SQLite数据库 导出查看数据库文件 在android中,为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data ...
- 【转】 iOS开发数据库篇—SQLite简单介绍
开始学SQLite啦, 原文: http://www.cnblogs.com/wendingding/p/3868893.html iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中 ...
- Android存储之SQLite数据库
Android存储之SQLite数据库数据库 创建数据库 package --; import android.content.Context; import android.database.sql ...
- Android基础总结+SQlite数据库【申明:来源于网络】
Android基础总结+SQlite数据库[申明:来源于网络] 基础总结篇之一:Activity生命周期:http://blog.csdn.net/liuhe688/article/details/6 ...
- 请问Typecho Mysql 数据库和Sqlite数据库我该如何选择。
纠结如我,又纠结了,请大家帮忙看一下我该如何选择.就一个没有文章的博客.一直用VPS太浪费,现在换成了虚拟主机.但是虚拟主机的MYSQL数据库限制连接数30个,我不懂这是个什么概念,但是我觉得30太少 ...
- android中与SQLite数据库相关的类
为什么要在应用程序中使用数据库?数据库最主要的用途就是作为数据的存储容器,另外,由于可以很方便的将应用程序中的数据结构(比如C语言中的结构体)转化成数据库的表,这样我们就可以通过操作数据库来替代写一堆 ...
- 数据库之SQLite的介绍与使用20180705
一.SQLite 简介 1.介绍 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌 ...
随机推荐
- 字符编码ANSI、ASCII、GB2312、GBK、GB18030、UNICODE、UTF-8小结
编码和解码可以理解成二进制和字符(广义的字符,包括汉字等)的映射表,编码即从字符映射至二进制,解码则为逆过程. 1.英语字符编码ASCII 开始计算机只在美国用.8字节一共可以组合出256(2的8次方 ...
- sell01 环境搭建、编写持久层并进行测试
1 环境配置 JDK 1.8 MAVEN 3.5 MYSQL 5.7 VirtualBox 5.1 2 搭建MYSQL环境 下载 VM 和 虚拟镜像文件 虚拟镜像文件:点击前往 技巧01:安装完vir ...
- 利用Admin-LTE项目搭建自己前端的开发框架模板
1 完整版本 1.1 下载admin-lte项目源代码 github下载地址:点击前往 三少云盘地址:点击前往 1.2 查看admin-lte精简主页源代码 页面地址:点击前往 注意:由源代码可以知道 ...
- R: 缺失值 & 查看变量类型
################################################### 问题:缺失值 18.5.2 有关处理缺失值的各种方法有什么?各自的适用场景. 解决方案: n ...
- 1.8 收集的XSS Payload
收集的XSS Payload ,可以做成字典,到时候批量测试:--------------------------------------------------------------------- ...
- 1.jQuery入口函数 与javaScript入口函数
1.jQuery入口函数 与javaScript入口函数 JQ入口函数: $(document).ready(function(){ }); 或者 $(function(){ }) Js入口函数: w ...
- 树莓派配置(一):打开SPI
1.树莓派默认SPI关闭,在进行编程前需要打开SPI cd /boot/ sudo vi config.txt 将#dtparam=spi=off 改成:dtparam=spi=on 重启 sudo ...
- 从阿里中台战略看企业IT架构转型之道
此文是我阅读<企业IT架构转型之道>一书的学习笔记,所有内容出自钟华老师的这本书. 零.为何读<企业IT架构转型之道> 在加入X公司后,开始了微服务架构的实践,也开始了共享平台 ...
- mysql失效的几种情况
1.如果查询条件中有or,即使查询的条件中带有索引也会失效,如果想使用or,又不想让索引失效,只能将or条件中的所有列都加上索引 2.like 查询一%开头用不上索引, 3.隐式转换会使索引失效 比如 ...
- Python包管理工具setuptools之setup函数参数详解
**********************************************************对所学内容的简单汇总******************************** ...