androidsqlite升級
1. 怎樣使用sqlite expert管理android手機sqlite資料庫
在網上找了大把大把的資料、還是沒能怎麼弄清楚關於SQLite升級。固把一些網上找到的資料跟自己摸索出來的東西一起發出來。望有厲害的前輩能夠指點一二。 先上網上一些高手的資料:blog/yaya_soft/article/details/17089353 、 /topic/1127838。 其中我所在的情況跟第三位前輩所遇到的情況一樣, 先說Android SQLite吧, Android系統本身自帶了一個建立SQLite的工具SQLiteOpenHelper、我們只要繼承它,裡面有幾個重寫的方法。 為了方便快捷、我只列出了onCreate方法跟onUpgrade方法。 onCreate方法是我們第一次創建資料庫的時候會調用,onUpgrade()是我們資料庫版本號不一樣的時候會調用。網上很多資料都說如果要進行資料庫升級,那就直接在onUpgrade裡面寫你所需要的進行的操作。比如: 至於裡面代碼具體的作用可以參照上面第一 第二個鏈接,裡面有詳細解釋。 本人的情況是:本人使用外帶的可視化工具直接把資料庫跟表都已經建立好了,直接復制在raw目錄下面。就沒有通過系統自帶的方法來建立資料庫跟表。於是網上找資料一直不明白他們所謂的 在onUpgrade裡面進行升級。 因為本人代碼壓根就沒onUpgrade方法可以使用。 完了在網上找到各種資料、最終明白:無論你是用系統自帶的SQLiteOpenHelper工具建立資料庫跟表、還是使用外帶工具。如果你要進行資料庫升級。你所需要的操作都是一樣的。只是系統自帶的裡面有onUpgrade()方法直接調用。而用外帶工具的話你肯定也有一個自己寫的SQLite操作類、只是使用自己寫的操作類的話、onUpgrade()方法也是我們自己寫。 反正裡面要進行的操作都是一樣的。 現在就看看如何進行資料庫升級。 關於這塊代碼、如果你使用自己寫的SQLite操作類,那你一看就明白。我們只需要得到db對象。就可以使用 db.execSQL("ALTER TABLE Subscription ADD COLUMN Activation BLOB"); 這個和SQLiteOpenHelper裡面onUpgrade()方法裡面的操作是一樣的;同樣是升級資料庫的操作。 接下來就說說怎麼判斷資料庫需要升級、這個就是涉及到版本匹配了、 再看這塊代碼、我們只要拿到db對象、就可以拿到db對應的版本、同時也可以更新db 的版本。完了我們可以參照上面鏈接中第三位前輩的方法、把我們最新的資料庫版本定義在versionCode在AndroidManifest.xml文件中。 這樣你最新資料庫版本跟以前資料庫版本都有了 、就可以判斷更新不更新。這里解釋下關於外帶資料庫的一些事情: 外帶數據即我們通過sqlite expert professional可視化 工具建立一個sqlite.db文件、同時把文件放在raw目錄下、我們每次進行資料庫操作的時候就會先把raw目錄下的sqlite.db復制到手機裡面的路徑下(如果手機路徑裡面存在sqlite.db就不復制)、完了以後每次取資料庫都是從手機路徑裡面取的。如果我們raw目錄下的sqlite.db進行了更新(我們自己把數據表改下、直接替換 ).同時我們的apk版本進行升級更新的時候覆蓋安裝apk。我們手機目錄下的sqlite.db是不會更新的,還是舊版本。 但是我們raw目錄下的sqlite.db是新版本。這個時候也不會再復制到手機。 這就需要我們把手機目錄下的sqlite.db替換成raw目錄下的。 寫到這里我又想起一個事情:以前有位同事問為什麼要把raw目錄下的sqlite.db復制到手機、然後又操作手機路徑下的sqlite.db 這不是多此一舉嗎。他說可以把sqlite.db放在assets目錄下、不復制到手機路徑。直接就是操作assets目錄下的sqlite.db,這樣每次資料庫更新就直接替換assets目錄下的sqlite.db。 我不知道放在assets目錄下的好處、同時也不知道放在raw 然後復制到手機路徑的好處。 這些我都不知道(望高人指點), 我只知道反正就是不能直接替換salite.db , 直接替換的話就是把舊版本的sqlite.db刪除、再安裝新版本的sqlite.db。 如果這樣操作的話好像以前的數據都會丟失、就好像卸載重裝一樣。 無論何種方式我們要想保留數據都要進行數據的轉移。關於數據轉移前面給的鏈接中有。這里就不多討論了。 發這篇文章只是自己搞這塊的時候,一直被網上說的在onUpgrade()方法中直接更新搞糊塗了。 在這里記下來、免得下次不記得。
2. android sqlite3 獲得更新行數
執行insert update delete 都會返回一個整數值,就是更新(受影響)的行數
3. 如何使用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的介面定義和數據類型是否正確,否則會得到錯誤的訪問結果。
4. android sqlite資料庫的更新
一、使用嵌入式關系型SQLite資料庫存儲數據
在Android平台上,集成了一個嵌入式關系型資料庫——SQLite,SQLite3支持NULL、INTEGER、REAL(浮點數字)、 TEXT(字元串文本)和BLOB(二進制對象)數據類型,雖然它支持的類型只有五種,但實際上sqlite3也接受varchar(n)、 char(n)、decimal(p,s) 等數據類型,只不過在運算或保存時會轉成對應的五種數據類型。 SQLite最大的特點是你可以把各種類型的數據保存到任何欄位中,而不用關心欄位聲明的數據類型是什麼。例如:可以在Integer類型的欄位中存放字元串,或者在布爾型欄位中存放浮點數,或者在字元型欄位中存放日期型值。 但有一種情況例外:定義為INTEGER PRIMARY KEY的欄位只能存儲64位整數, 當向這種欄位保存除整數以外的數據時,將會產生錯誤。 另外,在編寫CREATE TABLE 語句時,你可以省略跟在欄位名稱後面的數據類型信息,如下面語句你可以省略name欄位的類型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQLite可以解析大部分標准SQL語句,如:
復制代碼 代碼如下:
查詢語句:select * from 表名 where 條件子句 group by 分組字句 having ... order by 排序子句
如: select * from person
select * from person order by id desc
select name from person group by name having count(*)>1
分頁SQL與mysql類似,下面SQL語句獲取5條記錄,跳過前面3條記錄
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入語句:insert into 表名(欄位列表) values(值列表)。如: insert into person(name, age) values(『傳智',3)
更新語句:update 表名 set 欄位名=值 where 條件子句。如:update person set name=『傳智『 where id=10
刪除語句:delete from 表名 where 條件子句。如:delete from person where id=10
二、使用SQLiteOpenHelper對資料庫進行版本管理
我們在編寫資料庫應用軟體時,需要考慮這樣的問題:因為我們開發的軟體可能會安裝在很多用戶的手機上,如果應用使用到了SQLite資料庫,我們必須在用戶初次使用軟體時創建出應用使用到的資料庫表結構及添加一些初始化記錄,另外在軟體升級的時候,也需要對數據表結構進行更新。那麼,我們如何才能實現在用戶初次使用或升級軟體時自動在用戶的手機上創建出應用需要的資料庫表呢?總不能讓我們在每個需要安裝此軟體的手機上通過手工方式創建資料庫表吧?因為這種需求是每個資料庫應用都要面臨的,所以在Android系統,為我們提供了一個名為SQLiteOpenHelper的抽象類,必須繼承它才能使用,它是通過對資料庫版本進行管理來實現前面提出的需求。
為了實現對資料庫版本進行管理,SQLiteOpenHelper類提供了兩個重要的方法,分別是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),前者用於初次使用軟體時生成資料庫表,後者用於升級軟體時更新資料庫表結構。當調用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法獲取用於操作資料庫的SQLiteDatabase實例的時候,如果資料庫不存在,Android系統會自動生成一個資料庫,接著調用onCreate()方法,onCreate()方法在初次生成資料庫時才會被調用,在onCreate()方法里可以生成資料庫表結構及添加一些應用使用到的初始化數據。onUpgrade()方法在資料庫的版本發生變化時會被調用,一般在軟體升級時才需改變版本號,而資料庫的版本是由程序員控制的,假設資料庫現在的版本是1,由於業務的變更,修改了資料庫表結構,這時候就需要升級軟體,升級軟體時希望更新用戶手機里的資料庫表結構,為了實現這一目的,可以把原來的資料庫版本設置為2(有同學問設置為3行不行?當然可以,如果你願意,設置為100也行),並且在 onUpgrade()方法裡面實現表結構的更新。當軟體的版本升級次數比較多,這時在onUpgrade()方法裡面可以根據原版號和目標版本號進行判斷,然後作出相應的表結構及數據更新。
getWritableDatabase()和 getReadableDatabase()方法都可以獲取一個用於操作資料庫的SQLiteDatabase實例。但 getWritableDatabase() 方法以讀寫方式打開資料庫,一旦資料庫的磁碟空間滿了,資料庫就只能讀而不能寫,倘若使用getWritableDatabase()打開資料庫就會出錯。getReadableDatabase()方法先以讀寫方式打開資料庫,如果資料庫的磁碟空間滿了,就會打開失敗,當打開失敗後會繼續嘗試以只讀方式打開資料庫。
注意:getWritableDatabase(),getReadableDatabase的區別是當資料庫寫滿時,調用前者會報錯,調用後者不會,所以如果不是更新資料庫的話,最好調用後者來獲得資料庫連接。
代碼:
復制代碼 代碼如下:
public class DatabaseHelper extends SQLiteOpenHelper {
//類沒有實例化,是不能用作父類構造器的參數,必須聲明為靜態
private static final String name = "ljqdb"; //資料庫名稱
private static final int version = 1; //資料庫版本
public DatabaseHelper(Context context) {
//第三個參數CursorFactory指定在執行查詢時獲得一個游標實例的工廠類,設置為null,代表使用系統默認的工廠類
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS person (
personid integer primary key autoincrement, name varchar(20), age INTEGER)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(" ALTER TABLE person ADD phone VARCHAR(12) NULL "); //往表中增加一列
// DROP TABLE IF EXISTS person 刪除表
}
}
在實際項目開發中,當資料庫表結構發生更新時,應該避免用戶存放於資料庫中的數據丟失。
三、使用SQLiteDatabase操作SQLite資料庫
Android提供了一個名為SQLiteDatabase的類,該類封裝了一些操作資料庫的API,使用該類可以完成對數據進行添加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete)操作(這些操作簡稱為CRUD)。對SQLiteDatabase的學習,我們應該重點掌握execSQL()和rawQuery()方法。execSQL()方法可以執行insert、delete、update和CREATE TABLE之類有更改行為的SQL語句; rawQuery()方法用於執行select語句。
execSQL()方法的使用例子:
復制代碼 代碼如下:
SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values('林計欽', 24)");
db.close();
執行上面SQL語句會往person表中添加進一條記錄,在實際應用中, 語句中的「林計欽」這些參數值會由用戶輸入界面提供,如果把用戶輸入的內容原樣組拼到上面的insert語句, 當用戶輸入的內容含有單引號時,組拼出來的SQL語句就會存在語法錯誤。要解決這個問題需要對單引號進行轉義,也就是把單引號轉換成兩個單引號。有些時候用戶往往還會輸入像「 & 」這些特殊SQL符號,為保證組拼好的SQL語句語法正確,必須對SQL語句中的這些特殊SQL符號都進行轉義,顯然,對每條SQL語句都做這樣的處理工作是比較煩瑣的。 SQLiteDatabase類提供了一個重載後的execSQL(String sql, Object[] bindArgs)方法,使用這個方法可以解決前面提到的問題,因為這個方法支持使用佔位符參數(?)。使用例子如下:
復制代碼 代碼如下:
SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"傳智播客", 4});
db.close();
execSQL(String sql, Object[] bindArgs)方法的第一個參數為SQL語句,第二個參數為SQL語句中佔位符參數的值,參數值在數組中的順序要和佔位符的位置對應。
SQLiteDatabase的rawQuery()用於執行select語句,使用例子如下:
復制代碼 代碼如下:
SQLiteDatabase db = ....;
Cursor cursor = db.rawQuery("select * from person", null);
while (cursor.moveToNext()) {
int personid = cursor.getInt(0); //獲取第一列的值,第一列的索引從0開始
String name = cursor.getString(1);//獲取第二列的值
int age = cursor.getInt(2);//獲取第三列的值
}
cursor.close();
db.close();
rawQuery()方法的第一個參數為select語句;第二個參數為select語句中佔位符參數的值,如果select語句沒有使用佔位符,該參數可以設置為null。帶佔位符參數的select語句使用例子如下:
復制代碼 代碼如下:
Cursor cursor = db.rawQuery("select * from person where name like ? and age=?", new String[]{"%林計欽%", "4"});
Cursor是結果集游標,用於對結果集進行隨機訪問,如果大家熟悉jdbc, 其實Cursor與JDBC中的ResultSet作用很相似。使用moveToNext()方法可以將游標從當前行移動到下一行,如果已經移過了結果集的最後一行,返回結果為false,否則為true。另外Cursor 還有常用的moveToPrevious()方法(用於將游標從當前行移動到上一行,如果已經移過了結果集的第一行,返回值為false,否則為true )、moveToFirst()方法(用於將游標移動到結果集的第一行,如果結果集為空,返回值為false,否則為true )和moveToLast()方法(用於將游標移動到結果集的最後一行,如果結果集為空,返回值為false,否則為true ) 。
除了前面給大家介紹的execSQL()和rawQuery()方法, SQLiteDatabase還專門提供了對應於添加、刪除、更新、查詢的操作方法: insert()、delete()、update()和query() 。這些方法實際上是給那些不太了解SQL語法的菜鳥使用的,對於熟悉SQL語法的程序員而言,直接使用execSQL()和rawQuery()方法執行SQL語句就能完成數據的添加、刪除、更新、查詢操作。
5. android SQLiteDatabase中的update函數用法
創建資料庫
Android
不自動提供資料庫。在
Android
應用程序中使用
SQLite,必須自己創建資料庫,然後創建表、索引,填充數據。Android
提供了
SQLiteOpenHelper
幫助你創建一個資料庫,你只要繼承
SQLiteOpenHelper
類,就可以輕松的創建資料庫。SQLiteOpenHelper
類根據開發應用程序的需要,封裝了創建和更新資料庫使用的邏輯。SQLiteOpenHelper
的子類,至少需要實現三個方法:
構造函數,調用父類
SQLiteOpenHelper
的構造函數。這個方法需要四個參數:上下文環境(例如,一個
Activity),資料庫名字,一個可選的游標工廠(通常是
Null),一個代表你正在使用的資料庫模型版本的整數。
onCreate()方法,它需要一個
SQLiteDatabase
對象作為參數,根據需要對這個對象填充表和初始化數據。
onUpgrage()
方法,它需要三個參數,一個
SQLiteDatabase
對象,一個舊的版本號和一個新的版本號,這樣你就可以清楚如何把一個資料庫從舊的模型轉變到新的模型。
下面示例代碼展示了如何繼承
SQLiteOpenHelper
創建資料庫:
public
class
DatabaseHelper
extends
SQLiteOpenHelper
{
DatabaseHelper(Context
context,
String
name,
CursorFactory
cursorFactory,
int
version)
{
super(context,
name,
cursorFactory,
version);
}
@Override
public
void
onCreate(SQLiteDatabase
db)
{
//
TODO
創建資料庫後,對資料庫的操作
}
@Override
public
void
onUpgrade(SQLiteDatabase
db,
int
oldVersion,
int
newVersion)
{
//
TODO
更改資料庫版本的操作
}
super.onOpen(db);
//
TODO
每次成功打開資料庫後首先被執行
}
}
復制代碼
接下來討論具體如何創建表、插入數據、刪除表等等。調用
getReadableDatabase()
或
getWriteableDatabase()
方法,你可以得到
SQLiteDatabase
實例,具體調用那個方法,取決於你是否需要改變資料庫的內容:
db=(new
DatabaseHelper(getContext())).getWritableDatabase();
return
(db
==
null)
?
false
:
true;
復制代碼
上面這段代碼會返回一個
SQLiteDatabase
類的實例,使用這個對象,你就可以查詢或者修改資料庫。
當你完成了對資料庫的操作(例如你的
Activity
已經關閉),需要調用
SQLiteDatabase
的
Close()
方法來釋放掉資料庫連接。
6. android怎麼連接sqlite資料庫
SQLite 一個非常流行的嵌入式資料庫,它支持 SQL 語言,並且只利用很少的內存就有很好的性能。此外它還是開源的,任何人都可以使用它。許多開源項目((Mozilla, PHP, Python)都使用了 SQLite.
Android 開發中使用 SQLite 資料庫
Activites 可以通過 Content Provider 或者 Service 訪問一個資料庫。下面會詳細講解如果創建資料庫,添加數據和查詢資料庫。
創建資料庫
Android 不自動提供資料庫。在 Android 應用程序中使用 SQLite,必須自己創建資料庫,然後創建表、索引,填充數據。Android 提供了 SQLiteOpenHelper 幫助你創建一個資料庫,你只要繼承 SQLiteOpenHelper 類,就可以輕松的創建資料庫。SQLiteOpenHelper 類根據開發應用程序的需要,封裝了創建和更新資料庫使用的邏輯。SQLiteOpenHelper 的子類,至少需要實現三個方法:
構造函數,調用父類 SQLiteOpenHelper 的構造函數。這個方法需要四個參數:上下文環境(例如,一個 Activity),資料庫名字,一個可選的游標工廠(通常是 Null),一個代表你正在使用的資料庫模型版本的整數。
onCreate()方法,它需要一個 SQLiteDatabase 對象作為參數,根據需要對這個對象填充表和初始化數據。
onUpgrage() 方法,它需要三個參數,一個 SQLiteDatabase 對象,一個舊的版本號和一個新的版本號,這樣你就可以清楚如何把一個資料庫從舊的模型轉變到新的模型。
7. 如何升級 sqlite
SQLite資料庫的升級 做Android應用,不可避免的會與SQLite打交道。 隨著應用的不斷升級,原有的資料庫結構可能已經不再適應新的功能。
8. 安卓sqlite需要有什麼基礎
一.基礎知識: 1.SQLite的數據類型: NULL:空值。 INTEGER:帶符號的整型,具體取決有存入數字的范圍大小。 REAL:浮點數字,存儲為8-byte IEEE浮點數。 TEXT:字元串文本。 BLOB:二進制對象。 smallint 16位元的整數。 interger 32位元的整數。 decimal(p,s) p 精確值和 s 大小的十進位整數,精確值p是指全部有幾個數(digits)大小值,s是指小數點後有幾位數。如果沒有特別指定,則系統會設為 p=5; s=0 。 float 32位元的實數。 double 64位元的實數。 char(n) n 長度的字串,n不能超過 254。 varchar(n) 長度不固定且其最大長度為 n 的字串,n不能超過 4000。 graphic(n) 和 char(n) 一樣,不過其單位是兩個字元 double-bytes, n不能超過127。這個形態是為了支援兩個字元長度的字體,例如中文字。 vargraphic(n) 可變長度且其最大長度為 n 的雙字元字串,n不能超過 2000 date 包含了 年份、月份、日期。 time 包含了 小時、分鍾、秒。 timestamp 包含了 年、月、日、時、分、秒、千分之一秒。 datetime 包含日期時間格式,必須寫成'2010-08-05'不能寫為'2010-8-5',否則在讀取時會產生錯誤! 2.SQLite的基本操作: ①SQLiteOpenHelper 抽象類:通過從此類繼承實現用戶類,來提供資料庫打開、關閉等操作函數。 [java] // 創建資料庫 public void onCreate(SQLiteDatabase db) // 更新資料庫 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) // 打開資料庫 public void onOpen(SQLiteDatabase db) // 得到一個可讀SQLiteDatabase對象 public synchronized SQLiteDatabase getReadableDatabase() // 得到一個可寫SQLiteDatabase對象 public synchronized SQLiteDatabase getWriteableDatabase() // 創建資料庫 public void onCreate(SQLiteDatabase db) // 更新資料庫 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) // 打開資料庫 public void onOpen(SQLiteDatabase db) // 得到一個可讀SQLiteDatabase對象 public synchronized SQLiteDatabase getReadableDatabase() // 得到一個可寫SQLiteDatabase對象 public synchronized SQLiteDatabase getWriteableDatabase() ②SQLiteDatabase 資料庫訪問類:執行對資料庫的插入記錄、查詢記錄等操作。 [java] execSQL()方法可以執行insert、delete、update和CREATE TABLE之類有更改行為的SQL語句; rawQuery()方法可以執行select語句。 query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit) table:表名。相當於select語句from關鍵字後面的部分。如果是多表聯合查詢,可以用逗號將兩個表名分開。 columns:要查詢出來的列名。相當於select語句select關鍵字後面的部分。 selection:查詢條件子句,相當於select語句where關鍵字後面的部分,在條件子句允許使用佔位符“?” selectionArgs:對應於selection語句中佔位符的值,值在數組中的位置與佔位符在語句中的位置必須一致,否則就會有異常。 groupBy:相當於select語句group by關鍵字後面的部分 having:相當於select語句having關鍵字後面的部分 orderBy:相當於select語句order by關鍵字後面的部分,如:personid desc, age asc; limit:指定偏移量和獲取的記錄數,相當於select語句limit關鍵字後面的部分。 //還有兩個,網上貌似都用的比較少,而我們這個例子中採用的是這些: public long insert( String table, // 待插入的表名 String nullColumnHack, // 通常設置為null ContentValues values // 待插入的數據 ) public int update( String table, // 待更新的表名 ContentValues values, // 待更新的內容 String whereClause, // 選擇通過哪個欄位來更新 String [] whereArgs // 為whereClause欄位要查詢的值 ) execSQL()方法可以執行insert、delete、update和CREATE TABLE之類有更改行為的SQL語句; rawQuery()方法可以執行select語句。 query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit) table:表名。相當於select語句from關鍵字後面的部分。如果是多表聯合查詢,可以用逗號將兩個表名分開。 columns:要查詢出來的列名。相當於select語句select關鍵字後面的部分。 selection:查詢條件子句,相當於select語句where關鍵字後面的部分,在條件子句允許使用佔位符“?” selectionArgs:對應於selection語句中佔位符的值,值在數組中的位置與佔位符在語句中的位置必須一致,否則就會有異常。 groupBy:相當於select語句group by關鍵字後面的部分 having:相當於select語句having關鍵字後面的部分 orderBy:相當於select語句order by關鍵字後面的部分,如:personid desc, age asc; limit:指定偏移量和獲取的記錄數,相當於select語句limit關鍵字後面的部分。 //還有兩個,網上貌似都用的比較少,而我們這個例子中採用的是這些: public long insert( String table, // 待插入的表名 String nullColumnHack, // 通常設置為null ContentValues values // 待插入的數據 ) public int update( String table, // 待更新的表名 ContentValues values, // 待更新的內容 String whereClause, // 選擇通過哪個欄位來更新 String [] whereArgs // 為whereClause欄位要查詢的值 ) ③下面為網上常用的訪問資料庫的一般流程: [java] public void onClick(View v) { DatabaseHelper databaseHelper = new DatabaseHelper(HelloActivity.this); SQLiteDatabase db = databaseHelper.getWritableDatabase(); db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"傳智播客", 4}); db.close(); }; public void onClick(View v) { DatabaseHelper databaseHelper = new DatabaseHelper(HelloActivity.this); SQLiteDatabase db = databaseHelper.getWritableDatabase(); db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"傳智播客", 4}); db.close(); }; 二.編程實現: 1. 界面編輯(reslayoutmain.xml): [java] android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > android:text="創建資料庫" android:id="@+id/ButtonCreate" android:layout_width="fill_parent" android:layout_height="wrap_content"> android:text="增加數據" android:id="@+id/ButtonInsert" android:layout_width="fill_parent" android:layout_height="wrap_content"> android:text="更新數據" android:id="@+id/ButtonUpdate" android:layout_width="fill_parent" android:layout_height="wrap_content"> android:text="查詢數據" android:id="@+id/ButtonQuery" android:layout_width="fill_parent" android:layout_height="wrap_content"> 定義了一個垂直方向上的線性布局,及各操作的按鈕,水平方向充滿父窗口,垂直方向與內容等高。 界面布局效果如下: 2. 代碼編輯(srcwyfzclMyActivity.java): [java] package wyf.zcl; import wyf.zcl.sqlitedb.SqLiteDBHelper; //引入相關包 import android.app.Activity; //引入相關包 import android.content.ContentValues; //引入相關包 import android.database.Cursor; //引入相關包 import android.database.sqlite.SQLiteDatabase; //引入相關包 import android.os.Bundle; //引入相關包 import android.view.View; //引入相關包 import android.widget.Button; //引入相關包 import android.widget.Toast; public class MyActivity extends Activity { /** Called when the activity is first created. */ private Button createButton; //創建資料庫按鈕 private Button insertBut; //增加資料庫記錄按鈕 private Button updateBut; //更新資料庫記錄按鈕 private Button queryBut; //查詢資料庫記錄按鈕 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); createButton=(Button)findViewById(R.id.ButtonCreate); //實例化創建資料庫按鈕 insertBut=(Button)findViewById(R.id.ButtonInsert); //實例化插入資料庫按鈕 updateBut=(Button)findViewById(R.id.ButtonUpdate); //實例化更新資料庫按鈕 queryBut=(Button)findViewById(R.id.ButtonQuery); //實例化查詢資料庫按鈕 createButton.setOnClickListener(new View.OnClickListener() {//創建資料庫時調用 @Override public void onClick(View v) { SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//創建資料庫 System.out.println("create or open database success!"); SQLiteDatabase sld=dh.getReadableDatabase(); //得到一個SQLiteDatabase對象,用於操控資料庫 Toast.makeText(MyActivity.this, "創建或打開資料庫", Toast.LENGTH_SHORT).show(); }}); insertBut.setOnClickListener(new View.OnClickListener() {//增加資料庫記錄時調用 @Override public void onClick(View v) { ContentValues cv=new ContentValues(); //得到ContentValues對象 cv.put("uid", 1); //放入鍵值對,鍵要與列名一致,值要與列的數據類型一致 cv.put("uname", "zcl"); //放入鍵值對,鍵要與列名一致,值要與列的數據類型一致 SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//創建資料庫 Toast.makeText(MyActivity.this, "插入記錄", Toast.LENGTH_SHORT).show(); SQLiteDatabase sld=dh.getWritableDatabase(); //得到一個SQLiteDatabase對象,用於操控資料庫 sld.insert("sqlitetest", null, cv);//增加資料庫記錄 System.out.println("success insert a new content!"); }}); updateBut.setOnClickListener(new View.OnClickListener() { //更新資料庫記錄時調用 @Override public void onClick(View v) { SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1); //創建資料庫 SQLiteDatabase sld=dh.getWritableDatabase(); //得到一個SQLiteDatabase對象,用於操控資料庫 ContentValues cv = new ContentValues(); //得到ContentValues對象 Toast.makeText(MyActivity.this, "更新記錄", Toast.LENGTH_SHORT).show(); cv.put("uname", "zcl_update"); sld.update("sqlitetest", cv, "uid=?", new String[]{"1"});//更新資料庫記錄 System.out.println("success updata the content!"); }}); queryBut.setOnClickListener(new View.OnClickListener() { //查詢資料庫記錄時調用 @Override public void onClick(View v) { SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//創建資料庫 Toast.makeText(MyActivity.this, "查詢記錄", Toast.LENGTH_SHORT).show(); SQLiteDatabase sld=dh.getReadableDatabase(); //得到一個SQLiteDatabase對象,用於操控資料庫 Cursor cursor=sld.query("sqlitetest", new String[]{"uid","uname"}, "uid=?", new String[]{"1"}, null, null, null); while(cursor.moveToNext()){ //列印輸出 String name=cursor.getString(cursor.getColumnIndex("uname")); System.out.println("query result:"+name); }}}); } } package wyf.zcl; import wyf.zcl.sqlitedb.SqLiteDBHelper; //引入相關包 import android.app.Activity; //引入相關包 import android.content.ContentValues; //引入相關包 import android.database.Cursor; //引入相關包 import android.database.sqlite.SQLiteDatabase; //引入相關包 import android.os.Bundle; //引入相關包 import android.view.View; //引入相關包 import android.widget.Button; //引入相關包 import android.widget.Toast; public class MyActivity extends Activity { /** Called when the activity is first created. */ private Button createButton; //創建資料庫按鈕 private Button insertBut; //增加資料庫記錄按鈕 private Button updateBut; //更新資料庫記錄按鈕 private Button queryBut; //查詢資料庫記錄按鈕 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); createButton=(Button)findViewById(R.id.ButtonCreate); //實例化創建資料庫按鈕 insertBut=(Button)findViewById(R.id.ButtonInsert); //實例化插入資料庫按鈕 updateBut=(Button)findViewById(R.id.ButtonUpdate); //實例化更新資料庫按鈕 queryBut=(Button)findViewById(R.id.ButtonQuery); //實例化查詢資料庫按鈕 createButton.setOnClickListener(new View.OnClickListener() {//創建資料庫時調用 @Override public void onClick(View v) { SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//創建資料庫 System.out.println("create or open database success!"); SQLiteDatabase sld=dh.getReadableDatabase(); //得到一個SQLiteDatabase對象,用於操控資料庫 Toast.makeText(MyActivity.this, "創建或打開資料庫", Toast.LENGTH_SHORT).show(); }}); insertBut.setOnClickListener(new View.OnClickListener() {//增加資料庫記錄時調用 @Override public void onClick(View v) { ContentValues cv=new ContentValues(); //得到ContentValues對象 cv.put("uid", 1); //放入鍵值對,鍵要與列名一致,值要與列的數據類型一致 cv.put("uname", "zcl"); //放入鍵值對,鍵要與列名一致,值要與列的數據類型一致 SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//創建資料庫 Toast.makeText(MyActivity.this, "插入記錄", Toast.LENGTH_SHORT).show(); SQLiteDatabase sld=dh.getWritableDatabase(); //得到一個SQLiteDatabase對象,用於操控資料庫 sld.insert("sqlitetest", null, cv);//增加資料庫記錄 System.out.println("success insert a new content!"); }}); updateBut.setOnClickListener(new View.OnClickListener() { //更新資料庫記錄時調用 @Override public void onClick(View v) { SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1); //創建資料庫 SQLiteDatabase sld=dh.getWritableDatabase(); //得到一個SQLiteDatabase對象,用於操控資料庫 ContentValues cv = new ContentValues(); //得到ContentValues對象 Toast.makeText(MyActivity.this, "更新記錄", Toast.LENGTH_SHORT).show(); cv.put("uname", "zcl_update"); sld.update("sqlitetest", cv, "uid=?", new String[]{"1"});//更新資料庫記錄 System.out.println("success updata the content!"); }}); queryBut.setOnClickListener(new View.OnClickListener() { //查詢資料庫記錄時調用 @Override public void onClick(View v) { SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//創建資料庫 Toast.makeText(MyActivity.this, "查詢記錄", Toast.LENGTH_SHORT).show(); SQLiteDatabase sld=dh.getReadableDatabase(); //得到一個SQLiteDatabase對象,用於操控資料庫 Cursor cursor=sld.query("sqlitetest", new String[]{"uid","uname"}, "uid=?", new String[]{"1"}, null, null, null); while(cursor.moveToNext()){ //列印輸出 String name=cursor.getString(cursor.getColumnIndex("uname")); System.out.println("query result:"+name); }}}); } } (.java): [java] package wyf.zcl.sqlitedb; import android.content.Context; //引入相關包 import android.database.sqlite.SQLiteDatabase; //引入相關包 import android.database.sqlite.SQLiteOpenHelper; //引入相關包 import android.database.sqlite.SQLiteDatabase.CursorFactory;//引入相關包 public class SqLiteDBHelper extends SQLiteOpenHelper{ public SqLiteDBHelper(Context context, String name, CursorFactory factory, int version) {//繼承SQLiteOpenHelper的類,必須有該構造函數 super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { //創建資料庫時調用,此方法是在調用了getReadableDatabase()或getWritableDatabase()後才調用 db.execSQL("create table sqlitetest(uid long,uname varchar(25))"); System.out.println("already create a database:sqlitetest."); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //升級資料庫時掉用 } } package wyf.zcl.sqlitedb; import android.content.Context; //引入相關包 import android.database.sqlite.SQLiteDatabase; //引入相關包 import android.database.sqlite.SQLiteOpenHelper; //引入相關包 import android.database.sqlite.SQLiteDatabase.CursorFactory;//引入相關包 public class SqLiteDBHelper extends SQLiteOpenHelper{ public SqLiteDBHelper(Context context, String name, CursorFactory factory, int version) {//繼承SQLiteOpenHelper的類,必須有該構造函數 super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { //創建資料庫時調用,此方法是在調用了getReadableDatabase()或getWritableDatabase()後才調用 db.execSQL("create table sqlitetest(uid long,uname varchar(25))"); System.out.println("already create a database:sqlitetest."); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //升級資料庫時掉用 } }
9. android sqlitedatabase update 成功與否
Android 不自動提供資料庫。
在 Android 應用程序中使用 SQLite,必須自己創建資料庫,然後創建表、索引,填充數據。Android 提供了 SQLiteOpenHelper 幫助你創建一個資料庫,你只要繼承 SQLiteOpenHelper 類,就可以輕松的創建資料庫。SQLiteOpenHelper 類根據開發應用程序的需要,封裝了創建和更新資料庫使用的邏輯。
SQLiteOpenHelper 的子類,至少需要實現三個方法:
構造函數,調用父類 SQLiteOpenHelper 的構造函數。這個方法需要四個參數:上下文環境(例如,一個 Activity),資料庫名字,一個可選的游標工廠(通常是 Null),一個代表你正在使用的資料庫模型版本的整數。
onCreate()方法,它需要一個 SQLiteDatabase 對象作為參數,根據需要對這個對象填充表和初始化數據。
onUpgrage() 方法,它需要三個參數,一個 SQLiteDatabase 對象,一個舊的版本號和一個新的版本號,這樣你就可以清楚如何把一個資料庫從舊的模型轉變到新的模型。
下面示例代碼展示了如何繼承 SQLiteOpenHelper 創建資料庫:
public class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)
{
super(context, name, cursorFactory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO 創建資料庫後,對資料庫的操作
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO 更改資料庫版本的操作
}
super.onOpen(db);
// TODO 每次成功打開資料庫後首先被執行
}
}
復制代碼
接下來討論具體如何創建表、插入數據、刪除表等等。調用 getReadableDatabase() 或 getWriteableDatabase() 方法,你可以得到 SQLiteDatabase 實例,具體調用那個方法,取決於你是否需要改變資料庫的內容:
db=(new DatabaseHelper(getContext())).getWritableDatabase();
return (db == null) ? false : true;
復制代碼
上面這段代碼會返回一個 SQLiteDatabase 類的實例,使用這個對象,你就可以查詢或者修改資料庫。
當你完成了對資料庫的操作(例如你的 Activity 已經關閉),需要調用 SQLiteDatabase 的 Close() 方法來釋放掉資料庫連接。
至少需要實現三個方法:
構造函數,調用父類 SQLiteOpenHelper 的構造函數。這個方法需要四個參數:上下文環境(例如,一個 Activity),資料庫名字,一個可選的游標工廠(通常是 Null),一個代表你正在使用的資料庫模型版本的整數。
onCreate()方法,它需要一個 SQLiteDatabase 對象作為參數,根據需要對這個對象填充表和初始化數據。
onUpgrage() 方法,它需要三個參數,一個 SQLiteDatabase 對象,一個舊的版本號和一個新的版本號,這樣你就可以清楚如何把一個資料庫從舊的模型轉變到新的模型。
下面示例代碼展示了如何繼承 SQLiteOpenHelper 創建資料庫:
public class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)
{
super(context, name, cursorFactory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO 創建資料庫後,對資料庫的操作
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO 更改資料庫版本的操作
}
super.onOpen(db);
// TODO 每次成功打開資料庫後首先被執行
}
}
復制代碼
接下來討論具體如何創建表、插入數據、刪除表等等。調用 getReadableDatabase() 或 getWriteableDatabase() 方法,你可以得到 SQLiteDatabase 實例,具體調用那個方法,取決於你是否需要改變資料庫的內容:
db=(new DatabaseHelper(getContext())).getWritableDatabase();
return (db == null) ? false : true;
復制代碼
上面這段代碼會返回一個 SQLiteDatabase 類的實例,使用這個對象,你就可以查詢或者修改資料庫。
當你完成了對資料庫的操作(例如你的 Activity 已經關閉),需要調用 SQLiteDatabase 的 Close() 方法來釋放掉資料庫連接。
10. 如何在android中使用sqlite資料庫
android 中SQliteDatabase資料庫使用SQLiteOpenHelper輔助類來創建SQLite資料庫視圖,如下代碼:
create view 表名 as 定義
SQLiteOpenHelper類是一個輔助類,用於創建或打開資料庫。
該類的使用方法一般是自定義一個子類,繼承自SQLiteOpenHelper,並覆寫其中最關鍵的兩個方法:onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)。當新建一個資料庫時會調用前者,一般在裡面做一些創建表或視圖的操作。資料庫版本升級時則會調用後者。
定義好子類後(假如叫SqlHelper),只要調用SqlHelper對象的getReadableDatabase()方法或getWritableDatabase()方法即可返回一個SQLiteDatabase對象。如果是第一次調用,則會創建資料庫。隨後可使用SQLiteDatabase對象的方法進行數據操作,如:execSQL(), insert(), update(), query(), rawQuery(), delete()等。