版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android的數(shù)據(jù)庫(kù)怎么使用
今天在下給大家分享一下Android的數(shù)據(jù)庫(kù)怎么使用的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。一、Android數(shù)據(jù)庫(kù)使用Android中使用android.database.sqlite.SQLiteDatabase來(lái)表示一個(gè)數(shù)據(jù)庫(kù)對(duì)象,它提供了兩種模式來(lái)幫助開(kāi)發(fā)者進(jìn)行增刪改查等基本數(shù)據(jù)庫(kù)操作。利用SQL語(yǔ)句描述操作利用SQL語(yǔ)句調(diào)用SQLiteDatabase.execSql或SQLiteDatabase.rawQuery來(lái)執(zhí)行操作。//利用sql查詢(xún)數(shù)據(jù)
Cursor
data
=
db.rawQuery("select
id,name
from
table");
//利用sql插入數(shù)據(jù)
db.execSql("insert
into
contacts
(id,name)
values
(2,'cpacm')");稍微學(xué)過(guò)sql語(yǔ)句的人應(yīng)該都看的懂上面的代碼(其實(shí)看語(yǔ)句的意思也能知道個(gè)大概~)在這里我來(lái)解釋一下Cursor(游標(biāo))的作用吧,游標(biāo)不能顧名思義(up主當(dāng)時(shí)學(xué)習(xí)數(shù)據(jù)庫(kù)時(shí)一度將游標(biāo)當(dāng)做與C語(yǔ)言里面的指針變量一樣,雖然有點(diǎn)對(duì),但意思還是理解錯(cuò)了),Cursor它是系統(tǒng)為用戶(hù)開(kāi)設(shè)的一個(gè)數(shù)據(jù)緩沖區(qū),是的,它是一塊數(shù)據(jù)區(qū)域,存放SQL語(yǔ)句的執(zhí)行結(jié)果。但是它也提供了能從包括多條數(shù)據(jù)記錄的結(jié)果集中每次提取一條記錄的機(jī)制,這一點(diǎn)也跟指針很像。游標(biāo)總是與一條SQL選擇語(yǔ)句相關(guān)聯(lián)因?yàn)橛螛?biāo)由結(jié)果集(可以是零條、一條或由相關(guān)的選擇語(yǔ)句檢索出的多條記錄)和結(jié)果集中指向特定記錄的游標(biāo)位置組成。當(dāng)決定對(duì)結(jié)果集進(jìn)行處理
時(shí),必須聲明一個(gè)指向該結(jié)果集的游標(biāo)。用C語(yǔ)言作比較的話(huà),如果寫(xiě)過(guò)對(duì)文件進(jìn)行處理的程序,那么游標(biāo)就像您打開(kāi)文件所得到的文件句柄一樣,只要文件打開(kāi)成功,該文件句柄就可代表該文件。總之記住,游標(biāo)是一塊有著特有記號(hào)的一塊數(shù)據(jù)區(qū)域,能夠讓用戶(hù)逐條從中讀取出數(shù)據(jù)。結(jié)構(gòu)化的方式描述數(shù)據(jù)庫(kù)的操作這樣即使我們不熟悉SQL語(yǔ)句,也能使用最熟悉的面向?qū)ο蟮姆绞竭M(jìn)行數(shù)據(jù)庫(kù)操作。//結(jié)構(gòu)化的方式查詢(xún)數(shù)據(jù)
Cursor
data
=
db.query("contacts",new
String[]{"id","name"},null,null,null,null,null);
//結(jié)構(gòu)化方式插入數(shù)據(jù)
ContentValue
values
=
new
ContentValues();
values.put("id",2);
values.put("name","cpacm");
db.insert("table",null,values);//結(jié)構(gòu)化的方式查詢(xún)數(shù)據(jù)
Cursor
data
=
db.query("contacts",new
String[]{"id","name"},null,null,null,null,null);
//結(jié)構(gòu)化方式插入數(shù)據(jù)
ContentValue
values
=
new
ContentValues();
values.put("id",2);
values.put("name","cpacm");
db.insert("table",null,values);/**
*
參數(shù)說(shuō)明
*
table:數(shù)據(jù)表名,columns:需要顯示的列名,如果為null則相當(dāng)與*
*
selection:相當(dāng)于sql語(yǔ)句的where條件;selectionArgs數(shù)組放的是where條件要替換的?號(hào)
*
groupBy:SQL語(yǔ)句的Group,
orderBy:
排序,默認(rèn)asc
**/
public
Cursor
query
(String
table,
String[]
columns,
String
selection,
String[]
selectionArgs,
String
groupBy,
String
having,
String
orderBy){
}比如說(shuō)我要查詢(xún)的SQL語(yǔ)句為SELECT
CustomerName,
SUM(OrderPrice)
FROM
Orders
WHERE
Country=?
GROUP
BY
CustomerName
HAVING
SUM(OrderPrice)>500
ORDER
BY
CustomerName那么我寫(xiě)的代碼如下//數(shù)據(jù)表名
String
table
=
"Orders"
;
//要顯示的列名
String[]
columns
=
new
String[]
{
"CustomerName"
,
"SUM(OrderPrice)"
};
//選擇條件
String
selection
=
"Country=?"
;
//里面的變量對(duì)應(yīng)條件中的問(wèn)號(hào),多個(gè)的時(shí)候請(qǐng)一一入座。
String[]
selectionArgs
=
new
String[]{
"China"
};
//分組名
String
groupBy
=
"CustomerName"
;
//分組的條件
String
having
=
"SUM(OrderPrice)>500"
;
//按字段排序
String
orderBy
=
"CustomerName"
;
Cursor
c
=
db.query(table,
columns,
selection,
selectionArgs,
groupBy,
having,
orderBy);這樣就能實(shí)現(xiàn)數(shù)據(jù)庫(kù)的查詢(xún)了。其它的語(yǔ)句參數(shù)都是差不多的,這里就不一一介紹了。public
long
insert
(String
table,
String
nullColumnHack,
ContentValues
values)public
int
delete(String
table,
String
whereClause,
String[]
whereArgs)public
int
update(String
table,
ContentValues
values,
String
whereClause,
String[]
whereArgs)課外小知識(shí):關(guān)于GroupBy和Having的使用group
by
顧名思義就是按照xxx進(jìn)行分組,它必須有“聚合函數(shù)”來(lái)配合才能使用,使用時(shí)至少需要一個(gè)分組標(biāo)識(shí)字段。聚合函數(shù)有:sum()、count()、avg()等,使用group
by目的就是要將數(shù)據(jù)分組進(jìn)行匯總操作。比如上面sql語(yǔ)句的CustomerName,如果它有四個(gè)行{“張三”,“李四”,“張三”,“李四”},那么此時(shí)就會(huì)分成兩組,分別為張三組和李四組,然后統(tǒng)計(jì)出他們使用的orderprice總和。HAVING作用就是為每一個(gè)組指定條件,像where指定條件一樣,也就是說(shuō),可以根據(jù)你指定的條件來(lái)選擇行。如果你要使用HAVING子句的話(huà),它必須處在GROUP
BY子句之后。還是上面的SQL語(yǔ)句,如果張三的SUM(OrderPrice)沒(méi)有超過(guò)500,那么張三組就不會(huì)顯示。SQL語(yǔ)句的預(yù)編譯在實(shí)踐中,有的SQL語(yǔ)句需要被反復(fù)使用,為了避免反復(fù)解析SQL語(yǔ)句產(chǎn)生的開(kāi)銷(xiāo),可以對(duì)需要復(fù)用的SQL語(yǔ)句進(jìn)行預(yù)編譯,來(lái)提高數(shù)據(jù)庫(kù)操作的執(zhí)行效率。//編譯復(fù)雜的SQL語(yǔ)句SQLiteStatement
compiledSql
=
pileStatement(aSQL);
//執(zhí)行SQLcompiledSql.execute();//編譯復(fù)雜的SQL語(yǔ)句
SQLiteStatement
compiledSql
=
pileStatement(aSQL);
//執(zhí)行SQL
compiledSql.execute();課外小知識(shí):所謂事務(wù)是用戶(hù)定義的一個(gè)數(shù)據(jù)庫(kù)操作序列,這些操作要么全做要么全不做,是一個(gè)不可分割的工作單位。例如,在關(guān)系數(shù)據(jù)庫(kù)中,一個(gè)事務(wù)可以是一條SQL語(yǔ)句、一組SQL語(yǔ)句或整個(gè)程序。
簡(jiǎn)單舉個(gè)例子就是你要同時(shí)修改數(shù)據(jù)庫(kù)中兩個(gè)不同表的時(shí)候,如果它們不是一個(gè)事務(wù)的話(huà),當(dāng)***個(gè)表修改完,可是第二表改修出現(xiàn)了異常而沒(méi)能修改的情況下,就只有第二個(gè)表回到未修改之前的狀態(tài),而***個(gè)表已經(jīng)被修改完畢。
而當(dāng)你把它們?cè)O(shè)定為一個(gè)事務(wù)的時(shí)候,當(dāng)***個(gè)表修改完,可是第二表改修出現(xiàn)了異常而沒(méi)能修改的情況下,***個(gè)表和第二個(gè)表都要回到未修改的狀態(tài)!這就是所謂的事務(wù)回滾。SQLiteOpenHelper在SQLiteOpenHelper中,封裝了一個(gè)SqliteDatabase對(duì)象,使用著可以通過(guò)使用此類(lèi)來(lái)進(jìn)行數(shù)據(jù)庫(kù)的操作。package
com.example.notebook;
import
android.content.Context;
import
android.database.sqlite.SQLiteDatabase;
import
android.database.sqlite.SQLiteOpenHelper;
import
android.database.sqlite.SQLiteDatabase.CursorFactory;
public
class
DBHelper
extends
SQLiteOpenHelper{
private
static
final
int
VERSION=1;
/**
*
在SQLiteOpenHelper的子類(lèi)當(dāng)中,必須有該構(gòu)造函數(shù)
*
@param
context
上下文對(duì)象
*
@param
name
數(shù)據(jù)庫(kù)名稱(chēng)
*
@param
factory
*
@param
version
當(dāng)前數(shù)據(jù)庫(kù)的版本,值必須是整數(shù)并且是遞增的狀態(tài)
*/
public
DBHelper(Context
context,String
name,CursorFactory
factory,int
version){
super(context,name,factory,version);
}
public
DBHelper(Context
context,
String
name,
int
version){
this(context,name,null,version);
}
public
DBHelper(Context
context,
String
name){
this(context,name,VERSION);
}
@Override
public
void
onCreate(SQLiteDatabase
db)
{
//
數(shù)據(jù)庫(kù)***構(gòu)造時(shí),會(huì)調(diào)用該函數(shù),可以在這里構(gòu)造表、索引,等等
System.out.println("create
a
database");
//execSQL用于執(zhí)行SQL語(yǔ)句
db.execSQL("create
table
notebook(_id
integer
primary
key
autoincrement,pic
varchar(50),title
varchar(20),content
text,time
varchar)");
}
@Override
public
void
onUpgrade(SQLiteDatabase
db,
int
oldVersion,
int
newVersion)
{
//
如果給定的當(dāng)前數(shù)據(jù)庫(kù)版本高于已有數(shù)據(jù)庫(kù)版本,調(diào)用該函數(shù)
System.out.println("upgrade
a
database");
}
}SQLiteOpenHelper的應(yīng)用新建一個(gè)數(shù)據(jù)庫(kù)管理類(lèi)DBManagerpackage
com.example.notebook;
import
android.content.ContentValues;
import
android.content.Context;
import
android.database.Cursor;
import
android.database.sqlite.SQLiteDatabase;
import
android.database.sqlite.SQLiteException;
import
android.util.Log;
public
class
DBManager
{
private
Context
mContext
=
null;
private
SQLiteDatabase
mSQLiteDatabase
=
null;//用于操作數(shù)據(jù)庫(kù)的對(duì)象
private
DBHelper
dh
=
null;//用于創(chuàng)建數(shù)據(jù)庫(kù)的對(duì)象
private
String
dbName
=
"note.db";//數(shù)據(jù)庫(kù)的名稱(chēng)
private
int
dbVersion
=
1;//數(shù)據(jù)庫(kù)的版本
public
DBManager(Context
context){
mContext
=
context;
}
public
void
open(){
try{
dh
=
new
DBHelper(mContext,
dbName,
null,
dbVersion);//建立數(shù)據(jù)庫(kù)
if(dh
==
null){
Log.v("msg",
"is
null");
return
;
}
mSQLiteDatabase
=
dh.getWritableDatabase();//以可寫(xiě)方式打開(kāi)數(shù)據(jù)庫(kù)
//dh.onOpen(mSQLiteDatabase);
}catch(SQLiteException
se){
se.printStackTrace();
}
}
public
void
close(){
mSQLiteDatabase.close();//關(guān)閉數(shù)據(jù)庫(kù)
dh.close();
}
public
Cursor
selectAll(){
Cursor
cursor
=
null;
try{
//sql語(yǔ)句操作
String
sql
=
"select
*
from
notebook";
cursor
=
mSQLiteDatabase.rawQuery(sql,
null);
}catch(Exception
ex){
ex.printStackTrace();
cursor
=
null;
}
return
cursor;
}
public
Cursor
selectById(int
id){
//String
result[]
=
{};
Cursor
cursor
=
null;
try{
//sql語(yǔ)句操作
String
sql
=
"select
*
from
notebook
where
_id='"
+
id
+"'";
cursor
=
mSQLiteDatabase.rawQuery(sql,
null);
}catch(Exception
ex){
ex.printStackTrace();
cursor
=
null;
}
return
cursor;
}
public
long
insert(String
title,
String
content,String
pic){
long
datetime
=
System.currentTimeMillis();
long
l
=
-1;
try{
//結(jié)構(gòu)化方式操作
ContentValues
cv
=
new
ContentValues();
cv.put("title",
title);
cv.put("content",
content);
cv.put("time",
datetime);
cv.put("pic",
pic);
l
=
mSQLiteDatabase.insert("notebook",
null,
cv);
//
Log.v("datetime",
datetime+""+l);
}catch(Exception
ex){
ex.printStackTrace();
l
=
-1;
}
return
l;
}
public
int
delete(int
id){
int
affect
=
0;
try{
//結(jié)構(gòu)化方式操作
affect
=
mSQLiteDatabase.delete("notebook",
"_id=?",
new
String[]{String.valueOf(id)});
}catch(Exception
ex){
ex.printStackTrace();
affect
=
-1;
}
return
affect;
}
public
int
update(int
id,
String
title,
String
content,String
pic){
int
affect
=
0;
try{
//結(jié)構(gòu)化方式操作
ContentValues
cv
=
new
ContentValues();
cv.put("title",
title);
cv.put("content",
content);
cv.put("pic",
pic);
String
w[]
=
{String.valueOf(id)};
affect
=
mSQLiteDatabase.update("notebook",
cv,
"_id=?",
w);
}catch(Exception
ex){
ex.printStackTrace();
affect
=
-1;
}
return
affect;
}
}獲取數(shù)據(jù)示例private
DBManager
dm
=
null;//
數(shù)據(jù)庫(kù)管理對(duì)象
rivate
Cursor
cursor
=
null;
dm
=
new
DBManager(this);//數(shù)據(jù)庫(kù)操作對(duì)象
dm.open();//打開(kāi)數(shù)據(jù)庫(kù)操作對(duì)象
cursor
=
dm.selectAll();//獲取所有數(shù)據(jù)
cursor.moveToFirst();//將游標(biāo)移動(dòng)到***條數(shù)據(jù),使用前必須調(diào)用
int
count
=
cursor.getCount();//個(gè)數(shù)
ArrayList<String>
contents
=
new
ArrayList<String>();//圖片的所有集合
ArrayList<String>
imgs
=
new
ArrayList<String>();//圖片的所有集合
ArrayList<String>
items
=
new
ArrayList<String>();//標(biāo)題的所有集合
ArrayList<String>
times
=
new
ArrayList<String>();//時(shí)間的所有集合
for(int
i=
0;
i
<
count;
i++){
contents.add(cursor.getString(cursor.getColumnIndex("content")));
imgs.add(cursor.getString(cursor.getColumnIndex("pic")));
items.add(cursor.getString(cursor.getColumnIndex("title")));
times.add(cursor.getString(cursor.getColumnIndex("time")));
//cursor.getInt(cursor.getColumnIndex("_id"))
cursor.moveToNext();//將游標(biāo)指向下一個(gè)
}
dm.close();//關(guān)閉數(shù)據(jù)操作對(duì)象數(shù)據(jù)庫(kù)的并發(fā)問(wèn)題并發(fā)問(wèn)題是使用數(shù)據(jù)庫(kù)過(guò)程中最容易碰到的問(wèn)題,如果在開(kāi)發(fā)中碰到了android.database.SQLException異常,并提示"databaseislocked"
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年布草間衛(wèi)生管理制度例文(七篇)
- 2024年市場(chǎng)年度工作計(jì)劃范本(二篇)
- 全球低空安全保障體系加速布局(先進(jìn)制造2024數(shù)解第8期第1篇)
- 2024年婦產(chǎn)科醫(yī)生工作總結(jié)簡(jiǎn)單版(四篇)
- 2024年工程車(chē)運(yùn)輸合同簡(jiǎn)單版(三篇)
- 2024年小學(xué)食堂工作人員職責(zé)范文(二篇)
- 2024年工地勞務(wù)合同范本(二篇)
- 2024年廠(chǎng)房房租租賃合同經(jīng)典版(二篇)
- 2024年年終工作總結(jié)個(gè)人標(biāo)準(zhǔn)樣本(二篇)
- 2024年居家養(yǎng)老服務(wù)站各類(lèi)規(guī)章制度樣本(二篇)
- 農(nóng)村農(nóng)產(chǎn)品加工行業(yè)市場(chǎng)需求分析及未來(lái)三年行業(yè)預(yù)測(cè)報(bào)告
- 交通行業(yè)智能交通系統(tǒng)建設(shè)與運(yùn)營(yíng)維護(hù)方案
- 2024-2025學(xué)年北師大版七年級(jí)數(shù)學(xué)上冊(cè)期末測(cè)試壓軸題考點(diǎn)模擬訓(xùn)練(一)
- 2023-2024學(xué)年北京市通州區(qū)九年級(jí)(上)期中數(shù)學(xué)試卷【含解析】
- 速凍食品安全風(fēng)險(xiǎn)管控清單
- 國(guó)家職業(yè)分類(lèi)大典
- 2024年二手車(chē)轉(zhuǎn)讓合同電子版(3篇)
- 遙感地學(xué)應(yīng)用04-水體和海洋遙感
- 中醫(yī)藥創(chuàng)新創(chuàng)業(yè)“八段錦”智慧樹(shù)知到答案2024年浙江中醫(yī)藥大學(xué)
- 2024-2030年代駕產(chǎn)業(yè)市場(chǎng)深度調(diào)研及發(fā)展趨勢(shì)與投資戰(zhàn)略研究分析報(bào)告
- 安全治本攻堅(jiān)三年行動(dòng)方案及重大事故隱患會(huì)議紀(jì)要(完整版)
評(píng)論
0/150
提交評(píng)論