Android学习笔记-----"SQLite无法找到"的解决过程

场景:按照基本流程,自定义一个SQLiteHelper类继承自SQLiteOpenHelper,并且当点击按钮时创建一个数据库名为test.db。一切准备就绪,将真机接入PC并Run App,点击按钮创建数据库,为了判断是否真的创建成功,利用常规方法adb shell,cd /data/data/包名/databases,ls,最后一步ls给出提示信息“Operation not permitted”。


解决过程:

1. ls命令需要root用户才能使用,输入su切换命令,但是又出现新的提示“su: not found”,原因是system/xbin目录下没有su文件;

2. 由于真机并无Root权限,需要下载一键Root对真机进行Root提权,在安卓应用市场下载KingRoot后,提权成功。再次输入su,成功从$切换到#提示符,说明进入Root用户。

3. 在/data/data/包名/databases目录下,再次输入ls,列出test.db和test.db-journal两个文件。

4. 接下来打开sqlite数据库,输入 sqlite3 Test,又出现新的错误提示"sqlite3: not found",经百度,找到原因是在真机的system/xbin目录下,没有sqlite3文件,在Android Studion的DDMS中,切换到file explorer标签,展开system/xbin目录,发现只有4个文件,包括刚刚安装的su文件,但是没有sqlite3,需要从哪里导入一个sqlite3.

5. 在Android Studion中新增一个模拟器,并且在其中运行App,打开DDMS,展开system/xbin,发现sqlite3果然有,将该文件导出到E盘根目录,关闭APP。

6. 利用adb push E:\sqlite3 /system/xbin命令将刚刚导出的sqlite3推入到真机中,此时再次出现问题“adb: error: failed to copy 'E:\sqlite3' to '/system/xbin/sqlite3': remote Permission denied”,原因是system及其子目录只读不可写,所以需要修改目录权限。

7. 给system和xbin目录加入可写权限,输入:mount -o rw,remount yaffs2 /system,chmod 777 /system,chmod 777  /system/xbin,最后再次输入adb push E:\sqlite3 /system/xbin,提示传输成功!

8. 继续输入:sqlite3 /data/data/包名/databases/test.db,回车再次出现错误信息“sqlite3: can't execute: Permission denied”,可以看出同样是权限问题,进行提权:"chmod 4755 /system/xbin/sqlite3",成功。

9. 再次输入:sqlite3 /data/data/包名/databases/test.db,又弹出新错误提示:“/system/xbin/sqlite3: not executable: magic 7F45”,这个错误是因为sqlite3文件是从模拟器5.0中导出的,它与真机4.1.2版本不兼容,找到一个兼容4.0系统的sqlite3重新push,提权之后,成功进入sqlite。

10. 查看表信息,输入.table,出现错误信息:Error: unable to open database "test.db": unable to open database file,这是由于test.db和test.db-journal也要有读写权限,.quit退出sqlite,给数据库目录和数据库提权:chomd 777 /data/data/包名/databases,chomd 777 /data/data/包名/databases/test.db,chomd 777 /data/data/包名/databases/test.db-journal,再次输入:sqlite3 /data/data/包名/databases/test.db,成功登录sqlite,输入.table,成功输出表名。


总结:

1. 一定要有root权限,安装一键ROOT工具进行提权;

2.设置各个目录和文件的读写权限:/system,/system/xbin,/system/xbin/sqlite3,/data/data/包名/databases,/data/data/包名/databases/两个数据库文件;

3.sqlite3的版本要和操作系统的兼容;

4.打开数据库时,数据库路径必须是绝对

你可能感兴趣的:(Android)