android数据库

来源:互联网 发布:怎么可以看网络电视 编辑:程序博客网 时间:2024/05/29 05:08

 

目录
Android数据库 2
1 关系型数据库SQLIte 2
2 扩展类 5
2.1 扩展SQLiteOpenHelper 5
2.2 Cursor类 6
2.3 其他使用类 6
2.4 数据类型 7
3 数据库操作 7
3.1 创建和打开数据库 7
3.2 创建 7
3.3 销毁 7
3.4 SQL使用 8
3.4.1 新增 8
3.4.2 删除 9
3.4.3 查询 9
3.4.4 修改—更新 9
3.5 数据库操作的常见异常。 9
4 数据库打包回滚 9
5 官网地址 11
5.1 Sqlite不支持的sql特性 11
5.2 第一次开机流程 12
5.3 升级流程 12
5.4 方案2 13

Android数据库

1 关系型数据库SQLIte
  每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库—
SQLite。SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据库,它的设计目标是嵌入式的,占用
资源非常的低,只需要几百K的内存就够了。SQLite已经被多种软件和产品使用,Mozilla FireFox就是使用
SQLite来存储配置数据的,Android和iPhone都是使用SQLite来存储数据的。
SQLite体系结构图如下:     
  编译器包括Tokenizer(词法分析器)、 Parser(语法分析器)、Code Generator(代码产生器)。他们协
同处理文本形式的结构化查询语句。
  后端由B-tree,Pager,OS Interface组成。B-tree的职责是负责排序,维护多个数据库页之间错综复杂
的关系,将页面组织成树状结构,页面就是树的叶子。Pager负责传输,根据B-tree的请求从磁盘读取页面或者
写入页面。
  公共服务中有各种实用的功能比如:内存分配、字符串比较,Unicode转换等。
 SQLite数据库是D.Richard Hipp用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB。它具有如下特征

