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建立的公有领域项目.它的设计目标是嵌 ...
随机推荐
- Flask11 Session、CSRF、注销session、利用端点自动跳转
1 怎么对存储的cookie数据进行加密 利用response对象去设置cookie时,存储到浏览器中的cookie数据都是明文的,容易被一些计算机爱好者利用:利用session存的cookie数据可 ...
- Flask07 Jinja2模板测试器、控制语句IF/FOR、变量/块 赋值、作用域、块级作用域
1 测试器及其使用 在模板中的 {{}} 可以书写测试器,格式如下 {{ 变量 is 测试器名称 }} 1.1 在python中导入 Jinja2 的模板 from jinja2 import te ...
- GCC源码编译
1. gcc源码下载 ftp://gcc.gnu.org/pub/gcc/releases/ [yhwang@yhwang ~] wget ftp://gcc.gnu.org/pub/gcc/rele ...
- change和onchange、click和onclick的区别
change和onchange.click和onclick的区别: onchange和onclick都是js方法 可以在标签元素上使用 <input onchange="" ...
- TMF大数据分析指南 Unleashing Business Value in Big Data(一)
大数据分析指南 TMF Frameworx最佳实践 Unleashing Business Value in Big Data 前言 此文节选自TMF Big Data Analytics Guide ...
- 微信小程序-获取当前城市位置
CSDN链接 https://blog.csdn.net/weixin_42262436/article/details/80458430
- Unity 点乘与叉乘 计算敌人位置
点乘:表示两个向量夹角 a*b=|a| * |b| * cos(ab),判断敌人在前后方 叉乘:表示两向量的法线
- sql各种查询技巧
SQL Server T-SQL高级查询 高级查询在数据库中用得是最频繁的,也是应用最广泛的. Ø 基本常用查询 --select select * from student; --all 查询所有 ...
- Educational Codeforces Round 52D(ARRAY,模拟最短路)
#include<bits/stdc++.h>using namespace std;int n,x;int chess[17*17];//记录棋盘上的numberarray<int ...
- 《OD大数据实战》Mahout入门实例
一.环境搭建 1. 下载 mahout-0.9-cdh5.3.6.tar.gz 2. 解压 3. mahout org.apache.mahout.clustering.syntheticcontro ...