有個測試機里沒有自帶sqlite,記錄了一下安裝過程。以防遺忘
(一)第一步:root
使用百度一鍵root 等app,一鍵就可root,步驟略
(二)
1、執行
adb shell su 獲得root權限 ls 查看當前目錄
cd data/data ls
選com.tencent.cm為例
cd com.tencent.cm/database ls
看到里邊有一些 .db數據庫文件
這時候,執行
sqlite3 tes_db.db
如果你的設備中有sqlite3,這句應該會執行成功,接下來就可以 執行select 語句了,
----------------------------------------------------------------下邊就不用看了--------------------------------------------------------------
本文主要說明 一些小米和其他手機中沒有sqlite3的情況,和我一樣,執行會發現
sqlite3:not found
附 Android的每個版本對應的sqlite3 版本:
SQLite 3.8.4.3: 21-5.0-Lollipop 20-Android L Developer Preview
SQLite 3.7.11: 19-4.4-KitKat 18-4.3-Jelly Bean 17-4.2-Jelly Bean 16-4.1-Jelly Bean
SQLite 3.7.4: 15-4.0.3-Ice Cream Sandwich 14-4.0-Ice Cream Sandwich 13-3.2-Honeycomb 12-3.1-Honeycomb 11-3.0-Honeycomb
SQLite 3.6.22: 10-2.3.3-Gingerbread 9-2.3.1-Gingerbread 8-2.2-Froyo
SQLite 3.5.9: 7-2.1-Eclair 4-1.6-Donut 3-1.5-Cupcake
Note: Android SDK level links show where the android.database.sqlite package has changed. Where there is no link (e.g. SDK level 17), indicates no changes to that package.
Note: Here are some anomalies (list by no means exhaustive): SQLite 3.7.13 (instead of 3.7.11): LG Optimus L70 MS323 LGMS323|KOT49I.MS32310b (19-4.4-KitKat) LG Optimus G E975 LG-E975|JZO54K (16-4.1-Jelly Bean) LG G2 D802 LG-D802|JDQ39B (17-4.2-Jelly Bean)
SQLite 3.7.6.3 (instead of 3.6.22): LG Optimus Sol E730/myTouch E739/myTouch Q C800 (10-2.3.3-Gingerbread, GRJ22) LG Optimus Vu F100S/F100L (10-2.3.3-Gingerbread, RK39F) LG Optimus LTE TAG F120K/F120L (10-2.3.3-Gingerbread, GRK39F) LG Optimus LTE L-01D (10-2.3.3-Gingerbread, GRJ90) LG Optimus Net P690b (10-2.3.3-Gingerbread, GINGERBREAD) LG Prada KU5400 (10-2.3.3-Gingerbread, GWK74) LG Prada P940 (10-2.3.3-Gingerbread, GWK74) LG LU6200/SU640 (10-2.3.3-Gingerbread, GRJ90)s
SQLite 3.7.5 (instead of 3.7.4): Samsung Galaxy Note (15-GT-N7000|IML74K.ZSLPF) Samsung Galaxy SII (15-SC-02C|IML74K.OMMP4 and GT-I9100|IML74K.DXLP7) Samsung Galaxy S Duos (15-GT-S7562|IMM76I.S7562XXBMD6) Samsung Galaxy Tab 7.7 (15-GT-P6810|IMM76D.ZSLP8)
SQLite 3.7.0.1 (instead of 3.6.22): LG Esteem MS910 (10-2.3.3-Gingerbread, GSE-_v.05) AndroTab (8-2.2-Froyo, 1.0.7100.0385) GPLUS MUSN M500 (8-2.2-Froyo, FRG83G)
SQLite 3.6.23.1 (instead of 3.5.9): Motorola Backflip MB300 (7-2.1-Eclair, ERD79) Garmin-Asus nüvifone A10/A50/Garminfone (7-2.1-Eclair, ERE27) Note: adb command to get SQLite version only works on emulators and on devices with sqlite3 available: http://stackoverflow.com/a/3645800/444761
比較簡單的獲取對應版本的Sqlite的方法:
1、查看你手機的Andorid的版本,比如我的是 4.3 2、在eclipse中打開對應版本(很重要,否則會提示cannot locate 'sqlite3_enable_load_extensions')的模擬器(創建 如果沒有)並且啟動 3、在DDMS窗口的File Explorer面板下展開system > xbin 看到了sqlite3 了么?ok。點擊右上角的軟盤圖標(pull a file from the device) 將其保存到其他位置 4、然后連接你的手機,打開控制台,輸入adb shell。(什么?提示adb命令無效?那去配置環境變量吧) 5、然后查看一下提示符 如果是 # 那就不用管了,如果是 $ ,那么說明你需要獲得root權限進行下面的操作 6、保持手機屏幕沒有鎖屏最好是常亮模式 在提示符下敲入 su 或者 su root,如果手機彈框提示是否允許獲得root權限請選擇 是。點擊后發現 $ 變成 # 了。OK 可以進行下面的操作了 7、將先前保存其他位置的sqlite3 在DDMS面板中通過右上角手機圖標(push a file onto the device) 將文件push到sdcard中,准確的是在/mnt/sdcard 8、然后在命令行敲入 cat /mnt/sdcard/sqlite3 > /system/xbin/sqlite3 復制文件(為什么不用mv?我也試過,不過報failed on '/sdcard/test.mp3' - Cross-device link 錯誤) 9、ok,檢查手機/system/xbin下多了一個sqlite3文件,不過還不能執行。 10、繼續敲入 chmod 4755 /system/xbin/sqlite3 好的 大功告成。你可以試試敲入sqlite3試試了。可以看到可以正常使用了。
-------------------------------------------------------------如果你成功了,不用看下邊-------------------------------------------------------------------------
首先,機器上沒有對應android 4.3的avd,所以參考http://www.cnblogs.com/localhost/archive/2012/04/09/2439558.html的方法
下載了sqlite3文件包,地址為http://files.cnblogs.com/localhost/sqlite3_not_found.rar(事實證明他這個包的版本,我不能用,他這個版本太老了)
下這個:http://pan.baidu.com/share/link?shareid=534077&uk=839950715
報了異常,因為直接push進 /system/xbin目錄中了,沒權限
建一個臨時文件夾
push進這個臨時文件夾中
再將sqlite3從
/mnt/sdcard/tmp
拷貝到
/system/xbin 目錄中,不會報錯
cp /mnt/sdcard/tmp/sqlite3 /system/xbin/sqlite3
注意:這一步可能報兩種錯,
第一種: cp not found,將命令換成cat /mnt/sdcard/tmp/sqlite3 > /system/xbin/sqlite3,
第二種:permission denied,說明/system是只讀的,此時需要重新mount,改為可讀寫,然后繼續拷貝
為什么除了sqlite3,還要push進去libncurse.so,因為缺乏依賴庫,報了以下異常
我的出現了第二種權限錯誤 ,執行mount操作
mount -o remount,rw /system
mount命令的解釋在 http://blog.csdn.net/progbelief/article/details/6032518
重點解釋這條語句的作用 mount -o remount,rw -t yaffs2 /dev/block/mtdblock6 /system 簡單來說就是將塊設備“/dev/block/mtdblock6” 掛載到/system目錄上,掛載格式為yaffs2,這里主要的問題是“/dev/block/mtdblock6”是個什么東東。 mtdblock就是手機 的flash存儲設備,但是這個分塊號則依機型的不同而有所變化,比如:Droid 的/system是掛載在/dev/block/mtdblock4上的,歐版的milestone 在/dev/block/mtdblock7上,港版的在/dev/block/mtdblock6上,HTC 系列的機器 則好像是在/dev/block/mtdblock3上。而現在有的教程 上寫的命令不盡相同,也有這樣寫的 mount -o remount,rw /dev/block/mtdblock3 /system 這多半上從HTC的論壇 上抄來的吧。 但是有些人可能會說,我就是用這條命令成功了!(好吧,其實我也是的……汗,真是好險 ),甚至用任何分塊號mtdblock3、mtdblock4、mtdblock11等等都能正常運行!那么這種錯誤命令為什么能成功呢?其實我們的命令參數“-o remount”其實自動 忽略了/dev/block/mtdblock? 這一段參數,只是簡單的把/system重新掛載了一下而已。這條命令的偷懶不知道救回了多少人的愛機啊! 好吧,說到這里大家應該明白了吧,雖然這條命令即使錯誤也可以成功,但你畢竟試圖將一個錯誤的塊掛載到/system上,悄有不慎肯定變磚。 所以強烈建議大家在執行此命令時使用 cat /proc/mtd 來檢查下自己的JJ具體參數,再套用命令, 或者強烈建議新手使用 mount -o remount,rw /system 這樣的簡化命令來代替上述命令使用!
有了上邊的解釋, 獲取你的設備mount信息,執行
mount
從屏幕列出來的mount數據中找到/system的mount信息,空格隔開的,第一列表示設備名,第二列表示目錄,第三列表示文件系統,第四列表示權限。網上其他教程在這一步都直接列出了他們的命令,由於設備名和文件系統不一樣,所以執行不成功
mount命令為:mount -o remount,rw -t 第三列信息 第一列信息 /system
如下圖,注意看圈紅的地方:
mount成功后,再執行上面說的文件copy的步驟,然后就能copy到 /system/xbin目錄下了
需要改下文件的權限,命令:
chmod 4755 /system/xbin/sqlite3
最后運行下,sqlite3,發現成功了吧
---------------------------------------------------------------你又成功了,我又沒有----------------------------------------------------------
執行了mount,結果如下(沒有system啊,但是上邊的 mount -o remount,rw /system 執行成功了,所以也無所謂了 ):
這時候執行sqlite3命令,出現了Illegal instruction錯誤
這大概說明,我的sqlite3版本不對,下了個比較新的: http://pan.baidu.com/share/link?shareid=534077&uk=839950715
拷進去,改權限,執行
成功
在sqlite的...> 狀態退不出來的時候,一般是進入SQL數據語言模式了,此時輸入個;(分號) 就可以退回到sqlite>狀態
.quit 退出 sqlite .help 查看幫助
.schema 抓出數據庫中所有的表
.tables 抓出數據庫中所有的表和索引(都可以使用LIKE來匹配)
附:
sqlite的官網
http://www.sqlite.org/lang.html