SQLite 数据库基础 —— (一)

本文介绍了Android中SQLite数据库的基础知识,包括如何创建数据库、建表、SQL语句的使用,如DML(增删改查)和DDL(创建表、删除表),以及Android中SQLiteOpenHelper的使用。同时,讲解了SQLite数据类型和存储机制,以及数据库操作的前端解析系统和后端引擎的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     数据库在实际的移动开发中使用的频率真的不太多,开发几款小的app基本没有用过数据库,但是你不能说它不重要,一些阅读或者聊天类型的用数据库很频繁,我自己没涉及到这一类型的app开发,趁着有时间重新回顾学习下数据库的知识点,可能写的比较散,想到哪里些哪里,只是关于Android 的数据库的回顾哈~

一、数据库

       Android的数据库创建: 继承SQLiteOpenHelper类后的onCreate方法中可以实现数据库创建的操作,但是这里数据库还没有创建完成,只有调用getWritableDatabase() 或 getReadableDatabase() 才算数据库创建完成。说的我自己都有些绕~

      建表:create table tableName

                (_id integer primary key autoincrement, 

                  字段1 数据类型,

                   字段2 数据类型,

                    ...

                   )

        数据类型 data_type ,SQL中最常用的是以下几种类型:

  •  仅仅容纳整数,括号内规定的数字是字段的最大位数,可以不写。 integer(size) 、 int(size)、smallint(size)、tinyint(size)。
  •  容纳带小数的数字。”size“ 数字的最大位数,”d“ 小数点右侧的最大位数。   decimal(size,d)、numeric(size,d)
  • 容纳固定长度的字符串。  char(size)
  • 容纳可变长度的字符。  varchar(size)
  • 容纳日期。   date(yyyymmdd)

二、SQL语句

       @ sql 语句对大小写不敏感。sql 分为两部分:DML 和 DDL 。DML(数据操作语言)—— 增(insert)删(delete)改(update)查(select)  , DDL(数据定义语言)—— 创建(create)修改(alter)或删除(drop)表格、创建或修改数据库、创建或删除索引等

1、DML

 1)、select 查

      select 列名称 from 表名称(查询表中莫一字段数据)

      select * from tableName (查询表中所有字段)

      select  字段1,字段2,...    from tableName (查询表中某几个字段)

      select distinct 字段 from tableName (查询表中莫一字段并且剔除重复数据有且只展示一次的数据)

      select 字段 from tableName where 字段 运算符  值   and(or)  字段 运算符 值 (条件查询表中的莫一字段数据)

      select * from tableName order by 字段  asc(desc)   ——  (查询字段并排序)

2)、insert 增

         insert into tableName values(值1,值2,...)  —— (插入一列数据到表中)

         insert into tableName(字段1,字段2,...) values(值1,值2,...) —— (插入一列包含某些字段的数据到表中)

3)、 update 改

          update tableName set 字段1 = 新值1,字段2 =  新值2...  where 字段 = 某值 —— (修改莫一字段下符合莫一条件的数据)

4)、 delete 删

          delete from tableName where 字段 = 值  —— (删除莫一条件下的行)

          delete from tableName 或 delete * from tableName ——  (不删除表的情况下删除所有的行)

2、DDL

1)、数据库

       create database databaseName  ——  (创建数据库)

       drop database databaseName  ——  (删除数据库)

       SQLite 中创建和删除数据库的功能有所限制,Android中可以在SQLiteOpenHelper中创建数据库。

2)、表

         create table tableName(字段1  数据类型, 字段2  数据类型, ... )  ——   (创建数据库种的表)

         drop table tableName  ——  (删除表)

         alter table tableName 

         add columnName  datatype     ——   (在表中添加列)
          

         alter table tableName

         drop column columnName   (或者  alter column columnName datatype)   ——   删除表中的列,有些数据库不允许使用第一种方法,就需要用第二种方式   (SQLite 中暂时无法删除列)

           @ SQLite 中alter table 功能有所限制,只能添加和重命名列,不能修改和删除列。

3)、索引

          create index indexName on tableName(columnName)  ——   创建索引,columnName  规定需要索引的列

          create unique index indexName on tableName(columnName)  ——  表中创建唯一的索引。唯一意味着两个行不能拥有相同的索引值。

三、Android 中数据库增删改查的操作

