【Android产品质量提升系列】奇葩数据库与数据库差异引起的机型适配问题


本文转载自 腾讯优测  原文地址http://bbs.utest.qq.com/?p=73


Android平台的数据库是一个牵一发动全身的模块。出现任何的数据问题都是用户所无法忍受的。残酷的现实告诉我们,在人们不冷静的情况下,什么事情都可能发生。小则电话里喷客服,大则……请参考《死神来了》。所以机智的程序员,无论有证没证,一定要把产品对数据库的操作做到万无一失。

 

Android数据库】

  1. SQLite数据库

Android使用开源的、与操作系统无关的SQL数据库—SQLite。SQLite是一款轻量级数据库,它的设计目标是嵌入式,占用资源非常的低,只需要几百K的内存就够了。SQLite已经被多种软件和产品使用,Mozilla FireFox就是使用SQLite来存储配置数据的,Android和iPhone也都使用SQLite来存储数据。SQLite有以下特点:

1、轻量级

SQLite和C\S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也相当小。

2、独立性

SQLite数据库的核心引擎本身不依赖第三方软件,使用它也不需要“安装”,所以在使用的时候能够省去不少麻烦。

3、隔离性

SQLite数据库中的所有信息(比如表、视图、触发器)都包含在一个文件内,方便管理和维护。

4、跨平台

SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统之外,很多手机操作系统同样可以运行,比如Android、WP、IOS、Symbian等。

5、多语言接口

SQLite数据库支持很多语言编程接口,比如C\C++、Java、Python、dotNet、Ruby、Perl等,得到更多开发者的喜爱。

6、安全性

SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写操作之前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。

SQLite的体系结构如下图,它由SQL编译器、内核、后端以及附件组成。

51

编译器包括Tokenizer(词法分析器)、 Parser(语法分析器)、Code Generator(代码产生器)。他们协同处理文本形式的结构化查询语句。

后端由B-tree,Pager,OS Interface组成。B-tree的职责是负责排序,维护多个数据库页之间错综复杂的关系,将页面组织成树状结构,页面就是树的叶子。Pager负责传输,根据B-tree的请求从磁盘读取页面或者写入页面。

附件中有各种实用的功能比如:内存分配、字符串比较,Unicode转换等。

 

  1. Android数据库:

接下来我们讨论一下android平台的数据库。

Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用SQLite 数据库。对于熟悉 Java和SQLite的开发人员来说,使用JDBC(Java Data Base Connectivity,java数据库连接,是一种用于执行SQL语句的Java API)操作SQLite 相当简单。但是,由于 JDBC会消耗太多的系统资源,所以 JDBC 对于手机这种内存受限设备来说并不合适。因此,Android 在FrameWork层对SQLite的一些功能进行了封装,提供了如下接口供开发者调用。

SQLiteCursor
SQLiteDatabse
SQLiteOpenHelper
SQLiteProgram
SQLiteQuery
SQLiteQueryBuilder
SQLiteStatement

 

Android每个程序的数据库存储在 data/< 项目文件夹 >/databases/ 下。Activites可以通过Content Provider或者Service访问一个数据库。访问框架如下。

52

53

【数据库的适配问题】

Android数据库差异是导致机型适配问题的重灾区。在android碎片化问题中是比较有代表性的一类。

我们知道,SQLite数据库是使用SQL语言操作的。而在framework层Android封装了操作数据库的API,提供给开发者调用。Android曾在SDK 2.0+和2.2版本对数据库结构和数据库操作进行了重新梳理,并对相应的API做过修改。这会引发一定的机型适配问题。但就目前收集到的问题来看,这一类的问题较少。

但奇葩的是,众多厂商定制rom,会在数据库结构和内容上大作文章。其中典型的是增删改字段,这么做的主要目的是适应机型的特殊功能所需要的数据库。比如说双卡双待手机有两个联系人字段。

