移动测试开发 Android sqlite 的使用

opentest-oper@360.cn · 2019年04月19日 · 862 次阅读

进行 Android 应用开发时经常会用到数据库。Android 系统支持 sqlite 数据库,在 app 开发过程中很容易通过 SQLiteOpenHelper 使用数据库,SQLiteOpenHelper 依赖于 Context 对象,但是基于 uiatomator1.0 和 Java 程序等无法获取 Context 的应用如何使用数据库呢?

通过以下方面介绍一下数据库的使用:
1、Android App 内如何创建数据库
2、Android App 内创建数据库如何自定义文件路径
3、Android App 内获取数据库流程解析
4、无 Context 模式使用数据库,可在 uiautomator1.0 测试框架和其他 app_process 启动的进程内使用数据库。

App 内常规使用数据库

Android 应用内使用数据库需要借助于 SQLiteOpenHelper 类实现对数据库的操作,使用数据库通过以下几步:
1、创建私有类集成自 SQLiteOpenHelper 方法,并覆写 onCreate、onUpdate 方法实现对数据库升级降级操作。
2、获取 SQLiteOpenHelper 对象实例。
3、获取只读、读写类型数据库 SQLiteDatabase 对象实例(getReadableDatabase()/getWritableDatabase()),当数据库升级或创建时才会调用 onCreate、onUpdate 方法。
4、使用 SQLiteDatabase 接口实现数据库操作(增删改查)

数据库源码解析

1、SQLiteOpenHelper 构造方法中仅仅做了参数的赋值操作,没有关联数据库操作。但是对数据库版本号有校验。

2、通过 getWritableDatabase() 方法获取数据库对象,实际是调用 getDatabaseLocked(boolean writable) 方法。

3、getDatabaseLocked(boolean writable) 方法主要源码如下,该方法关联数据库文件获取 SQLiteDatabase 对象,并根据数据库的版本号变化调用 SQLiteOpenHelper 的周期方法,实现数据库 onCreate 和 onUpgrade 方法调用。

4、通过源码知道 mContext.getDatabasePath(mName).getPath() 方法获取数据库路径,该方法实现位于 ContextImpl 类中。看源码逻辑知道如果传递数据库文件绝对路径则返回指定的文件对象,如果传递文件名则通过 Context 的 getDatabasesDir() 方法获取数据库存储路径。

自定义本地数据库文件路径

通过上面源码可以获知修改数据库文件路径有三种方式:
①、更改 context 中 getDatabasesDir() 方法的返回值;
②、构建 SQLiteOpenHelper 对象时传递数据库文件的绝对路径;
③、覆写 SQLiteOpenHelper 对象的获取数据库方法,自定义获取数据库获取逻辑,这种实现模式不需要依赖 Context 对象。

①、更改 context 中 getDatabasesDir() 的返回值
1、自定义 Application
2、覆写 Application 的 getDatabasePath(String name) 方法,在方法内指定自定义路径。
3、在 AndroidManifest.xml 中指定自定义 Application

②、构建数据库时传入绝对路径:必须使用 Context 对象

③、在 SQLiteOpenHelper 子类中覆写 getWritableDatabase() 和 getReadableDatabase():可不使用 Context

使用建议

调用 getWritableDatabase()获取数据库时会重新创建数据库实例,一般在程序中复用该数据库实例即可,如果保存多份数据库实例会导致 OOM 异常。
执行数据库操作时尽量使用 API 操作,不要自己拼接 sql 语句,避免 sql 注入相关问题。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册