1、创建数据库:

     SQLiteOpenHelper 的子类的构造方法 : 调用父类构造方法super()创建数据库;

     public SQLiteOpenHelper(Context context,String name,CursorFactory factory,int version); 其中 name 表示数据库文件名,version 数据库版本号。

     onCreate()  :数据库首次被创建的时候会调用这个方法,是创建数据库表、视图等组件和表初始化的地方。

  • 在第一次打开数据库的时候才会运行
  • 在清除数据后再次运行,打开数据库还是会运行
  • 升级数据库不会运行这个方法,运行onUpgrade()方法

     onUpgrade() :数据库本身存在,并且当前数据库版本号高于上次创建或升级的版本号,调用这个方法,会重新更新数据库的版本号。在这个方法中除了创建表、视图等组件外,还需要先删除这些相关组件。

public class DBHelper extends SQLiteOpenHelper {
    public final static String DB_NAME = "fava_database.db";
    public final static int DB_VERSIONCODE = 1;
    public final static String TABLE_NAME = "shb";

    /**
     * 需要添加到表里的字段
     */
    public final static String CITY_NAME = "cityName"; //城市名
    public final static String ROOM_TITLE = "roomTitle";//房源名
    public final static String PRICE = "price";//房源价格


    public DBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSIONCODE);
    }

    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
        super(context, name, factory, version, errorHandler);
    }

    /**
     * 创建一个数据库
     * 当数据库文件创建时,执行初始化操作,并且只执行一次
     *
     * @param db
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        //建表
        String sql = "create table "
                + TABLE_NAME + " (_id integer primary key autoincrement, "
                + CITY_NAME + " varchar, "
                + ROOM_TITLE + " text, "
                + PRICE + " varchar)";
        db.execSQL(sql);


    }

    /**
     * 升级数据库
     * 当数据库版本更新执行该方法
     *
     * @param db
     * @param oldVersion
     * @param newVersion
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    /**
     * 降级数据库版本
     *
     * @param db
     * @param oldVersion
     * @param newVersion
     */
    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        super.onDowngrade(db, oldVersion, newVersion);
    }
}

2、SQLite 存储:

(1)存储的数据类型

  • NULL   值是null。
  • INTEGER   值是带符号的整数,根据值的大小存储在1、2、3、4、6、8字节中,对应Java中的byte、short 、int 、long。
  • REAL   值是浮点值, 存储为8字节的IEEE浮点数字(单精度、双精度等),对应Java中的float、double。
  • TEXT  值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)存储,对应Java中 String。
  • BLOB  值是blob数据(可以存储二进制文件的容器),完全根据它的输入存储。

数据类型转换:

1)、INTEGER

         tinyint  小整数型,1字节。

         smallint  大整数型,2字节。

         mediumint  大整数型,3字节。

         int  整型,一般存储在4字节中,默认是0。

         integer 整型包装类,4字节,32位元的整数,默认是null。

         bigint  极大整数型,8字节。

2)、TEXT

          char   保存固定长度的字符串,最多255个字符。

          varchar  保存可变长度的字符串,最多255个字符,如果值长度超过255,则被转换为TEXT类型。

          tinytext   存放最大长度为255个字符的字符串。

          text   存放最大长度为 65 635 个字符的字符串。

          blob   用于BLOBs  , 存放最多 65 535 字节数据。

          mediumtext  存放最大长度 16 777 215 个字符的字符串。

          mediumblob   

          longtext  存放 4 294 9677 295 个字符的字符串。

          longblob

          enum(x,y,z,etc.)    允许你输入可能值的列表。

          set   与enum类似,set最多只能包含64个列表项,不过set可以存储一个以上的值。

3)、DATE(SQLite 没有单独的日期时间数据类型,可以转换为INTEGER 或 TEXT类型进行存储)

          date()    日期 , 格式 yyyy-mm-dd。

          datetime()    日期和时间,  格式yyyy-mm-dd hh:mm:ss。

          timestamp()   时间戳, 格式 yyyy-mm-dd hh:mm:ss 或 yyyymmddhhmmss 或 yymmddhhmmss 或 yyyymmdd 或 yymmdd。

          time()   时间, 格式hh:mm:ss。

          year()   年, 格式 yyyy  或者  yy。

4)、NUMBER

          INTEGER

          float   带有浮动小数点的小数字。

          double   带有浮动小数点的大数字。

          decimal   作为字符串存储的double类型,允许固定的小数点。

   SQLite  没有单独的Boolean存储类,布尔值被存储为整数0 (false) 和 1(true) 。    

(2)常用约束条件

3、数据库中存储数据

public class DBOption {

    private final DBHelper dbHelper;
    private final SQLiteDatabase dbDataBase;

    public DBOption(Context context) {
        dbHelper = new DBHelper(context);
        dbDataBase = dbHelper.getWritableDatabase();
    }

