进行Android应用开发时经常会用到数据库。Android系统支持sqlite数据库,在app开发过程中很容易通过SQLiteOpenHelper使用数据库,SQLiteOpenHelper依赖于Context对象,但是基于uiatomator1.0和Java程序等无法获取Context的应用如何使用数据库呢?
通过以下方面介绍一下数据库的使用:
①. Android App内如何创建数据库
②. Android App内创建数据库如何自定义文件路径
③. Android App内获取数据库流程解析
④. 无Context模式使用数据库,可在uiautomator1.0测试框架和其他app_process启动的进程内使用数据库。
App内常规使用数据库
Android应用内使用数据库需要借助于SQLiteOpenHelper类实现对数据库的操作。
使用数据库通过以下几步:
①. 创建私有类集成自SQLiteOpenHelper方法,并覆写onCreate、onUpdate方法实现对数据库升级降级操作。
②. 获取SQLiteOpenHelper对象实例。
③. 获取只读、读写类型数据库SQLiteDatabase对象实例
(getReadableDatabase()/getWritableDatabase()),当数据库升级或创建时才会调用onCreate、onUpdate方法。
④. 使用SQLiteDatabase接口实现数据库操作(增删改查)
数据库源码解析
1、SQLiteOpenHelper构造方法中仅仅做了参数的赋值操作,没有关联数据库操作。但是对数据库版本号有校验。
2、通过getWritableDatabase()方法获取数据库对象,实际是调用getDatabaseLocked(boolean writable)方法。
3、getDatabaseLocked(boolean writable)方法主要源码如下,该方法关联数据库文件获取SQLiteDatabase对象,并根据数据库的版本号变化调用SQLiteOpenHelper的周期方法,实现数据库onCreate和onUpgrade方法调用。
4、通过源码知道
mContext.getDatabasePath(mName).getPath()方法获取数据库路径,该方法实现位于ContextImpl类中。看源码逻辑知道如果传递数据库文件绝对路径则返回指定的文件对象,如果传递文件名则通过Context的getDatabasesDir()方法获取数据库存储路径。
自定义本地数据库文件路径
通过上面源码可以获知修改数据库文件路径有三种方式:
1
更改context中getDatabasesDir()方法的返回值;
2
构建SQLiteOpenHelper对象时传递数据库文件的绝对路径;
3
覆写SQLiteOpenHelper对象的获取数据库方法,自定义获取数据库获取逻辑,这种实现模式不需要依赖Context对象。
**1、更改context中getDatabasesDir()的返回值 **
①、自定义Application
②、覆写Application的getDatabasePath(String name)方法,在方法内指定自定义路径。
③、在AndroidManifest.xml中指定自定义Application
2、构建数据库时传入绝对路径:必须使用Context对象
3、在SQLiteOpenHelper子类中覆写
getWritableDatabase()和
getReadableDatabase():可不使用Context
使用建议
调用getWritableDatabase()获取数据库时会重新创建数据库实例,一般在程序中复用该数据库实例即可,如果保存多份数据库实例会导致OOM异常。
执行数据库操作时尽量使用API操作,不要自己拼接sql语句,避免sql注入相关问题。