SQLite数据库

SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,在存储大量复杂的关系型数据的时可以使用

一.创建数据库
1.SQLiteOpenHelper

它是SQLiteDatabase的帮助类, 用于管理数据库的创建和升级。(onCreate()和 onUpgrade())

2.创建数据库时

先实例化一个自定义SQLiteOpenHelper子类,并提供四个参数,含义是(上下文,数据库名,创建Cursor的工厂类,版本号)。

3.getReadableDatabase() 和getWritableDatabase()
  • 这两个方法创建或打开一个现有的数据库并返回一个SQLiteDatabase对象。

  • getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了数据库就只能读而不能写,getWritableDatabase()打开数据库就会出错。

  • getReadableDatabase()方法先以读写方式打开数据库,倘若使用如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。

  • 一般情况下两者返回情况都是相同的,唯一的区别是:在数据库仅开放只读权限或磁盘已满时,getReadableDatabase只会返回一个只读的数据库对象,而getWritableDatabase()会出错。

4.创建数据库语法
    //创建SQLite表
    private static final String CREATE_TABLE_SQLITE = "create table SQLITE("
            + "id integer primary key autoincrement,"
            + "name text not null,"
            + "age integer not null,"
            + "gender text not null,"
            + "score integer default 0)";
            
    //在SQLiteOpenHelper的onCreate里面创建数据库        
    @Override
    public void onCreate(SQLiteDatabase db) {
        //SQLiteDatabase 用于操作数据库的工具类
        db.execSQL(CREATE_TABLE_SQLITE);
        ToastUtils.showShort("创建SQLite成功");
    }

二.基本语法

SQLite 不区分大小写,但有一些命令是大小写敏感的,例如:GLOB和glob

1. 数据类型
数据类型说明
NULL值是一个NULL值
INTEGER值是一个带符号的整数,根据值的大小存储在1、2、3、4、6或8个字节中
REAL值是一个浮点值,存储为8字节的IEEF浮点数
TEXT值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
BLOB值是一个blob数据,完全根据它的输入存储
2.创建表和删除表
创建表
  • CREATE TABLE 语句用于在任何给定的数据库创建一个新表。创建新表,涉及到命名表,定义列及每一列的数据类型和名称
  • 约束: 限定数据列的规则
  • NOT NULL :确保列不能有NULL值
  • DEFAULT :当某列没有指定值时,为该列提供默认值
  • UNIQUE :确保某列中所有的值是不同的
  • PRIMARY KEY :主键:唯一标识数据库表中的每一条记录
  • CHECK :CHECK约束确保某列中的所有值满足一定条件
  • PRIMARY KEY (index_name1,index_name2…)):混合主键
    注意:设计表的时候,约束条件一定要设计好,不支持删除约束和修改约束
    //创建录音记录表
    private static final String CREATE_TABLE_AUDIO_RECORD = "CREATE TABLE AUDIO_RECORD("
            + "_id integer primary key autoincrement,"
            + "saleId text not null,"
            + "visitRecordId text not null,"
            + "audioRecordLogicParam text not null,"
            + "isUploadSuccess int DEFAULT 0,"
            + "audioLocalPath text not null,"
            + "unique (saleId,visitRecordId))";
删除表

DROP TABLE

drop table if exists AUDIO_RECORD
3.索引

Android索引详解

索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。索引有助于加快 SELECT 查询和 WHERE 子句,但它会减慢使用 UPDATE 和 INSERT 语句时的数据输入

  • 单例索引:CREATE INDEX index_name ON table_name (column_name);
    //创建一个索引,索引指向name字段,desc降序索引  asc升序
    private static final String CREATE_INDEX_NAME = "create index nameIndex on SQLITE(name desc)";
    
     db.execSQL(CREATE_INDEX_NAME);
  • 唯一索引 : CREATE UNIQUE INDEX index_name on table_name (column_name);

  • 混合索引 : CREATE INDEX index_name on table_name (column1 , column2); (混合唯一索引可以达到和混合主键同样的效果,表创建后无法修改如果想使用混合主键可以使用混合唯一索引)

  • 删除索引 : DROP INDEX index_name;

什么情况下避免使用索引:

  • 索引不应该使用在较小的表上。

  • 索引不应该使用在有频繁的大批量的更新或插入操作的表上。

  • 索引不应该使用在含有大量的 NULL 值的列上。

  • 索引不应该使用在频繁操作的列上。

4.增删改查
    public void insert(Student student) {
        //如果数据库已存在则直接打开,否则创建一个新的数据库
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        //方法一:调用辅助性方法,使用简单
        ContentValues values = new ContentValues();
        values.put("name", student.getName());
        values.put("age", student.getAge());
        values.put("gender", student.getGender());
        values.put("score", student.getScore());
        //(表名,空值字段的名称,数据即ContentValues对象)
        db.insert("SQLITE", null, values);

        //方法二:用原生SQL语句再调用execSQL()
        String sql = "insert into SQLITE(name,age,gender,score) values(?,?,?,?)";
        Object[] args = {student.getName(), student.getAge(), student.getGender(), student.getScore()};
        db.execSQL(sql, args);
    }
    public void delete(String score) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        //方法一:调用辅助性方法
        //(表名,删除约束条件,条件值)
        db.delete("SQLITE", "score=?", new String[]{score});

        //方法二:用原生SQL语句再调用execSQL()
        String sql = "delete from SQLITE where score = ?";
        Object[] args = {score};
        db.execSQL(sql, args);
    }
    public void update() {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        //方法一:调用辅助性方法
        ContentValues values = new ContentValues();
        values.put("score", 70);
        //(表名,ContentValues对象,约束,约束值)
        db.update("SQLITE", values, "gender=?", new String[]{"高二"});

        //方法二:用原生SQL语句再调用execSQL()
        String sql = "update SQLITE set score = ? where gender = ? and age>?";
        Object[] args = {60, "高一", 40};
        db.execSQL(sql, args);
    }
  • query和rawQuery 的区别是,query自动生产数据库语句,rawQuery手动拼接数据库数据,两者都返回一个Cursor(光标)对象,Cursor常用方法如下:

moveToFirst() 将指针移动到结果集的第一行
moveToNext() 将指针移动下一行
move(int i)
getColumnIndex(String name)获取某一列在表中对应位置的索引
getXXX(int i) 传入索引以获取相应位置的某种类型的数据
close()关闭指针

    public void query() {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        //方法一:调用辅助性方法
        //(表名,要查询出的列名,查询条件子句,对应于selection语句中占位符的值,要分组的列名,分组后过滤条件,排序方式)
        Cursor cursor = db.query("SQLITE", null, null, null, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                Student student = new Student();
                student.setName(cursor.getString(1));
                student.setAge(cursor.getInt(cursor.getColumnIndex("age")));
                student.setGender(cursor.getString(cursor.getColumnIndex("gender")));
                student.setScore(cursor.getInt(4));
                LogUtils.e(student);
            }
            cursor.close();
        }

        //方法二:用原生SQL语句再调用execSQL()
        String sql = "select name from SQLITE where name = ?";
        Cursor cursor1 = db.rawQuery(sql, new String[]{"王一"});
        if (cursor1 != null) {
            while (cursor1.moveToNext()) {
                Student student = new Student();
                student.setName(cursor1.getString(1));
                student.setAge(cursor1.getInt(cursor.getColumnIndex("age")));
                student.setGender(cursor1.getString(cursor.getColumnIndex("gender")));
                student.setScore(cursor1.getInt(4));
                LogUtils.e(student);
            }
            cursor1.close();
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值