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,但几乎没什么用,因为默认升序
eg1:SELECT Company,OrderNumber From Order ORDER BY Company

表示从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)");
    }
}

数据库操作类

步骤

  • 编写构造方法,实例化数据库帮助类
  • 通过调用数据库帮助类,编写
package com.cd.databasedemo;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

/**
 * Created by Sky on 2016/10/7.
 */

public class ContactinfoDao {
    MydbHelper mMydbHelper;

    /**
     * 在构造方法中实例化帮助类
     *
     * @param context
     */
    public ContactinfoDao(Context context) {
        mMydbHelper = new MydbHelper(context);
    }

    /**
     * 将数据库打开,帮帮助类实例化,然后利用这个对象
     */

    public long addData(String name, String phone) {
        /**
         * getWritableDatabase:
         * Create and/or open a database that will be used for reading and writing.
         *
         *
         * 增删改查,每一次操作都要得到数据库,操作完成后都要记得关闭
         * getWritableDatabase得到后数据库才会被创建
         * 数据库文件利用DDMS可以查看,在 data/data/包名/databases 目录下即可查看
         */
        SQLiteDatabase writableDatabase = mMydbHelper.getWritableDatabase();
        /**
         * ContentValues:This class is used to store a set of values
         * 存储值得集合
         */
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("phone", phone);
        /**
         * 参数1:表名
         * 参数2:可选择的项。可空、
         * 参数3:要添加的值
         * 返回类型:添加数据所在行数,如果返回-1,则表示添加失败
         */
        long row = writableDatabase.insert("contactinfo", null, values);

        return row;
    }

    /**
     * 删除
     *
     * @param name
     * @return
     */
    public int deleteData(String name,String phone) {
        SQLiteDatabase writableDatabase = mMydbHelper.getWritableDatabase();
        /**
         *参数1:表名
         * 参数2:删除条件,如果为null,则表示删除全部
         * 参数3:
         */
        int result = writableDatabase.delete("contactinfo", "name=(?,?)", new String[]{name,phone});
        return result;
    }

    /**
     *查询
     * @param name
     * @return
     */
    public String alertData(String name) {
        SQLiteDatabase writableDatabase = mMydbHelper.getWritableDatabase();
        /**
         * 参数1:查询的表
         * 参数2:查询的列
         * 参数3:selection
         * 参数4:selectionArgs
         * 参数5:groupBy
         * 参数6:having
         * 参数7:orderBy
         */
        Cursor cursor = writableDatabase.query("contactinfo", new String[]{"phone"}, "name=?", new String[]{name}, null, null, null);
        String phone = null;
        if (cursor.moveToNext()) {
            phone = cursor.getString(0);
        }
        //关闭cursor
        cursor.close();
        //关闭数据库
        writableDatabase.close();
        return phone;


    }

    /**
     * 更新
     * @param name
     * @param newphone
     * @return
     */
    public int updateData(String name, String newphone) {

        SQLiteDatabase writableDatabase = mMydbHelper.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put("phone", newphone);
        //更新contactinfo表中,name=name的手机号,返回行号
        int row = writableDatabase.update("contactinfo", values, "name=?", new String[]{name});

        return row;
    }
}

Activity里面使用

先看小毛驴(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()方法则将出现异常

参考文章

http://www.jianshu/p/06309249f2a0

http://www.jianshu/p/b5ff80941fab

http://www.w3school/sql/sql_delete.asp

更多推荐

Android学习之SQL基础使用