
Android学习之SQL基础使用
SQLITE 构化查询语言 (Structured Query Language) 是什么
SQLite是一个轻量型的数据库。
怎么样- 轻量级 : SQLite数据库是一个轻量级的数据库, 适用于少量数据的CURD;
- 文件本质 : SQLite数据库支持大部分SQL语法, 允许使用SQL语句操作数据库, 其本质是一个文件, 不需要安装启动;
- 数据读写 : SQLite数据库打开只是打开了一个文件的读写流, 如果有大数据量读写, 需要高并发存储, 那么就不应该使用SQLite;
- 它在Android中适合保存个人设置等没有大量数据的信,
用之前,先了解SQL基础知识
SQLite的数据类型
- null:空值相当于java中的null
- integer:带符号的整型,相当于java中的int
- real:浮点数字,相当于java中的float/double
- text/varchar:字符串文本,相当于java中的String
- blob:二进制对象,相当于java中的byte数组,用于存放图片
提醒:sql中不区分大小写
Sqlite3中的约束
约束就是限定数据库字段的条件
NOT NULL :非空
UNIQUE:唯一
PRIMARY:主键
CHECK:条件检查
DEFAULT:默认
可对表里的结构和字段进行约束限定,将约束条件放在需要约束的字段之后
创建表
数据库是数据库,数据表是存放在数据库中存放信的容器,
create table 表名(字段名 类型 长度 约束条件,….)
其中,长度和约束条件可根据实际情况添加
eg:create table student( "+"id INTEGER PRIMARY KEY AUTOINCREMENT," +"name VARCHAR(20) NOT NULL," +"cid INTEGER," +"age INTEGER CHECK(age>18 and age<60)," +"gender BIT DEFAULT(1)," +"score REAL");重要事项
- SQL 对大小写不敏感
- SQL 语句后面的分号,分号是在数据库系统中分隔每条 SQL 语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的语句。
- 星号(*)是选取所有列的快捷方式。
- 引号的使用。SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。
SQL DML 和 DDL
可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。 SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。 查询和更新指令构成了 SQL 的 DML 部分:
- SELECT - 从数据库表中获取数据
- UPDATE - 更新数据库表中的数据
- DELETE - 从数据库表中删除数据
- INSERT INTO - 向数据库表中插入数据
SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
SQL 中最重要的 DDL 语句:
- CREATE DATABASE - 创建新数据库
- ALTER DATABASE - 修改数据库
- CREATE TABLE - 创建新表
- ALTER TABLE - 变更(改变)数据库表
- DROP TABLE - 删除表
- CREATE INDEX - 创建索引(搜索键)
- DROP INDEX - 删除索引
sql语句
语法:
SELECT 列名称 FROM 表名称 eg:SELECT LastName FROM Persons表示从Persons表里面获取名为LastName的列
SELECT DISTINCT 语句
DISTINCT:取唯一不同的值 语法:
SELECT DISTINCT 列名称 FROM 表名称 eg:SELECT DISTINCT Company FROM Orders表示从Orders表中选取唯一的Company
WHERE 子句
WHERE 子句用于规定选择的标准。如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。
语法
select 列 from 表名称 where 列 运算符 值 eg:SELECT *FROM PERSONS WHERE City='beijing'表示从PERSONS表中选取居住在北京的人
AND & OR 运算符
AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
AND
eg:SELECT*FROM Persons WHERE FirstName='Thomas'**AND** Lastname='Carter'OR
eg:SELECT * FROM Persons WHERE firstName='Thomas'**OR** lastName='Carter'结合 AND 和 OR 运算符
使用圆括号来组成复杂的表达式
eg:SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter'ORDER BY 子句
ORDER BY 语句用于对结果集进行排序。
- ORDER BY 语句用于根据指定的列对结果集进行排序
- ORDER BY 语句默认按升序对记录进行排序
- 如果想按降序,可以使用DESC,升序使用ASC,但几乎没什么用,因为默认升序
表示从Orders表中选取Company和OrderNumber,以Company排序
eg2:SELECT Company,OrderNumber FORM Orders ORDER BY Company,OrderNumber表示从Orders中选取Company,OrderNumber,以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber)
eg3:SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC表示从Orders中选取Company,OrderNumber,以逆字母顺序显示公司名称
eg4:SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC表示从Orders中选取Company,OrderNumber,以逆字母顺序显示公司名称,并以数字顺序显示顺序号
INSERT INTO 语句
INSERT INTO 语句用于向表格中插入新的行。
语法:
INSERT INTO 表名称 VALUES (值1, 值2,....) INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)插入新的行
eg:INSERT INTO Persons VALUES('gates','Bill','xuanwumen','beijing');在指定的列中插入数据
eg:INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')Update 语句
Update 语句用于修改表中的数据。
语法
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值新某一行中的一个列
eg:UPDATE Person SET FirstName='Fred' WHERE LastName='Wilson'表示更新Person表中LastName列中为Wilson的FirstName为Fred,
更新某一行中的若干列
eg:UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'表示更新Person表中LastName列中为Wilson的Address和City
DELETE 语句
DELETE 语句用于删除表中的行。
语法:
DELETE FROM 表名 WHERE 列名=值 eg:DELETE FROM Person WHERE LastName = 'Wilson'表示删除LastName为Wilson的人
删除所有行
可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:
DELETE FROM table_name或者 DELETE * FROM table_name**
Android中使用SQL 1、编写数据库帮助类操作步骤:
- 新建数据库帮助类,继承自SQLiteOpenHelper
- 编写构造方法
- 重写onCreate和onUpdate方法
具体代码
package com.cd.databasedemo; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; /** * Created by Sky on 2016/10/7. * sQL帮助类,必须继承自SQLiteOpenHelper,并重写两个方法 * onCreate和onUpgrade, * onCreate:数据可创建时调用,主要用来初始化数据表结构,和初始数据 * onUpgrade:数据库更新时调用,主要用来改变表结构 * <p> * <p> * 数据库帮助类要做的事: * <p> * 重写onCreate和onUpgrade * 在这两个方法中填写sql语句 */ public class MydbHelper extends SQLiteOpenHelper { /** * @param context 上下文 * name 数据库名称 * CursorFactory 游标工厂,填写null表示使用默认游标 * version 版本号,只能增不能减,否则会报错 */ public MydbHelper(Context context) { super(context, "Sky.db", null, 2); } /** * 在数据库创建时调用,主要用来初始化数据表结构和初始化数据记录 * * @param db 当数据库第一次被创建时调用这个方法,适合在这个方法里面把数据表结构定义出来 * 所以只有第一次运行的时候才会执行这个方法,如果要看到这个方法执行,需要重新安装app */ @Override public void onCreate(SQLiteDatabase db) { Log.d("MydbHelper", "创建数据库onCreate"); db.execSQL("create table contactinfo(" +" id INTEGER PRIMARY KEY AUTOINCREMENT ," +" name varchar not null , " +" phone varchar not null )"); // db.execSQL("create table contactinfo(" // +"id integer primary key autoincrement," // +"name varchar(20)," // +"phone varchar(20))"); } /** * 当数据库版本更新的时候调用,版本号必须比之前的大,否则会报错 * * @param db * @param oldVersion * @param newVersion */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("alter table contactinfo add account varchar(20)"); } } 数据库操作类步骤:
- 编写构造方法,实例化数据库帮助类
- 通过调用数据库帮助类,编写
先看小毛驴(xml)
activity代码
package com.cd.databasedemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnClickListener{ Button mInsert,mDelete,mUpdata,mAlert; EditText mName,mPhone; ContactinfoDao mContactinfoDao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mInsert= (Button) findViewById(R.id.btn_insert); mDelete= (Button) findViewById(R.id.btn_delete); mUpdata= (Button) findViewById(R.id.btn_update); mAlert= (Button) findViewById(R.id.btn_alert); mName= (EditText) findViewById(R.id.et_name); mPhone= (EditText) findViewById(R.id.et_phone); mInsert.setOnClickListener(this); mDelete.setOnClickListener(this); mUpdata.setOnClickListener(this); mAlert.setOnClickListener(this); mContactinfoDao=new ContactinfoDao(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_insert: String name = mName.getText().toString(); String phone = mPhone.getText().toString(); if (TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){ Toast.makeText(this, "请输入姓名和手机号", Toast.LENGTH_SHORT).show(); return; }else { long row = mContactinfoDao.addData(name, phone); if (row==-1){ Toast.makeText(this, "添加失败", Toast.LENGTH_SHORT).show(); }else { Toast.makeText(this, "成功添加在"+row+"行", Toast.LENGTH_SHORT).show(); } } break; case R.id.btn_delete: String name1 = mName.getText().toString(); String phone1 = mPhone.getText().toString(); if (TextUtils.isEmpty(name1)){ Toast.makeText(this, "请输入删除条件", Toast.LENGTH_SHORT).show(); return; }else { int row_del = mContactinfoDao.deleteData(name1,phone1); if (row_del==-1){ Toast.makeText(this, "删除失败", Toast.LENGTH_SHORT).show(); }else { Toast.makeText(this, "成功删除第" + row_del + "行", Toast.LENGTH_SHORT).show(); } } break; case R.id.btn_update: String name_up = mName.getText().toString(); String phone_up = mPhone.getText().toString(); if (TextUtils.isEmpty(name_up)||TextUtils.isEmpty(phone_up)){ Toast.makeText(this, "请输入更新条件", Toast.LENGTH_SHORT).show(); return; }else { int row_up = mContactinfoDao.updateData(name_up, phone_up); if (row_up==-1){ Toast.makeText(this, "更新失败", Toast.LENGTH_SHORT).show(); }else { Toast.makeText(this, "成功更新第" + row_up + "条", Toast.LENGTH_SHORT).show(); } } break; case R.id.btn_alert: String name_alert = mName.getText().toString(); if (TextUtils.isEmpty(name_alert)){ Toast.makeText(this, "请添加查询条件", Toast.LENGTH_SHORT).show(); return; }else { String phone_alert = mContactinfoDao.alertData(name_alert); Toast.makeText(this, "查询到的手机号为" + phone_alert, Toast.LENGTH_SHORT).show(); mPhone.setText(phone_alert); } break; } } }全部代码如上。
数据库文件保存在系统文件夹的/data/data/包名/databases路径下,操作时可以将文件导出,使用sqlite developer打开查看。
getReadableDatabase()和getWritableDatabase()的比较- 这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象
- 当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常
参考文章
www.jianshu/p/06309249f2a0
www.jianshu/p/b5ff80941fab
www.w3school/sql/sql_delete.asp