Android下数据库的解析

建表的语句:

  • 以下语句就可以在数据库文件里创建一个名为students的表名,他有id, name, age 三个字段。

    继承 SqlliteOpenHelper
    在构造里写出数据库名,然后在onCreate里写出创建表的语句:
    db.execSQL("create table students(_id interger primary key autoincrement,name varchar(20), age integer(20)");
    

数据库文件的赠删改查:

  • 以下语句可以实现数据库的增删改查:

    Sql语句:
    add:
    insert into  students(id,name,age) values(1,'huge',38);
    
    delete:
    delete from students where name = 'lxr';
    
    update:
    update students set age = 34 where name = 'lxr';
    
    query:
    select name age from students where name = 'lxr';
    

数据库的模糊查询

  • 使用like可以实现数据库的模糊查询
    select name age from students where name LIKE’Mc%’;
    SQL模糊查询,使用like比较字,加上SQL里的通配符,请参考以下:
      1、LIKE’Mc%’ 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。
      2、LIKE’%inger’ 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。
      3、LIKE’%en%’ 将搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。
      4、LIKE’_heryl’ 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。
      5、LIKE’[CK]ars[eo]n’ 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。
      6、LIKE’[M-Z]inger’ 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)。
      7、LIKE’M[^c]%’ 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如MacFeather)。

数据库的优化

  • 使用事务。大量数据增加或删除时如果不使用事务,而是循环调用 INSERT 和 DELETE 的话,会因为每一笔操作都需要打开、写入最后关闭 journal 文件(这个文件是临时用来保存数据操作的中间结果)而使得开销非常大。
    使用方法:

    • db.beginTransaction()。
    • 开始进行循环添加或者删除操作。
    • db.setTransactionSuccessful()。
    • db.endTransaction()。
  • 使用索引。索引维护着一个表中某一列或某几列的顺序,这样就可 以快速定位到一组值,而不用扫遍全表。所有的索引信息会被保存在一个 独立的索引表中,所以会产生额外的空间占用,不过绝对物超所值,特别 是当你会在数据库中进行大量的读及搜索操作时。

    • 创建语句:CREATE INDEX name_index ON username(firstname, lastname)
    • 索引分类:(大概清楚就行)

      • 普通索引和唯一性索引。
      • 单个索引:索引建立语句中仅包含单个字段。复合索引:在索引建立语句中同时包含多个字段。
      • 聚簇索引:物理索引,与基表的物理顺序相同,数据值的顺序总是按照 顺序排列。非聚簇索引。

      • 使用场景:

        • 当某字段数据更新频率较低,查询频率较高,经常有范围 查询(>, <, =, >=, <=)或 order by、group by 发生时建议使用索引。
        • 经常同时存取多列,且每列都含有重复值可考虑建立复合索引。
        • 使用注意项(较难):
          (1). 对于复合索引,把使用最频繁的列做为前导列 (索引中第一个字段)。
          (2).避免对索引列进行计算,对 where 子句列的任何计算如果不能被编译 优化,都会导致查询时索引失效。
          (3).比较值避免使用 NULL。
          (4).多表查询时要注意是选择合适的表做为内表。内外表的选择可由公式: 外层表中的匹配行数*内层表中每一次查找的次数确定,乘积最小为最佳 方案。
          (5).把过滤记录数最多的条件放在最前面。
  • sql 语句拼接时可以使用 StringBuffer 代替 String。

  • 在写表时调用 sqliteOpenHelper..getWritableDatabase(),
    在读表时候调用 sqliteOpenHelper..getReadableDatabase(),getReadableDatabase 性能更优。
  • 开启子线程进行数据库读写。

版本迭代中数据库的更新问题

  • 应用程序如何知道数据库需要升级:SQLiteOpenHelper类的构造函数有 一个参数是int version,它的意思就是指数据库版本号。比如在应用1.0版本 中,我们使用SQLiteOpenHelper访问数据库时,该参数为1,那么数据库版本号 1就会写在我们的数据库中。到了1.1版本,我们的数据库需要发生变化,那么 我们1.1版本的程序中就要使用一个大于1的整数来构造SQLiteOpenHelper类, 用于访问新的数据库,比如2。当我们的1.1新程序读取1.0版本的老数据库时, 就发现老数据库里存储的数据库版本是1,而我们新程序访问它时填的版本号为 2,系统就知道数据库需要升级。
    何时触发数据库升级:当系统在构造 SQLiteOpenHelper 类的对象时,如果 发现版本号不一样,就会自动调用 onUpgrade 函数,让你在这里对数据库进行升级。

  • 升级时应该考虑的问题:数据库中的原数据不能丢失。

    • 如何升级:在 onUpgrade 方法中执行相应的更新数据库的 sql 语句就行了。下 面列举一些常见的更新的sql 语句。
      • 增加新表:CREATE TABLE table_name(_id integer primary key autoincrement, region varchar, code varchar)。 增加或者删除列:SQLite数库对ALTER TABLE命令支持非常有限,只能在表末尾 添加列,不能修改列定义,不能删除已有的列。那么如果要修改表呢?我们可 以采用临时表的办法。具体来说有四步:
        • 1).将表明改为临时表:ALTER TABLE table_name RENAME TO table_name_temp * 2).创建新表。
        • 将临时表的数据导入新表(不能出现values关键字):insert into table_name (_id, region, code, country) select _id, region, code, \”CHINA\” from table_name_temp
        • 删除临时表:DROP TABLE table_name _temp
  • 跨版本的数据库升级问题:应用程序发布了多个版本,以致出现了三个及 以上数据库版本。如何确保所有的用户升级应用后数据库都能用呢?

    • 方法一:确定相邻版本的差别,从版本1开始依次迭代更新,先执行v1到v2,再v2到v3这样依次下去。 优点:每次更新数据库的时候只需要在onUpgrade方法的末尾加一段从上个版 本升级到新版本的代码,易于理解和维护。 缺点:是当版本变多之后,多次迭代升级可能需要花费不少时间,增加用户等 待时间;

    • 方式二:为每个版本确定与现在数据库的差别,为每个case撰写专门的升级代码。 优点:则是可以保证每个版本的用户都可以在消耗最少的时间升级到最新的数据库而无需做无用的数据多次转存。缺点:是强迫开发者记忆所有版本数据库的完整结构,且每次升级时 onUpgrade方法都必须全部重写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值