【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android的數(shù)據(jù)庫(kù)怎么使用_第1頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android的數(shù)據(jù)庫(kù)怎么使用_第2頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android的數(shù)據(jù)庫(kù)怎么使用_第3頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android的數(shù)據(jù)庫(kù)怎么使用_第4頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android的數(shù)據(jù)庫(kù)怎么使用_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論