其次问题很多的是,修改数据库目录结构和数据库表。熟悉android的同学都知道,由于继承了Linux文件访问权限的机制,一个android APP是没有权限访问其他APP数据的。如果需要某些数据,就要由这些数据的所有者把数据提供出来。 而为了数据安全和隐私考虑,所有者提供哪些数据,这就最好有统一的数据库目录管理。因此厂商做这部分修改,是需要将一些功能上有关联关系的字段或者需要对外提供的常用数据字段,聚合在一起,统一管理。比如,三星9300的Settings数据库增加了global目录,存放一些可以供各个应用使用的公共数据。再比如,9250的联系人数据库中将account_name/account_type 抽出新建了accounts表。

还有一类是厂商自定义字段值造成的适配问题。比如,插入分组联系人,却不显示的问题。因为需要在数据库中对account_name、account_type进行赋值。

最后一类是权限差异。比如三星部分机型对于settings数据库设置了自定义的权限,这样其他应用通过标准的访问权限访问将抛出没有权限的错误。

 

【解决适配问题】

大连kapalai项目组对数据库相关的机型适配bug进行了搜集和整理。接下来举几个例子说明。

 

  1. SDK API问题:批量添加联系人失败

调用android.content.ContentResolver.applyBatch(String authority, ArrayList operations)实现批量插入联系人数据时抛出 OperationApplicationException异常。批量操作在SDK2.0加入,部分2.0+的手机不支持批量插入操作,这通常是由于刷机引起的。

解决方案:

根据SDK版本来判断这个API是否可用是不精确的。可以在批量操作时做异常捕捉,如果操作失败则使用逐个添加联系人的方式处理。

 

  1. 数据库结构问题:开启飞行模式失败

三星9300。通过非系统应用,开启飞行模式失败。这是因为,通常在标准的数据库结构中,飞行模式字段airplane_mode_on保存在settings数据库system目录中,但是9300新建了一个settings/global目录,将airplane_mode_on保存在该目录下。

解决方案:

需要有root权限的手机,使用shell指令访问sqlite数据库,把数据库复制出来,并用SQLiteExpert查看。

具体步骤如下:

1、运行cmd,切换到android-sdk目录

2、shell命令记住两个基本命令ls和cd,类似windows命令提示行中的dir和cd,代表列出当前目录下文件列表和进入到指定目录。了解这两个命令之后,就可以找到数据库目录:data/data/项目包名/databases。

3、将数据库pull到本地路径。使用SQLiteExpert查看数据库文件。

 

  1. 字段赋值问题:创建浏览器书签,提示创建成功,却无法在浏览器中查找到该书签。

三星部分机型。由于系统浏览器只识别书签数据库中folder字段值为0的数据,当非系统浏览器应用在向书签数据库插入数据并不指定folder字段值时,默认值是99。这就导致系统浏览器无法显示插入的书签。

解决方案:

建议代码如下:

ContentValues values = new ContentValues();

values.put(Browser.BookmarkColumns.TITLE, “android-scannerr”);

values.put(Browser.BookmarkColumns.URL, “www.android-scanner.com”);

values.put(Browser.BookmarkColumns.BOOKMARK, 1);

values.put(“folder”, 0);        //指定folder字段为0

contentResolver.insert(Browser.BOOKMARKS_URI, values);

如上面所说的,Android数据库差异是机型适配问题的重灾区。并且,数据库是一个通用模块,很多功能都会涉及到,影响范围很广。比如,短信,通讯录,双卡等等。今后我们在讨论其他问题的时候还会进一步将数据库和这些特定功能结合在一起,来讨论相关的适配问题。

数据库问题之所以让人头疼,是因为它问题很多,但解决方案有限。厂商定制rom,在数据库部分不按套路出牌,毫无规律可循。我们找不到一个统一的解决方案,只能收集更多的机型特点,根据每个机型的数据库结构和特性,进行有针对性的修改。大连腾讯优测项目收集了很多机型的数据库适配问题。各位做机型适配的同学,可以尝试用腾讯优测扫描工具扫描代码,提早发现适配问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值