『壹』 android源碼問題,撥打完電話會更新通話記錄列表,通過一個監聽來實現查詢CallLogProvider,有了解的嗎
能否將詳細log貼上
這個是2.3 系統還是 4.0 的 還是?
05-09 18:18:36.519: E/DatabaseUtils(393): at android.database.sqlite.SQLiteQueryBuilder.computeProjection(SQLiteQueryBuilder.java:588)
05-09 18:18:36.519: E/DatabaseUtils(393): at android.database.sqlite.SQLiteQueryBuilder.buildQuery(SQLiteQueryBuilder.java:403)
後面的log也多貼一些。
『貳』 Android開發怎麼查看和管理sqlite資料庫
在Android中可以使用Eclipse插件DDMS來查看,也可以使用Android工具包中的adb工具來查看。android項目中的sqlite資料庫位於/data/data/項目包/databases中。
使用DDMS導出sqlite資料庫。
1、首先打開android項目的調試模式,然後找到顯示DDMS:
選擇DDMS
2、切換到DDMS,顯示FileExplorer窗口,找到/data/data/
然後找到程序包的文件夾,打開databases,就能看到sqlite資料庫文件了。選擇將其導出。
這樣就把sqlite資料庫文件以文件的方式導出來了,然後使用sqlite界面管理工具如sqliteadministrator、sqliteman或者firefox插件sqlitemanager等打開就可以了。
使用adb工具訪問sqlite資料庫
AndroidDebugBridge(ADB)是Android的一個通用調試工具,它可以更新設備或模擬器中的代碼,可以管理預定埠,可以在設備上運行shell命令,我們知道android是基於linux內核,它的內部文件結構也是採用linux文件組織方式,因此訪問它的文件結構需要使用shell。這次我們就會用shell來訪問android應用中的sqlite資料庫文件。
1、運行cmd,切換到android-sdk目錄,運行adb.exe,加上參數shell,出現#號就代表進入了shell命令模式,注意adb要在Android模擬器運行時才能進入shell:
2、shell命令記住兩個基本命令ls和cd,類似windows命令提示行中的dir和cd,代表列出當前目錄下文件列表和進入到指定目錄。了解閉手昌這兩個命令之後,就可以找到data/data/項目包名/databases:
找到資料庫文件:
接下來就是使用sqlite管理工具來進行轎扒操作了。鍵入sqlite3資料庫名就進入了sqlite管理模式了。
在android的sdk中自帶了sqlite3.exe,這是sqlite的官方管理工具,它是一個命令行工具。為了使用方便,將其路徑注冊到系統環境變數path中,即將;%Android_Home%加在Path中,這樣只樣運行sqlite3,就能直接打開sqlite管理工具了。
sqlite管理資料庫篇
sqlite命令行工具默認是以;結束語句的。所以如果只是一行語句,要在末尾加;,或者在下一行中鍵入;,這樣sqlite命令才會被執行。
sqlite常薯李用命令:
.tables--查看資料庫的表列表
.exit--退出sqlite命令行
『叄』 如何使用SQLite,Android上SQLite的最佳實踐
SQLite3是目前最新的SQLite版本。可以從網站上下載SQLite3的源代碼(本書使用的版本是sqlite-3.6.12.tar.gz)。
解壓縮後進入sqlite-3.6.12的根目錄,首先命令「./configure」生成Makefile文件,接著運行命令「make」對源代碼進行編譯,最後運行命令「make install」安裝SQLite3。安裝完畢後,可以運行命令sqlite3查看SQLite3是否能正常運行,如下所示:
[root@localhost ~]# sqlite3
SQLite version 3.6.12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
可以看到,SQLite3啟動後會停留在提示符sqlite>處,等待用戶輸入SQL語句。
在使用SQLite3前需要先了解下SQLite3支持的數據類型。SQLite3支持的基本數據類型主要有以下幾類:
NULL
NUMERIC
INTEGER
REAL
TEXT
SQLite3會自動把其他數據類型轉換成以上5類基本數據類型,轉換規則如下所示:
char、clob、test、varchar—> TEXT
integer—>INTEGER
real、double、float—> REAL
blob—>NULL
其餘數據類型都轉變成NUMERIC
下面通過一個實例來演示SQLite3的使用方法。
新建一個資料庫
新建資料庫test.db(使用.db後綴是為了標識資料庫文件)。在test.db中新建一個表test_table,該表具有name,、sex、age三列。SQLite3的具體操作如下所示:
[root@localhost home]# sqlite3 test.db
SQLite version 3.6.12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table test_table(name, sex, age);
如果資料庫test.db已經存在,則命令「sqlite3 test.db」會在當前目錄下打開test.db。如果資料庫test.db不存在,則命令「sqlite3 test.db」會在當前目錄下新建資料庫test.db。為了提高效率,SQLite3並不會馬上創建test.db,而是等到第一個表創建完成後才會在物理上創建資料庫。
由於SQLite3能根據插入數據的實際類型動態改變列的類型,所以在create語句中並不要求給出列的類型。
創建索引
為了加快表的查詢速度,往往在主鍵上添加索引。如下所示的是在name列上添加索引的過程。
sqlite> create index test_index on test_table(name);
操作數據
如下所示的是在test_table中進行數據的插入、更新、刪除操作:
sqlite> insert into test_table values ('xiaoming', 'male', 20);
sqlite> insert into test_table values ('xiaohong', 'female', 18);
sqlite> select * from test_table;
xiaoming|male|20
xiaohong|female|18
sqlite> update test_table set age=19 where name = 'xiaohong';
sqlite> select * from test_table;
xiaoming|male|20
xiaohong|female|19
sqlite> delete from test_table where name = 'xiaoming';
sqlite> select * from test_table;
xiaohong|female|19
批量操作資料庫
如下所示的是在test_table中連續插入兩條記錄:
sqlite> begin;
sqlite> insert into test_table values ('xiaoxue', 'female', 18);
sqlite> insert into test_table values ('xiaoliu', 'male', 20);
sqlite> commit;
sqlite> select * from test_table;
xiaohong|female|19
xiaoxue|male|18
xiaoliu|male|20
運行命令commit後,才會把插入的數據寫入資料庫中。
資料庫的導入導出
如下所示的是把test.db導出到sql文件中:
[root@localhost home]# sqlite3 test.db ".mp" > test.sql;
test.sql文件的內容如下所示:
BEGIN TRANSACTION;
CREATE TABLE test_table(name, sex, age);
INSERT INTO "test_table" VALUES('xiaohong','female',19);
CREATE INDEX test_index on test_table(name);
COMMIT;
如下所示的是導入test.sql文件(導入前刪除原有的test.db):
[root@localhost home]# sqlite3 test.db < test.sql;
通過對test.sql文件的導入導出,可以實現資料庫文件的備份。
11.2.2 SQLite3的C介面
以上介紹的是SQLite3資料庫的命令操作方式。在實際使用中,一般都是應用程序需要對資料庫進行訪問。為此,SQLite3提供了各種編程語言的使用介面(本書介紹C語言介面)。SQLite3具有幾十個C介面,下面介紹一些常用的C介面。
sqlite_open
作用:打開SQLite3資料庫
原型:int sqlite3_open(const char *dbname, sqlite3 **db)
參數:
dbname:資料庫的名稱;
db:資料庫的句柄;
sqlite_colse
作用:關閉SQLite3資料庫
原型:int sqlite_close(sqlite3 *db)
例如:
test.c:
#include <stdio.h>
#include <sqlite3.h>
static sqlite3 *db=NULL;
int main()
{
int rc;
rc= sqlite3_open("test.db", &db);
if(rc)
{
printf("can't open database!\n");
}
else
{
printf("open database success!\n");
}
sqlite3_close(db);
return 0;
}
運行命令「gcc –o test test.c –lsqlite3」進行編譯,運行test的結果如下所示:
[root@localhost home]# open database success!
sqlite_exec
作用:執行SQL語句
原型:int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg)
參數:
db:資料庫;
sql:SQL語句;
callback:回滾;
errmsg:錯誤信息
例如:
test.c:
#include <stdio.h>
#include <sqlite3.h>
static sqlite3 *db=NULL;
static char *errmsg=NULL;
int main()
{
int rc;
rc = sqlite3_open("test.db", &db);
rc = sqlite3_exec(db,"insert into test_table values('bao', 'male', 24)", 0, 0, &errmsg);
if(rc)
{
printf("exec fail!\n");
}
else
{
printf("exec success!\n");
}
sqlite3_close(db);
return 0;
}
編譯完成後,運行test的結果如下所示:
[root@localhost home]# ./test
exec success!
[root@localhost home]# sqlite3 test.db
SQLite version 3.6.11
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from test_table;
bao|male|24
sqlite3_get_table
作用:執行SQL查詢
原型:int sqlite3_get_table(sqlite3 *db, const char *zSql, char ***pazResult, int *pnRow, int *pnColumn, char **pzErrmsg)
參數:
db:資料庫;
zSql:SQL語句;
pazResult:查詢結果集;
pnRow:結果集的行數;
pnColumn:結果集的列數;
errmsg:錯誤信息;
sqlite3_free_table
作用:注銷結果集
原型:void sqlite3_free_table(char **result)
參數:
result:結果集;
例如:
test.c:
#include <stdio.h>
#include <sqlite3.h>
static sqlite3 *db=NULL;
static char **Result=NULL;
static char *errmsg=NULL;
int main()
{
int rc, i, j;
int nrow;
int ncolumn;
rc= sqlite3_open("test.db", &db);
rc= sqlite3_get_table(db, "select * from test_table", &Result, &nrow, &ncolumn,
&errmsg);
if(rc)
{
printf("query fail!\n");
}
else
{
printf("query success!\n");
for(i = 1; i <= nrow; i++)
{
for(j = 0; j < ncolumn; j++)
{
printf("%s | ", Result[i * ncolumn + j]);
}
printf("\n");
}
}
sqlite3_free_table(Result);
sqlite3_close(db);
return 0;
}
編譯完成後,運行test的結果如下所示:
[root@localhost home]# ./test
query success!
xiaohong | female | 19 |
xiaoxue | female | 18 |
xiaoliu | male | 20 |
bao | male | 24 |
sqlite3_prepare
作用:把SQL語句編譯成位元組碼,由後面的執行函數去執行
原型:int sqlite3_prepare(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **stmt, const char **pTail)
參數:
db:資料庫;
zSql:SQL語句;
nByte:SQL語句的最大位元組數;
stmt:Statement句柄;
pTail:SQL語句無用部分的指針;
sqlite3_step
作用:步步執行SQL語句位元組碼
原型:int sqlite3_step (sqlite3_stmt *)
例如:
test.c:
#include <stdio.h>
#include <sqlite3.h>
static sqlite3 *db=NULL;
static sqlite3_stmt *stmt=NULL;
int main()
{
int rc, i, j;
int ncolumn;
rc= sqlite3_open("test.db", &db);
rc=sqlite3_prepare(db,"select * from test_table",-1,&stmt,0);
if(rc)
{
printf("query fail!\n");
}
else
{
printf("query success!\n");
rc=sqlite3_step(stmt);
ncolumn=sqlite3_column_count(stmt);
while(rc==SQLITE_ROW)
{
for(i=0; i<2; i++)
{
printf("%s | ", sqlite3_column_text(stmt,i));
}
printf("\n");
rc=sqlite3_step(stmt);
}
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
編譯完成後,運行test的結果如下所示:
[root@localhost home]# ./test
query success!
xiaohong | female | 19 |
xiaoxue | female | 18 |
xiaoliu | male | 20 |
bao | male | 24 |
在程序中訪問SQLite3資料庫時,要注意C API的介面定義和數據類型是否正確,否則會得到錯誤的訪問結果。
『肆』 如何監聽一個程序
監聽一個程序的資料庫操作可以通過多種方式進行,具體取決於你所處的環境和你具體想要監聽什麼。如果你想監聽一個程序對SQLite資料庫的操作,你可以使用以下幾種方法:
1. 日誌記錄(Logging):你可以開啟SQLite的日誌功能來記錄所有發生的資料庫操作。然而,SQLite本皮指身不直接支持詳細的日誌記錄,所以你可能需要使用一些SQLite的封裝庫,如Python的sqlite3模塊,或者其他語言的類似庫,來捕捉並記錄操作。
2. 資料庫觸發器(Database Triggers):在SQLite資料庫中,你可以使用觸發器來監聽資料庫的某燃判配些操作。觸發器是一種特殊類型的存儲過程,它會在資料庫上的特定事件(如INSERT、UPDATE或DELETE)發生時自動執行。
3. 代理或中間件(Proxies or Middleware):你可以在應用程序和資料庫之間插入一層代理或中間件,所有的資料庫會通過這個中間層。這樣,你就可以在這個中間層捕獲、記錄甚至修改所有的資料庫請求和響應。這種方法需要一些編程技巧和對網路編程的理解。
4. SQLite監控工具:有一些專門用於監控SQLite資料庫的工具,如DB Browser for SQLite、SQLite Inspector等。這些工具可以讓你查看資料庫的實時狀沖伏態,包括正在執行的查詢、改變的表格等。
5. 系統調用跟蹤(System Call Tracing):如果你有足夠的系統編程知識,你可以使用如strace(Linux)、DTrace(BSD)或ProcMon(Windows)等工具來跟蹤程序對SQLite資料庫文件的系統調用。這樣可以讓你看到程序在什麼時候讀取或寫入資料庫文件,以及讀寫的具體內容。這種方法相對復雜,需要對操作系統和系統編程有深入的理解。
『伍』 有哪些比較好的AndroidSQLite開源工具類(android中的sqlite資料庫具有哪些特點)
是一個免費的開源的、簡易的、遵循Apache2開源協議發布的Android開發框架,其開發宗旨是簡單、快速的進行Android應用程序的開發,包含Androidmvc、簡易sqliteorm、ioc模塊、封裝Androidhttpclitent的http模塊,具有快速構建文件緩存功能,無需考慮緩存文件的格式,都可以非常輕松的實現緩存,它還基於文件緩存模塊實現了圖片緩存功能,在android中載入的圖片的時候,對oom的問題,和對載入圖片錯位的問題都輕易解決。他還包括了一個手機開發中經常應用的實用工具類,如日誌管理,配置文件管理,android下載器模塊,網路切換檢測等等工具。
目前主要有以下模塊:
MVC模塊:實現視圖與模型的分離。
ioc模塊:android中的ioc模塊,完全註解方式就可以進行UI綁定、res中的資源的讀取、以及對象的初始化。
資料庫模塊:android中的orm框架,使用了線程池對sqlite進行操作。
http模塊:通過httpclient進行封裝http數據請求,支持非同步及同步方式載入。
緩存模塊:通過簡單的配置及設計可以很好的實現緩存,對緩存可以隨意的配置
圖片緩存模塊:imageview載入圖片的時候無需考慮圖片載入過程中出現的oom和android容器快速滑動時候出現的圖片錯位等現象。
配迅擾頌置器模塊:可以對簡易的實現配對配置的操作,目前配置文件可以支持Preference、Properties對配置進行存取。
日誌列印模塊:可以較快的輕易的是實現日誌列印,支持日誌列印的擴展,目前支持對sdcard寫入本地列印、以及控制台列印
下載器模塊:可以簡單的實現多線程下載、後台下載、斷點續傳、對下載進李肆行控制、如開始、暫停、刪除等畝鄭等。
網路狀態檢測模塊:當網路狀態改變時,對網路狀態進行檢測。
『陸』 如何使用SQLite,Android上SQLite的最佳實踐
按照我的認識,SQLite工作的方式,基本上不可能會破壞你的資料庫,除非代碼里有bug或者有硬體問題。
因伍圓模此,腔緩我推薦這樣使用:創建一個SQLiteOpenHelper靜腔掘態對象。什麼時候去close它呢?不需要。當app關閉,它會自動釋放文件引用。
『柒』 如何使用SQLite,Android上SQLite的最佳實踐
前些時候看到興趣小組里有人問「Android上SQLite的最佳實踐」是什麼,好奇地搜了一下,確實沒有一個好一點的指導文檔,平時的使用也只是簡單的拷貝code,並沒有深入的研究過。以下是我看到的Kevin關於其使用的心得,原文的大體的意思是:
Android例子涵蓋了一些Sqlite的基本用法,但它們並沒有深入地給出合理的使用方法,更重要的是,不合理的使用方法。大多數例子和文檔只是涉及最基本的資料庫查詢,或者教你如何創建一個ContentProvider。從來不提及的地方像:
· 什麼地方創建和保存SQLiteOpenHelper實例?
· 可以有多少個實例?
· 多線程同時訪問資料庫有沒有什麼要擔心的?
基本的內容是,你可以歷宏嘩任意次數地連接Sqlite資料庫,而且Android系統也支持你這樣做。Sqlite擁有文件級別的鎖,用來同步訪問和防止錯誤。如果你只知道這些,那麼,將會給你帶來很大的痛苦。開源的一個好處是,你可以深入代碼一探究竟。從代碼和一些測試中,我了解到以下事實:
· Sqlite擁有文件級別的鎖。許多線程可以同時讀,但只有一個可以寫。鎖阻止多個同時寫入。
· Android在SQLiteDatabase中實現了一些java鎖來確保動作是同步進行。
· 如果你用多個線程瘋狂地訪問資料庫,你的資料庫不會(或不應該)崩潰。
沒提到的是,如果你通過多個不同的真實連接同時寫資料庫,其中的某個會失敗,它不會等到前一個完成後繼續寫入。簡單地,不會寫入你的改變,更糟糕的是,你也得不到一個異常,只是在LogCat中輸出一些message,僅此而已。
SQLiteOpenHelper類做了一些有趣的事。盡管它有方法可以獲得一個只讀的連接和可讀寫的連接,但實質上它們是同一個連接。假設沒有文件寫錯誤的話,只讀的連接實質上就是一個可讀寫的連接。有趣吧。因此,如果你的app中使用一個helper的話,即便從多線程中使用,你也從未使用多個連接。
同樣,一個helper中只有一個SQLiteDatabase的實例,這個實例中實現了一些java鎖。因此,當你絕喊正在執行資料庫的操作時,其它db的操作都將鎖定。即便是你使用多個線程來做這些事以便優化資料庫的性能,壞消息,沒有什麼用。
按照我的認識,SQLite工作的方式,基本上不可能會破壞你的資料庫,除非代碼里有bug或者有硬體問題。
因此,我推薦這樣使用:創建一個SQLiteOpenHelper靜態對象。什麼時候去close它呢?不需要。當app關閉,它會自動釋放文件引用。
但是,會不會有「close() was never explicitly called on database」異常呢?
如果你注意的話,當連接掛在那裡的時候,你沒有得到那個異常。你只是在連接已經建立,而你又嘗試打開另一個時才會有異常。因此,你只需要打開一次連接。
像這樣來使用:
public class DatabaseHelper extends OrmLiteSqliteOpenHelper
{
private static DatabaseHelper instance;public static synchronized DatabaseHelper getHelper(Context context)
{
if (instance == null)
instance = new DatabaseHelper(context);
肢行
return instance;
}
//Other stuff...
}
『捌』 android怎麼做到斷電瞬間將數據存到資料庫中,我的adroid機器是沒電池的,所以寫了個監聽拔電廣播但不行
斷電瞬間配早就1s,Android用的數行賣頌據庫是SQLite,1s之檔鄭內你把手機所有數據存到你創建的資料庫,你在和我開玩笑嘛?每個APP都有資料庫有數據表,而且是加密的,你第一步讀取加密資料庫都不行,還怎麼復制出來