现在的位置: 首页 > 综合 > 正文

android数据库基础

2018年04月17日 ⁄ 综合 ⁄ 共 5591字 ⁄ 字号 评论关闭

数据库是保存用户数据的文件,包括默认的设置和个人重新设置的数据,这些数据保存在/data/data下的各个以

apk包名为目录名的路径下:

#cd /data/data

#busybox find ./ -name "*.db" -print

 ./com.Android.email/databases/EmailProviderBody.db
-
 

./com.Android.email/databases/EmailProvider.db
./com.Android.rk.books/databases/books.db
./com.Android.providers.contacts/databases/contacts2.db
./com.google.Android.gm/databases/gmail.db
./com.google.Android.gm/databases/downloads.db
./com.Android.vending/databases/assets.db
./com.Android.providers.media/databases/internal.db
./com.Android.providers.media/databases/external.db
./com.Android.deskclock/databases/alarms.db
./yd.spreadwin.launcher/databases/launcher.db
./com.Android.providers.calendar/databases/calendar.db
./com.darshancomputing.BatteryIndicatorPro/databases/alarms.db
./com.darshancomputing.BatteryIndicatorPro/databases/logs.db
./com.google.Android.gsf/databases/googlesettings.db
./com.google.Android.gsf/databases/subscribedfeeds.db
./com.google.Android.gsf/databases/talk.db
./com.google.Android.gsf/databases/gservices.db
./com.google.Android.gsf/databases/gls.db
./com.cooliris.media/databases/picasa.db
./com.Android.providers.downloads/databases/downloads.db
./com.Android.providers.settings/databases/settings.db

手动删除掉这些数据库文件,重启机器后相关的应用就会使用默认值重新加载数据库,如设置应用的数据库:

/data/data/com.Android.providers.settings/databases/settings.db

删掉settings.db,重启即可删掉设置里的个人设置的数据。

 

打开android设备上的settings.db数据库

C:\Documents and Settings\Administrator>adb shell

# sqlite3 data/data/com.android.providers.settings/databases/settings.db

sqlite3 data/data/com.android.providers.settings/databases/settings.db

SQLite version 3.6.22

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite> .databases

.databases

seq  name             file

---  ---------------  ----------------------------------------------------------

0    main             //data/data/com.android.providers.settings/databases/setti

sqlite> .tables

.tables

android_metadata   bookmarks          system

bluetooth_devices  secure

sqlite> select * from system;

select * from system;

1|volume_music|11

2|volume_ring|5

3|volume_system|7

4|volume_voice|4

5|volume_alarm|6

6|volume_notification|5

7|volume_bluetooth_sco|7

8|mode_ringer|2

9|vibrate_on|4

10|mode_ringer_streams_affected|166

11|mute_streams_affected|46

12|dim_screen|1

13|stay_on_while_plugged_in|0

14|screen_off_timeout|60000

15|emergency_tone|0

16|call_auto_retry|0

17|dtmf_tone_type|0

18|hearing_aid|0

19|tty_mode|0

20|airplane_mode_on|0

21|airplane_mode_radios|cell,bluetooth,wifi

22|airplane_mode_toggleable_radios|wifi

23|auto_time|1

24|screen_brightness|102

25|screen_brightness_mode|0

26|window_animation_scale|1.0

27|transition_animation_scale|1.0

28|accelerometer_rotation|1

29|haptic_feedback_enabled|1

30|notification_light_pulse|1

31|set_install_location|0

32|default_install_location|0

33|power_sounds_enabled|1

34|low_battery_sound|/system/media/audio/ui/LowBattery.ogg

35|dock_sounds_enabled|0

36|desk_dock_sound|/system/media/audio/ui/Dock.ogg

37|desk_undock_sound|/system/media/audio/ui/Undock.ogg

38|car_dock_sound|/system/media/audio/ui/Dock.ogg

39|car_undock_sound|/system/media/audio/ui/Undock.ogg

40|lockscreen_sounds_enabled|0

41|lock_sound|/system/media/audio/ui/Lock.ogg

42|unlock_sound|/system/media/audio/ui/Unlock.ogg

43|vibrate_in_silent|1

