【Android 开发】:数据存储之 SQLite 数据库操作(一)

本文介绍了Android中SQLite数据库的管理方法,包括如何通过SQLiteOpenHelper创建和更新数据库,以及如何实现数据库版本控制。通过实例展示了数据库表的创建和字段的添加过程。

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

 上一讲我们讲解了 Android 中SD卡的存储方式[数据存储之File文件存储 [即SD卡的写入与读取]],共享参数的存储方式[SharedPreference 共享参数],这一讲我们来讲解一下数据库的存储方式 ,SQLite数据库属于文本型的数据库,它是以文本的形式来保存的。

1. SQLite 数据库介绍

查看 Android API文档中 SQLite 的介绍
    Android提供了对 SQLite 数据库的完全支持,应用程序中的任何类都可以通过名称来访问任何的数据库,但是应用程序之外的就不能访问。
建议创建一个新的数据库的方式就是创建一个子类继承 SQLiteOpenHelper 然后重写它的 onCreate() 方法,这样你就可以在数据库中执行 SQLite的语法命令来创建表了
查看API文档中 SQLiteOpenHelper 类的介绍
    这是一个帮助类,作用是管理数据库的创建和版本的管理,你可以创建一个子类来实现 onCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int) 方法, onOpen(SQLiteDatabase)可以选择是否要实现。这个类负责在数据库存在的情况下,打开数据库,如果它不存在则会创建数据库,并且在必要的时候更新它。事务也会被使用到,这样才能确保数据库总是在合理的状态。
        查看它的方法列表:
        getReadableDatabase() 可以通过这个方法进行数据库的创建和打开

2. 程序实现

1) DBOpenHelper.java 用来更新或者创建数据库使用

[java]  view plain copy
  1. package com.android.sqlitedemo.db;  
  2.   
  3. import android.content.Context;  
  4. import android.database.DatabaseErrorHandler;  
  5. import android.database.sqlite.SQLiteDatabase;  
  6. import android.database.sqlite.SQLiteOpenHelper;  
  7. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
  8.   
  9. public class DBOpenHelper extends SQLiteOpenHelper {  
  10.   
  11.     /** 
  12.      * 查看SQLiteOpenHelper api文档的,它的构造方法 
  13.      * public SQLiteOpenHelper (Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 
  14.      * 创建一个帮助类的对象来创建,打开,或者管理一个数据库,这个方法总是会快速的返回, 
  15.      * 这个数据库实际上是没有被创建或者打开的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一个被调用时才会进行创建或者打开 
  16.      * 参数: 
  17.      *   context : 上下文对象,用来打开或者创建数据库 
  18.      *   name : 数据库文件的名称,如果是创建内存中则位null , 
  19.      *   factory : 用来创建游标对象,默认的是为null 
  20.      *   version : 数据库的版本号(以版本数字号1开始),如果数据库比较旧,就会用 onUpgrade(SQLiteDatabase, int, int) 方法来更新数据库, 
  21.      *             如果数据库比较新,就使用 onDowngrade(SQLiteDatabase, int, int)  方法来 回退数据库 
  22.      * 【注意】 : 我们声明完这个构造方法之后,包括初始化它的名称 和 版本之后,实际上它还是没有马上被创建起来的。 
  23.      */  
  24.     private static String name = "mydb.db"//表示数据库的名称  
  25.     //private static int version = 1; //表示数据库的版本号  
  26.     private static int version = 2//更新数据库的版本号,此时会执行 onUpgrade()方法  
  27.     public DBOpenHelper(Context context) {  
  28.         super(context, name, null, version);  
  29.         // TODO Auto-generated constructor stub  
  30.     }  
  31.   
  32.     //当数据库创建的时候,是第一次被执行,完成对数据库的表的创建  
  33.     @Override  
  34.     public void onCreate(SQLiteDatabase db) {  
  35.         // TODO Auto-generated method stub  
  36.         //SQLite 数据创建支持的数据类型: 整型数据,字符串类型,日期类型,二进制的数据类型  
  37.         //数据库这边有一个特点,就是SQLite数据库中文本类型没有过多的约束,也就是可以把布尔类型的数据存储到文本类型中,这样也是可以的  
  38.         String sql = "create table person(id integer primary key autoincrement,name varchar(64),address varchar(64))";  
  39.         db.execSQL(sql); //完成数据库的创建   
  40.     }  
  41.   
  42.     /** 
  43.      * onUpgrade() 方法是在什么时候被执行呢? 
  44.      * 查看API文档中 onUpgrade()介绍 
  45.      *   当数据库需要升级时调用这个方法[在开发过程中涉及到数据库的设计存在缺陷的时候进行升级,不会损坏原来的数据],这种实现方式会使用方法来减少表,或者增加表,或者做版本更新的需求。 
  46.      * 在这里就可以执行 SQLite Alter语句了,你可以使用 ALTER TABLE 来增加新的列插入到一张表中,你可以使用 ALTER TABLE 语句来重命名列或者移除列,或者重命名旧的表。 
  47.      * 你也可以创建新的表然后将旧表的内容填充到新表中。 
  48.      *   此方法会将事务之内的事件一起执行,如果有异常抛出,任何改变都会自动回滚操作。 
  49.      *   参数: 
  50.      *     db : 数据库 
  51.      *     oldVersion : 旧版本数据库 
  52.      *     newVersion : 新版本数据库 
  53.      * 【注意】:这里的删除等操作必须要保证新的版本必须要比旧版本的版本号要大才行。[即 Version 2.0 > Version 1.0 ] 所以这边我们不需要对其进行操作。 
  54.      */  
  55.     @Override  
  56.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  57.         // TODO Auto-generated method stub  
  58.         String sql = "alter table person add sex varchar(8)";  
  59.         db.execSQL(sql);  
  60.     }  
  61.   
  62. }  
