androidsql查詢語句-九游会j9娱乐平台
1. 如何使用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
#include
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
#include
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
#include
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
#include
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的介面定義和數據類型是否正確,否則會得到錯誤的訪問結果。
2. android開發 sqlite作用
sqlite簡介
google為andriod的較大的數據處理提供了sqlite,他在數據存儲、管理、維護等各方面都相當出色,功能也非常的強大。sqlite具備下列特點:
1.輕量級
使用 sqlite 只需要帶一個動態庫,就可以享受它的全部功能,而且那個動態庫的尺寸想當小。
2.獨立性
sqlite 資料庫的核心引擎不需要依賴第三方軟體,也不需要所謂的「安裝」。
3.隔離性
sqlite 資料庫中所有的信息(比如表、視圖、觸發器等)都包含在一個文件夾內,方便管理和維護。
4.跨平台
sqlite 目前支持大部分操作系統,不至電腦操作系統更在眾多的手機系統也是能夠運行,比如:android。
5.多語言介面
sqlite 資料庫支持多語言編程介面。
6.安全性
sqlite 資料庫通過資料庫級上的獨占性和共享鎖來實現獨立事務處理。這意味著多個進程可以在同一時間從同一資料庫讀取數據,但只能有一個可以寫入數據。
android中的sqlite使用
首先創建資料庫類
public class databasehelper extends sqliteopenhelper {
private static final string db_name = "mydata.db"; //資料庫名稱
private static final int version = 1; //資料庫版本
public databasehelper(context context) {
super(context, db_name, null, version);
// todo auto-generated constructor stub
}
@override
public void oncreate(sqlitedatabase db) {
string sql = "create table user(username varchar(20) not null , password varchar(60) not null );";
db.execsql(sql);
}
@override
public void onupgrade(sqlitedatabase db, int oldversion, int newversion) {
// todo auto-generated method stub
}
}
sqliteopenhelper類介紹
sqliteopenhelper是sqlitedatabase的一個幫助類,用來管理資料庫的創建和版本的更新。一般是建立一個類繼承它,並實現它的oncreate和onupgrade方法。
方法名
方法描述
sqliteopenhelper(context context,string name,sqlitedatabase.cursorfactory factory,int version) 構造方法,一般是傳遞一個要創建的資料庫名稱那麼參數
oncreate(sqlitedatabase db) 創建資料庫時調用
onupgrade(sqlitedatabase db,int oldversion , int newversion) 版本更新時調用
getreadabledatabase() 創建或打開一個只讀資料庫
getwritabledatabase() 創建或打開一個讀寫資料庫
下面來介紹調用的方法
創建資料庫
這里特別的地方是通過調用了sqliteopenhelper類的getreadabledatabase()方法來實現創建一個資料庫的
1
2
3
databasehelper database = new databasehelper(this);//這段代碼放到activity類中才用this
sqlitedatabase db = null;
db = database.getreadalbedatabase();
sqlitedatabase類為我們提供了很多種方法,而較常用的方法如下
(返回值)方法名
方法描述
(int) delete(string table,string whereclause,string[] whereargs) 刪除數據行的便捷方法
(long) insert(string table,string nullcolumnhack,contentvalues values) 添加數據行的便捷方法
(int) update(string table, contentvalues values, string whereclause, string[] whereargs) 更新數據行的便捷方法
(void) execsql(string sql) 執行一個sql語句,可以是一個select或其他的sql語句
(void) close() 關閉資料庫
(cursor) query(string table, string[] columns, string selection, string[] selectionargs, string groupby, string having, string orderby, string limit) 查詢指定的數據表返回一個帶游標的數據集
(cursor) rawquery(string sql, string[] selectionargs) 運行一個預置的sql語句,返回帶游標的數據集(與上面的語句最大的區別就是防止sql注入)
數據的添刪改查分別可以通過2種途徑來實現
數據的添加
1.使用insert方法
1
2
3
contentvalues cv = new contentvalues();//實例化一個contentvalues用來裝載待插入的數據cv.put("username","jack johnson");//添加用戶名
cv.put("password","ilovepopmusic"); //添加密碼
db.insert("user",null,cv);//執行插入操作
2.使用execsql方式來實現
1
2
string sql = "insert into user(username,password) values ('jack johnson','ilovepopmuisc');//插入操作的sql語句
db.execsql(sql);//執行sql語句
數據的刪除
同樣有2種方式可以實現
1
2
3
string whereclause = "username=?";//刪除的條件
string[] whereargs = {"jack johnson"};//刪除的條件參數
db.delete("user",whereclause,whereargs);//執行刪除
使用execsql方式的實現
1
2
string sql = "delete from user where username='jack johnson'";//刪除操作的sql語句
db.execsql(sql);//執行刪除操作
數據修改
同上,仍是2種方式
1
2
3
4
5
contentvalues cv = new contentvalues();//實例化contentvalues
cv.put("password","ihatepopmusic");//添加要更改的欄位及內容
string whereclause = "username=?";//修改條件
string[] whereargs = {"jack johnson"};//修改條件的參數
db.update("user",cv,whereclause,whereargs);//執行修改
使用execsql方式的實現
1
2
string sql = "update [user] set password = 'ihatepopmusic' where username='jack johnson'";//修改的sql語句
db.execsql(sql);//執行修改
數據查詢
數據查詢相對前面幾種方法就復雜一些了,因為查詢會帶有很多條件
通過query實現查詢的
public cursor query(string table, string[] columns, string selection, string[] selectionargs, string groupby, string having, string orderby, string limit)
各參數說明:
table:表名稱
colums:列名稱數組
selection:條件子句,相當於where
selectionargs:條件語句的參數數組
groupby:分組
having:分組條件
orderby:排序類
limit:分頁查詢的限制
cursor:返回值,相當於結果集resultset
針對游標(cursor)也提供了不少方法
方法名稱
方法描述
getcount() 總記錄條數
isfirst() 判斷是否第一條記錄
islast() 判斷是否最後一條記錄
movetofirst() 移動到第一條記錄
movetolast() 移動到最後一條記錄
move(int offset) 移動到指定的記錄
movetonext() 移動到嚇一條記錄
movetoprevious() 移動到上一條記錄
getcolumnindex(string columnname) 獲得指定列索引的int類型值
實現代碼
1
2
3
4
5
6
7
8
cursor c = db.query("user",null,null,null,null,null,null);//查詢並獲得游標
if(c.movetofirst()){//判斷游標是否為空
for(int i=0;i
string username = c.getstring(c.getcolumnindex("username");
string password = c.getstring(c.getcolumnindex("password"));
}
}
通過rawquery實現的帶參數查詢
1
2
3
4
cursor c = db.rawquery("select * from user where username=?",new stirng[]{"jack johnson"});
if(cursor.movetofirst()) {
string password = c.getstring(c.getcolumnindex("password"));
}
3. android logcat 錯誤 求解
near "foreign": syntax error: , while compiling ←這燃鎮輪貨是診斷依據
報錯原因是因為foreign是sqlite的保留關鍵字,不能被當做普通的自定義列名在select語句中使用。
在有語法高亮功能的編輯器中顯示該sql語句旅晌如下圖所示
如圖所示,關鍵字'foreign'赫然在列→_→。
建議:
你確定你的contacts表中存在名為foreign的列嗎?請檢查。
如果確實存在並需要使用,可以為foreign加引號。
原sql語句改為:select _id, 'foreign', chinese from contacts order by _id
你還可以考慮將列名替換為'overseas',如果是想按國內國外區分不同contact的話皮信。
以上。
4. arcgis for android identify 和query查詢遇到的問題,求教
1、querytask:是一個進行空間和屬性查詢的功能類,它可以在某個地圖服務的某個子圖層內進行查詢,順便提一下的是,querytask進行查詢的地圖服務並不必須載入到map中進行顯示。querytask的執行需要兩個先決條件:悶臘戚一個是需要查詢的圖層url、一個是進行查詢的過濾條件。
下面是querytask的基本過程:
//新建一個querytask
querytask querytask = new querytask("http://sampleserver1.arcgisonline.com/arcgis/rest/services/demographics/esri_census_usa/mapserver/5");
// query對象
query query = new query();
//傳入空間幾何范圍,可以不設置
//合法的geometry類型是extent, point, multipoint, polyline, polygon
query.geometry = geometry;
//是否返回查詢結果的空間幾何信息
query.returngeometry = true;
//查詢結果返回的欄位,欄位必須在圖層中,欄位的大小寫可忽略
query.outfields.addrange(new string[] { "areaname", "pop2000" });
//quer.outfield.add("*"局彎); //返回所有欄位
//查詢的where條件,可以是任何合法的sql語句,可以不設置
query.where = "pop2000 > 350000";
//非同步查詢,需要綁定querytask的兩個事件,通過executecompleted得到查詢結果
querytask.executecompleted = querytask_executecompleted;
querytask.failed = querytask_failed;
querytask.executeasync(query);
//同步查詢,不需要綁定事件,直接返回查詢結果
//featureset featureset = querytask.execute(query);
2、螞陵findtask:允許對地圖中一個或多個圖層的要素進行基於屬性欄位值的查詢(search one or more layers in a map for features with attribute values that match or contain an input value)。findtask不能進行「空間查詢」,因為findtask可以對多個圖層進行查詢,所有它的url屬性需要指向所查詢的地圖服務的rest url,而不像querytask需要指定某個圖層的url。
下面是findtask的基本過程:
//新建一個find task
findtask findtask = new findtask("http://sampleserver1.arcgisonline.com/arcgis/rest/services/demographics/esri_census_usa/mapserver/");
//非同步執行,綁定事件
findtask.executecompleted = findtask_executecompleted;
findtask.failed = findtask_failed;
//初始化findparameters參數
findparameters findparameters = new findparameters();
findparameters.layerids.addrange(new int[] { 3 }); //查找的圖層
findparameters.searchfields.addrange(new string[] { "name" }); //查找的欄位范圍
findparameters.returngeometry = true;
findparameters.searchtext = findtextbox.text; //查找的「屬性值」
//設置查詢的layerdefinitions
esri.arcgis.client.layerdefinition mydefinition = new esri.arcgis.client.layerdefinition();
mydefinition.layerid = 3;
//設置layerdefinition,屬性欄位「name」屬於id為0的圖層
//layerdefinition的設置語句和query中的where語句一樣
mydefinition.definition = "name = 'xxx'";
//創建一個observablecollection,add設置的layerdefinition
system.collections.objectmodel.observablecollection
new system.collections.objectmodel.observablecollection
myobservablecollection.add(mydefinition);
findparameters.layerdefinitions = myobservablecollection; //設置查詢的layerdefinitions
//非同步執行
findtask.executeasync(findparameters);
3、identifytask:是一個在地圖服務中識別要素(feature)的功能類。通過identifytask可以搜索地圖層中與輸入幾何形相交的要素(search the layers in a map for features that intersect an input geometry)。因為也是在多個圖層中查詢,所以task的url是動態圖層服務的地址。同樣,返回的要素都可以作為graphic被添加到地圖的graphicslayer上。
基本過程如下:
//新建一個identify task
identifytask identifytask = new identifytask("http://sampleserver1.arcgisonline.com/arcgis/rest/services/demographics/esri_census_usa/mapserver");
//非同步執行,綁定事件
identifytask.executecompleted = identifytask_executecompleted;
identifytask.failed = identifytask_failed;
//初始化 identify parameters
identifyparameters identifyparameters = new identifyparameters();
identifyparameters.layeroption = layeroption.all;
//傳遞地圖屬性給 identify parameters
identifyparameters.mapextent = mymap.extent;
identifyparameters.width = (int)mymap.actualwidth;
identifyparameters.height = (int)mymap.actualheight;
//輸入的幾何參數為一個點,args來自點擊事件
identifyparameters.geometry = args.mappoint; //point envelop extent polyline polygon
//設置查詢的layerdefinitions
esri.arcgis.client.layerdefinition mydefinition = new esri.arcgis.client.layerdefinition();
mydefinition.layerid = 3;
//設置layerdefinition,屬性欄位「name」屬於id為0的圖層
//layerdefinition的設置語句和query中的where語句一樣
mydefinition.definition = "name = 'xxx'";
//創建一個observablecollection,add設置的layerdefinition
system.collections.objectmodel.observablecollection
new system.collections.objectmodel.observablecollection
myobservablecollection.add(mydefinition);
identifyparameters.layerdefinitions = myobservablecollection; //設置查詢的layerdefinitions
//非同步執行
identifytask.executeasync(identifyparameters);
三種查詢的返回結果:
querytask:返回的是一個featureset。featureset.features[i]可以加入到graphicslayer上顯示,也可以通過attributes屬性欄位得到屬性信息。
findtask:返回的是一個findresults數組, findresults[i].feature可以加入到graphicslayer上顯示,也可以通過attributes屬性欄位得到屬性信息。
identifytask:返回的是一個identifyresults數組,identifyresults[i].feature可以加入到graphicslayer上顯示,也可以通過attributes屬性欄位得到屬性信息。
5. 在android中對資料庫做增刪改查有兩種方式分別是sqlitedatabase這個類中的哪幾個
一、使用嵌入式關系型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語句就能完成數據的添加、刪除、更新、查詢操作。
6. java中執行sql插入語句怎麼弄
1、connection conn = drivermanager.getconnection(url,資料庫登錄名,資料庫登錄密碼);//獲得資料庫連接。
2、statement statement = con.createstatement(); //訪問資料庫。
3、resultset resultset = statement.executequery(sql);//執行sql語句。