    /**
     * 插入数据
     *
     * @param name      插入的城市名
     * @param roomTitle 插入的房源名称
     * @param price     插入的房源价格
     */
    public void inserData(String name, String roomTitle, String price) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(DBHelper.CITY_NAME, name);
        contentValues.put(DBHelper.ROOM_TITLE, roomTitle);
        contentValues.put(DBHelper.PRICE, price);
        dbDataBase.insert(DBHelper.TABLE_NAME, null, contentValues);



    }

    /**
     * 删除整个城市的数据
     *
     * @param oldName 删除条件字段值
     * @param name    删除的城市名
     */
    public int deleteCityData(String name, String oldName) {
        int delete = dbDataBase.delete(DBHelper.TABLE_NAME, DBHelper.CITY_NAME + " = ? ", new String[]{oldName});
        return delete;
    }

    /**
     * 刪除价格过滤后的房源数据
     *
     * @param oldPrice 删除的条件字段值
     * @return
     */
    public int deletePrcieData(String oldPrice) {
        int delete = dbDataBase.delete(DBHelper.TABLE_NAME, DBHelper.PRICE + " > ?", new String[]{oldPrice});
        return delete;
    }

    /**
     * 更新房源信息Z
     *
     * @param roomTitle
     * @param cityName
     * @param price
     */
    public void updateData(String roomTitle, String cityName, String price) {
        ContentValues value = new ContentValues();
        value.put(DBHelper.CITY_NAME, cityName);
        value.put(DBHelper.PRICE, price);
        value.put(DBHelper.ROOM_TITLE, roomTitle);
        dbDataBase.update(DBHelper.TABLE_NAME, value, DBHelper.ROOM_TITLE + " = ?", new String[]{"小清新单间"});
    }

    /**
     * 查询数据库数据
     *
     * @param oldPrice 需要筛选的条件值
     */
    public ArrayList<RoomBean> queryData(String oldPrice) {

        Cursor cursor = dbDataBase.query(DBHelper.TABLE_NAME, new String[]{dbHelper.CITY_NAME, dbHelper.ROOM_TITLE, dbHelper.PRICE},
                DBHelper.PRICE + " > ?", new String[]{oldPrice}, null, null, DBHelper.PRICE + " asc");
        int cityIndex = cursor.getColumnIndex(DBHelper.CITY_NAME);
        int priceIndex = cursor.getColumnIndex(DBHelper.PRICE);
        int roomIndex = cursor.getColumnIndex(DBHelper.ROOM_TITLE);

        ArrayList<RoomBean> bean = new ArrayList<>();
        while (cursor.moveToNext()) {
            String city = cursor.getString(cityIndex);
            String price = cursor.getString(priceIndex);
            String roomTitle = cursor.getString(roomIndex);
            RoomBean dd = new RoomBean(city, roomTitle, price);
            bean.add(dd);
        }
        return bean;
    }

    /**
     * 信息类bean
     */
    class RoomBean implements Serializable {
        private String cityName;
        private String roomTitle;
        private String price;

        public RoomBean(String cityName, String roomTitle, String price) {
            this.cityName = cityName;
            this.roomTitle = roomTitle;
            this.price = price;
        }
    }
}

四、SQLite 基本介绍

      SQLite 数据库采用模块化涉及,由8个独立的模块组成,这些独立的模块又构成3个主要子系统,模块将复杂的数据库操作过程分解为细小的工作来进行处理。这些模块被分割成两部分,分别是:前端解析系统和后端引擎。

(一)、前端解析系统

      负责处理传递过来的SQL语句和SQLite命令,对获取的编码分析、优化并转为后端可以执行的SQLite内部字节码。

1、词法分析器(Tokenizer)

     把传递过来包含SQL的字符串分割成一个个标识符,并把标识符传递给解析器。

2、语法分析器(Parser)

     在指定的上下文中赋予标识符具体的含义。

3、代码生成器(Code Generator)

      Parser把标识符组装成完整的SQL语句后,就调用Code Generator 产生虚拟机代码,以执行SQL语句请求工作。

(二)、SQLite 后端引擎

      后端是用来解释字节编码程序的引擎,该引擎才是真正数据库处理工作。

1、虚拟机(VM)

      通过执行字节编码语句实现SQL语句的工作。它是数据库中数据的最终操作者,它把数据库堪称表和索引的集合,而表和索引则是一系列的元组或者记录。

2、B/B+树

     帮助VM进行搜索,插入和删除树中的元组,也帮助VM创建新的树和删除旧的树。

3、页面调度程序(pager)

     管理B/B+树使用的内存内缓存(数据库页的),也管理文件的锁定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值