1、轻量级
SQLite和C\S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用
SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也相当小。
2、独立性
SQLite数据库的核心引擎本身不依赖第三方软件,使用它也不需要“安装”,所以在使用的时候能够省去不少麻
烦。
3、隔离性
SQLite数据库中的所有信息(比如表、视图、触发器)都包含在一个文件内,方便管理和维护。
4、跨平台
SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统之外,很多手机操作系统同样可以运行,
比如Android、Windows Mobile、Symbian、Palm等。
5、多语言接口
SQLite数据库支持很多语言编程接口,比如C\C++、Java、Python、dotNet、Ruby、Perl等,得到更多开发者
的喜爱。
6、安全性
SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一
数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写操作之前,必须获得独占锁定。
在发出独占锁定后,其他的读或写操作将不会再发生。
SQLite官方网站(http://www.sqlite.org),了解更多内容请前往。导出查看数据库文件
  在android中,为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于
Android设备/data/data/package_name/databases文件夹中。
  想要将数据库文件导出可以使用eclipse,如图所示:
 
  查看数据库,使用SQlite Database Browser,如图所示:
 
 
2 扩展类
2.1 扩展SQLiteOpenHelper
  Android 不自动提供数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQLiteOpenHelper 的子类,至少需要实现三个方法:
构造函数,调用父类 SQLiteOpenHelper 的构造函数
  onCreate()方法;// TODO 创建数据库后,对数据库的操作
  onUpgrage()方法。// TODO 更改数据库版本的操作
  当你完成了对数据库的操作(例如你的 Activity 已经关闭),需要调用 SQLiteDatabase 的 Close() 方法来释放掉数据库连接。
  操作数据库的最佳实践是创建一个辅助类,例如联系人模块
  class ContactsDatabaseHelper extends SQLiteOpenHelper
2.2 Cursor类
Android使用Cursor类返回一个需要的值,Cursor作为一个指针从数据库查询返回结果集,使用Cursor允许Android更有效地管理它们需要的行和列,你使用ContentValues对象存储键/值对,它的put()方法允许你插入不同数据类型的键值。
2.3 其他使用类
SQLiteDatabase:
是关于数据库操作,封装了管理数据库的各种方法,包括insert 、delete、 update 、query 、执行SQL命令等操作

DatabaseHelper :
 帮助类用它的getWritableDatabase()和getReadableDatabase()来获得数据库(SQLiteDatabase 对象)。

ContentProvider :
负责组织应用程序的数据;向其他应用程序提供数据;

ContentResolver :
则负责获取ContentProvider提供的数据;修改/添加/删除更新数据等;
UriMatcher:用于匹配Uri,使用步骤 1.首先把你需要匹配Uri路径全部给注册上。 2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行            匹配,如果匹配就返回匹配码,匹配码是调用 addURI()方法传入的第三个参数,假设匹配content://com.android.calendar/calendars路径,返回的匹配码            为1。

ContentValues  ContentValues: 是一种存储的机制,能存储基本类型的数据

DatabaseUtils  数据库操作帮助类

2.4 数据类型
  SQLite 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。比如可以把一个字符串(String)放入 INTEGER 列。SQLite 称这为“弱类型”(manifest typing.)。
 
3 数据库操作
3.1 创建和打开数据库
  在Android中创建和打开一个数据库都可以使用openOrCreateDatabase方法来实现,因为它会自动去检测是否存在这个数据库,如果存在则打开,如果不存在则创建一个数据库:创建成功则返回一个SQLiteDatebase对象,否则抛出异常FileNotFoundException。
3.2 创建
可以看到这个方法:
openOrCreateDatabase
 
作为一个基础类,它提供了接口来创建或者打开数据库。
而这里的path,毫无疑问应该是db的路径。如果路径指定的数据库不存在,那么就应该创建一个数据库。

3.3 销毁
deleteDatabase
 
3.4 SQL使用
数据库的使用,一个是增删查改的SQL。
另外一个,则是表结构变更,视图、触发器、关联键以及索引等得创建、销毁和修改。

我们关注常用的增删查改,可以看到它提供了如下接口,android的数据库的操作不能直接使用sql语句只能调用接口:
3.4.1 新增
 

3.4.2 删除
 
3.4.3 查询
 
3.4.4 修改—更新
 
 
3.5 数据库操作的常见异常。
     我们常常把内存空间不足异常忘记,导致在插入数据到数据库时报错, 删除和更新一般不会出错。
所以在执行数据库的时候注意系统资源不足情况的异常,如果需要捕获相应错误。
4 数据库打包回滚

在Android应用程序开发中,经常会遇到需要进行数据库操作的时候,有关数据库事务处理对Android应用程序的稳定性和效率提升非常重要。
首先Android数据库操作,特别是进行写操作的时候非常慢,将所有操作打包成一个事务能大大提高处理速度。
其次是保证数据的一致性,让一个事务中的所有操作都成功执行,或者失败,或者所有操作回滚。
如果您喜欢使用其他平台(如PHP + MySQL),代码通常在一个功能强大的服务器上运行,一般不会被意外中止,但在Android平台上,您将会因为一次又一次的意外中止感到惊呀。Android系统会杀死apps/threads/activities等中断数据库的使用,电池电量会耗尽或被移除等。所以,使用数据库事物至关重要。
实现Android数据库事务非常简单,只需要使用SQLiteDatabase类的三个方法即可。
◆beginTransaction();
◆setTransactionSuccessful();
◆endTransaction();
当调用endTransaction()时,所有从beginTransaction()开始的操作都会被提交。
一个简单的数据库事务操作如下所示:
[html] view plaincopyprint?
1. mDatabase.beginTransaction();   
2. try{   
3.   //在这里执行多个数据库操作   
4.   //执行过程中可能会抛出异常   
5.   mDatabase.setTransactionSuccessful();   
6.   //在setTransactionSuccessful和endTransaction之间不进行任何数据库操作   
7.   }catch(Exception e){   
8.     //当数据库操作出现错误时,需要捕获异常,结束事务   
9.     mDatabase.endTransaction();   
10.     throw e;   
11.   }   
12.   //当所有操作执行完成后结束一个事务   
13.   mDatabase.endTransaction(); 

以上是关于Android数据库事务操作的一个简单示例,在我们平时的Android开发中,将所有操作打包成一个事务为一个事务并保证事务的一致性,可以大幅提高Android数据库操作的效率。
5 官网地址
http://www.sqlite.org/docs.html
5.1 Sqlite不支持的sql特性
 
 
很重要的一点是,sqlite支持alter语句新增列和修改表名,但是不支持删除列及修改列名。
这意味着,如果你新增一列,参数有误或者设计不需要了,你无法通过alter语句来达到目的。
当然,可以通过其他方法达到目标:
① 创建一个同数据结构的临时表
② 将目标表数据导入临时表
③ 删除基表,再从临时表中导出数据到新建表单中
操作看起来不复杂,但是如果涉及大数据量操作以及键值关联的时候,就会比较麻烦。
如果我们按照android给我们设计的思路,我们要考虑两个流程:
一个是手机第一次开机或者说恢复出厂设置后的流程。
一个是手机OTA升级的流程,或者是替换APK重启进程的流程。
5.2 第一次开机流程
要在onCreate方法中,
 
在这个地方,要把变更的表结构加进去。

5.3 升级流程
对于TelephonyProvider对应的DB来说,我们要修改DATABASE_VERSION的值。我们只要让它的值比当前的值大就可以。
 
比如可以按照惯例,设置成:
private static final int DATABASE_VERSION = 9 << 16;

这样TeleonyProvider依附与Phone进程被实例化后,再被调用查询语句被查询时,就会修改数据库的表结构。由于开启了事物,在事物结束后会重建Reference,因此,查询结果也能保证是正确的。
5.4 方案2
方案2,就是自己去写alter table 的语句,完了之后调用db.close()来清除Reference,这样也能保证后面Cursor查询的正确性。
 


编译器包括Tokenizer(词法分析器)、 Parser(语法分析器)、Code Generator(代码产生器)。他们协
同处理文本形式的结构化查询语句。
  后端由B-tree,Pager,OS Interface组成。B-tree的职责是负责排序,维护多个数据库页之间错综复杂
的关系,将页面组织成树状结构,页面就是树的叶子。Pager负责传输,根据B-tree的请求从磁盘读取页面或者
写入页面。
  公共服务中有各种实用的功能比如:内存分配、字符串比较,Unicode转换等。
 SQLite数据库是D.Richard Hipp用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB。它具有如下特征

1、轻量级
SQLite和C\S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用
SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也相当小。
2、独立性
SQLite数据库的核心引擎本身不依赖第三方软件,使用它也不需要“安装”,所以在使用的时候能够省去不少麻
烦。
3、隔离性
SQLite数据库中的所有信息(比如表、视图、触发器)都包含在一个文件内,方便管理和维护。
4、跨平台
SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统之外,很多手机操作系统同样可以运行,
比如Android、Windows Mobile、Symbian、Palm等。
5、多语言接口
SQLite数据库支持很多语言编程接口,比如C\C++、Java、Python、dotNet、Ruby、Perl等,得到更多开发者
的喜爱。
6、安全性
SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一
数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写操作之前,必须获得独占锁定。
在发出独占锁定后,其他的读或写操作将不会再发生。
 
SQLite官方网站(http://www.sqlite.org),了解更多内容请前往。导出查看数据库文件
  在android中,为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data/package_name/databases文件夹中。
  想要将数据库文件导出可以使用eclipse,如图所示:

1 数据库生命周期
  共享数据库 : static 块优先于Application,即共享数据库中先创建数据库在启动应用总入库Application。
  一般数据库 : 在实例化的时候被创建
  综上两点我们在做优化的时候应该考虑这两种情况,进行首次启动时间优化的考量。

2 数据库操作中使用的的关键类
  DatabaseHelper
  SQLiteDatabase
  ContentValues
  Cursor
  ContentResolver
  UriMatcher
  ContentProvider
  DatabaseUtils


3 应用的共享数据库一般应该加上权限防止被攻击。
  例如时钟应用当中:
  在配置文件中自定义读写权限,
  <permission android:name="com.huawei.alarm.provider.readPermission" />
  <permission android:name="com.huawei.alarm.provider.writePermission" />
  然后再Provider中声明它,
  <provider
   android:name=".AlarmProvider"
   android:authorities="com.android.deskclock"
   android:exported="true"
   android:readPermission="com.huawei.alarm.provider.readPermission"
   android:writePermission="com.huawei.alarm.provider.writePermission" />

4 数据库操作的常见异常。
  我们常常把内存空间不足异常忘记,导致在插入数据到数据库时报错, 删除和更新一般不会出错。


5 SQL语句
  直接使用SQL语句进行数据库的操作。
 

搜一下:Checking for alarms...
之后sending alarm 的log,这个里面有能看出是不是向应用发送intent


闹钟在处理开机广播的过程中过时问题,应该怎么处理掉比较科学。


#DTS2014021700292 w81003501 20140216 begin?
ro.config.hw_audio_plus=true?
#DTS2014021700292 w81003501 20140216 end

 


#DTS2014021700292 w81003501 20140216 begin?
ro.config.hw_audio_plus=true?
#DTS2014021700292 w81003501 20140216 end

 


 

0 0