44|volume_ring_last_audible|5

45|next_alarm_formatted|

46|ringtone|content://media/internal/audio/media/8

47|notification_sound|content://media/internal/audio/media/41

48|alarm_alert|content://media/internal/audio/media/56

//删除指定字段记录

sqlite> delete from system where _id=2;

delete from secure where _id=2;

sqlite>

 

  

备注:

此数据库由:frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java 创建,

其默认初始值位置:frameworks\base\packages\SettingsProvider\res\values\defaults.xml 

 

由于需要修改Setting默认设定的需要,需要分析下Setting的源码,以及数据存储与读取。

Android自带的应用程序存储在packages/apps目录下

主要目录和文件如下:

clip_image002

其中resouce是资源文件,src是源代码,tests中含有测试代码。而Android.mk和AndroidManifest.xml分别是编译以及应用程序全局数据。

源码的布局当然也是遵循Java的package管理方式。我们以了解Settings – Sound & Display – Orientation 为线索,了解整个Settings应用的工作原理。因为我目前开发的目标板没有gsenser,我的目标是把该项的默认为unchecked。

res/xml/setting.xml中指定Settings包含的选项,从中找到Sound and Display相关的一项

clip_image004

根据targetClass的定义,我们便可以从源码中找到对应的SoundAndDisplaySettings类。

clip_image007

Sound & Display选项中仍有很多子选项,Orientation只是Sound & Display选项中的一项。同样道理,在res/xml/sound_and_display_settings.xml中,可以找到Orientation选项的定义。

clip_image009

如何知道accelerometer就是Orientation呢?一方面,从字面意思猜个8、9不离10,另一方面,从packages/apps/Settings/res/values/strings.xml(如下图)也可以看出accelerometer就是对应着Orientation,(默认语言的字符串描述,如果选择了中文语言,那么则在packages/apps/Settings/res/values-zh-rCN/strings.xml找到中文的描述)

clip_image011

进到源码中,常量字符串KEY_ACCELEROMETER定义了该选项的唯一标识。

clip_image013

在OnCreate()初始化中,系统使用了findPreference找到了acclerometer在xml中的描述,把获取的Preference类型强制转换为CheckBoxPreference类。

clip_image015

当该Checkbox被点击后,来到响应按钮的代码,若checkbox为checked则写1否则写0

clip_image017

Setting.System.putInt做的工作,就是把这个选项修改的值写到数据库中去,PutString函数:

clip_image020

clip_image018

clip_image022

数据库存储于com.android.providers.settings/databases/settings.db 。ANDROID的数据库是采用SQLite存储的,把settings.db复制出来,然后使用sqlite管理工具打开,可以看到刚写进去的值:

clip_image024

accelerometer_rotation的值为0,表示orientation这个Checkbox为not checked.

至此,我们了解了,几乎所有的Settings默认值都会写在settings.db中,若要修改的默认选项值较多,可以使用sqlite数据库工具,手动修改settings.db中的值。已达到批量修改默认值的目的,系统在下次启动时,会自动加载这些写在Settings.db中的值。在批量生产前,只需要把修改后的settings.db 压制到data.img再烧录到系统中就好了。当然,也可以从源码入手,修改该默认值。

还需要了解的一个问题是:系统又是如何在开机设定这个我们设定的Orientation的状态呢?思路无非是从settings.db中读取数据库的值,然后设定相应的状态。

首先,要确定编译时平台的Policy,在build/target/product/core.mk中,有这样的描述:

clip_image026

编译选项中,PRODUCT_POLICY为android.policy_phone。那么系统启动就会采用phone这个Policy。启动读取数据库的值,相关的一个类是PhoneWindowManager(同理,mid对应着MidWindowManager)

从frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java找到这个类,

这里只关注Orientation这个Checkbox的相关的功能,虽然PhoneWindowManager.java两千多行代码,这里只看Update方法中相关的几行:

clip_image028

这几行就是从settings.db数据库中取得Orientation项的值,如果这个值默认值0不等(即值为1)的话,那么就updateOrientationListenerLp();

整个的分析路线是

clip_image029

抱歉!评论已关闭.