2) MainActivity.java 主程序的实现

[java]  view plain copy
  1. package com.android.sqlitedemo;  
  2.   
  3. import com.android.sqlitedemo.db.DBOpenHelper;  
  4.   
  5. import android.os.Bundle;  
  6. import android.app.Activity;  
  7. import android.content.Context;  
  8. import android.view.Menu;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12.   
  13. public class MainActivity extends Activity {  
  14.   
  15.     private Button button;  
  16.   
  17.     @Override  
  18.     protected void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.activity_main);  
  21.         initComponent();  
  22.         button.setOnClickListener(new OnClickListener() {  
  23.   
  24.             @Override  
  25.             public void onClick(View v) {  
  26.                 // TODO Auto-generated method stub  
  27.                 DBOpenHelper helper = new DBOpenHelper(MainActivity.this);  
  28.                 // 调用 getWritableDatabase()或者 getReadableDatabase()其中一个方法将数据库建立  
  29.                 helper.getWritableDatabase();  
  30.             }  
  31.         });  
  32.     }  
  33.   
  34.     @Override  
  35.     public boolean onCreateOptionsMenu(Menu menu) {  
  36.         // Inflate the menu; this adds items to the action bar if it is present.  
  37.         getMenuInflater().inflate(R.menu.main, menu);  
  38.         return true;  
  39.     }  
  40.   
  41.     private void initComponent() {  
  42.         button = (Button) findViewById(R.id.button1);  
  43.     }  
  44.   
  45. }  

3. 执行结果

1). 当数据库版本为 1 (version = 1)的时候数据库内容如下图所示


2). 当数据库版本为 2 (version = 2)的时候数据库进行了更新操作,执行了 onUpgrade() 方法,更新后的内容增加了一列,如下图所示



目录 使用SQLite编程的快速介绍............................................................. 5 下载代码 .......................................................................... 5 创建个新数据库 .................................................................. 5 使用 SQLite 编写程序 .............................................................. 5 SQLite适用的范围 ..................................................................... 7 SQLite最佳试用场合................................................................ 7 哪些场合适合使用其他的关系型数据库管理系统(RDBMS) ............................... 9 SQLite 第三版总览(简介).............................................................. 10 命名上的变化 ..................................................................... 10 新的文件格式 ..................................................................... 10 弱类型和BLOB技术支持 ............................................................ 11 支持UTF-8和UTF-16............................................................... 11 用户定义的分类排序 ............................................................... 12 64字节的行编号................................................................... 12 改良的并发性 ..................................................................... 13 致谢 ............................................................................. 13 SQLite 第三版中的数据类型............................................................ 14 1.存储类别 ....................................................................... 14 2.列之间的亲和性 ................................................................. 14 3.比较表达式 ..................................................................... 16 4.运算符 ......................................................................... 17 5.分类,排序混合挑选 ........................................................... 17 6.其它亲和性模式 ................................................................. 17 7.用户定义的校对顺序 ............................................................. 18 SQLite 不支持的 SQL 特性............................................................. 20 SQLite的体系结构简介 ................................................................ 21 简介 ............................................................................. 21 接口程序 ......................................................................... 21 Tokenizer ........................................................................ 21 Parser ........................................................................... 22 代码发生器 ....................................................................... 22 虚拟机器 ......................................................................... 22 B-树 ............................................................................. 23 页面高速缓存 ..................................................................... 23 OS 接口程序 ...................................................................... 23 Utilities ........................................................................ 23 测试代码 ......................................................................... 23 SQLite与其他数据库的速度比较 ........................................................ 24 执行程序总结 ..................................................................... 24 测试环境 ......................................................................... 24 测试1:1000 INSERTs............................................................... 25 测试2:在事务处理程序中的 25000 INSERTs........................................... 25 测试3:在编入索引表格中的25000 INSERTs ........................................... 26 测试4:没有索引的 100 SELECTs..................................................... 26 测试5:个字符串比较上的100 SELECTs ........................................... 27 2 / 123 测试6:创建索引................................................................... 27 测试7:没有索引的5000 SELECTs .................................................... 27 测试8:没有索引的1000 UPDATEs .................................................... 28 测试9:有索引的25000 UPDATEs ..................................................... 28 测试10:有索引的25000 text UPDATEs ............................................... 28 测试11:来源于SELECT的INSERTs ................................................... 29 测试12:没有索引的DELETE ......................................................... 29 测试13:有索引的DELETE ........................................................... 29 测试14:个大 DELETE之后的个大INSERT.......................................... 30 测试15:个大的DELETE及许多小INSERTs ........................................... 30 测试16:DROP TABLE................................................................ 30 SQLite中的空处理与其它数据库引擎比较 .............................................. 31 SQLite 数据库的速度比较(wiki)........................................................ 34 Test 1: 1000 INSERTs ............................................................. 36 Test 2: 25000 INSERTs in a transaction ........................................... 36 Test 3: 25000 INSERTs into an indexed table ...................................... 37 Test 4: 100 SELECTs without an index ............................................. 37 Test 5: 100 SELECTs on a string comparison ....................................... 38 Test 6: INNER JOIN without an index .............................................. 38 Test 7: Creating an index ........................................................ 38 Test 8: 5000 SELECTs with an index ............................................... 39 Test 9: 1000 UPDATEs without an index ............................................ 39 Test 10: 25000 UPDATEs with an index ............................................. 39 Test 11: 25000 text UPDATEs with an index ........................................ 40 Test 12: INSERTs from a SELECT ................................................... 40 Test 13: INNER JOIN with index on one side ....................................... 41 Test 14: INNER JOIN on text field with index one side ......................... 41 Test 15: 100 SELECTs with subqueries. Subquery is using an index ................. 41 Test 16: DELETE without an index ................................................. 42 Test 17: DELETE with an index .................................................... 42 Test 18: A big INSERT after a DELETE ......................................... 42 Test 19: A big DELETE followed by many small INSERTs ............................. 42 Test 20: DROP TABLE .............................................................. 43 附加文件...................................................................... 43 SQLite在Windows中的性能调试 ........................................................ 44 直接使用SQLite................................................................... 44 2:Indexes 和数据库结构是非常重要的。 ............................................ 44 3:页面规模也很重要 .............................................................. 45 4:成群的索引 .................................................................... 45 5:作为读这篇文章的收获,这里有个不智能的事情需要提醒你。 ........................ 46 SQLite中如何用触发器执行取消和重做逻辑 .............................................. 47 SQLite3 C/C++ 开发接口简介(API函数) ............................................... 55 1.0 总览 ......................................................................... 55 2.0 C/C++ 接口 ................................................................... 55 如何在VS 2003下编译SQLite .......................................................... 61 下载 ............................................................................. 61 创建个 DLL 工程 ................................................................ 61 3 / 123 把 SQLite 的源文件添加到工程当中去 ............................................... 61 Make a .DEF file ................................................................. 61 如何编译 SQLITE.EXE 命令行程序 ................................................... 62 SQLite常见问题解答 .................................................................. 64 Frequently Asked Questions ....................................................... 64 (1)如何建立自动增长字段? ......................................................... 64 (2)SQLite支持何种数据类型?...................................................... 65 (3)SQLite允许向个integer型字段中插入字符串!.................................. 65 (4)为什么SQLite不允许在同个表不同的两行上使用0和0.0作主键? ................. 65 (5)多个应用程序或个应用程序的多个实例可以同时访问同个数据库文件吗? .......... 65 (6)SQLite线程安全吗?............................................................ 66 (7)SQLite数据库中如何列出所有的表和索引? ..................................... 66 (8)SQLite数据库有已知的大小限制吗?.............................................. 67 (9)SQLite中,VARCHAR字段最长是多少?.......................................... 67 (10)SQLite支持二进制大对象吗?................................................... 67 (11)SQLite中,如何在个表上添加或删除列? .................................. 68 (12)我在数据库中删除了很多数据,但数据库文件没有变小,是Bug吗? ................. 68 (13)我可以在商业产品中使用SQLite而不需支付许可费用吗? .......................... 68 (14)如何在字符串中使用单引号(')? ................................................ 68 (15)SQLITE_SCHEMA error是什么错误?为什么会出现该错误?.......................... 69 (16)为什么 ROUND(9.95,1) 返回 9.9 而不是 10.0? 9.95不应该圆整 (四舍五入)吗?... 70 SQLite的原子提交原理 ................................................................ 71 1.0 简介 ......................................................................... 71 2.0 硬件设定 ..................................................................... 71 3.0 单个文件提交 ................................................................. 73 3.1 实始状态.................................................................. 73 3.2 申请个共享锁............................................................ 73 3.3 从数据库里面读取信息...................................................... 74 3.4 申请个Reserved Lock .................................................... 74 3.5 生成个回滚日志文件...................................................... 75 3.6 修改用户进程中的数据页.................................................... 76 3.7 刷新回滚日志文件到存储设备中.............................................. 76 3.8 获得个独享锁............................................................ 77 3.9 将变更写入到数据库文件中.................................................. 78 3.10 刷新变更到存储........................................................... 78 3.11 删除回滚日志文件......................................................... 79 3.12 释放锁................................................................... 80 4.0 回滚 ......................................................................... 81 4.1出事了,!!! ......................................................... 81 4.2 Hot Rollback Journals..................................................... 81 4.3 取得数据库的个独享锁.................................................... 82 4.4 回滚没有完成的变更........................................................ 83 4.5 删除hot日志文件.......................................................... 83 4.6 如果切正常,没有什么未完成的写操作...................................... 84 5.0 多文件提交 ................................................................... 84 5.1 每个数据库文件单独拥有日志............................................ 85 5.2 主日志文件................................................................ 85 4 / 123 5.3 更新回滚日志文件头........................................................ 86 5.4 修改数据库文件............................................................ 86 5.5 删除主日志文件............................................................ 87 5.6 清除回滚日志.............................................................. 87 6.0原子操作的些实现细节........................................................ 88 6.1 总是记录整个扇区.......................................................... 88 6.2 写日志文件时垃圾的处理.................................................... 88 6.3 提交前缓存溢出............................................................ 89 7.0 优化 ......................................................................... 89 7.1 在事务间保存缓.......................................................... 90 7.2 独享访问模式.............................................................. 90 7.3 不必将空闲页写进日志...................................................... 90 7.4 单页更新及扇区原子写...................................................... 91 7.5 Filesystems With Safe Append Semantics.................................... 91 8.0 原子提交行为测试 ............................................................. 91 9.0 会导致完蛋的事情 ............................................................. 92 9.1 缺乏文件锁实现............................................................ 92 9.2 不完整的磁盘刷新.......................................................... 92 9.3 文件部分地删除............................................................ 93 9.4 写入到文件中的垃圾........................................................ 93 9.5 删除掉或更名了“hot”日志文件............................................. 93 10.0 总结及未来的路 .............................................................. 93 SQLite的查询优化 .................................................................... 95 、影响查询性能的因素: ......................................................... 95 二、几个查询优化的转换 ........................................................... 95 三、 几种查询语句的处理(复合查询) .............................................. 95 四、子查询扁平化 ................................................................. 96 五、连接查询 ..................................................................... 98 六、索引 ......................................................................... 99 SQLITE3 使用总结.................................................................... 102 前序: .......................................................................... 102 、版本 ........................................................................ 102 二、基本编译 .................................................................... 102 三、SQLITE操作入门.............................................................. 103 (1)基本流程................................................................ 103 (2)SQL语句操作 ............................................................ 104 (2)操作二进制.............................................................. 108 (4)事务处理................................................................ 109 四、给数据库加密 ................................................................ 109 五、后记 ........................................................................ 122
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值