第8章數(shù)據存儲與訪問_第1頁
第8章數(shù)據存儲與訪問_第2頁
第8章數(shù)據存儲與訪問_第3頁
第8章數(shù)據存儲與訪問_第4頁
第8章數(shù)據存儲與訪問_第5頁
已閱讀5頁,還剩167頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第8章 數(shù)據存儲和訪問本章結構:簡單存儲——SharedPreferences文件存儲數(shù)據庫存儲——SQLite數(shù)據共享——ContentProvider簡單存儲——SharedPreferencesSharedPreferences簡介一種輕量級的數(shù)據保存方式可以將NVP(Name/ValuePair,名稱/值對)保存在

Android的文件系統(tǒng)中,而且SharedPreferences完全屏蔽的對文件系統(tǒng)的操作過程開發(fā)人員僅是通過調用SharedPreferences對NVP進行保存和讀取SharedPreferences不僅能夠保存數(shù)據,還能夠實現(xiàn)不同應用程序間的數(shù)據共享用戶SharedPreference文件系統(tǒng)/data/data/<package

name>/shared_prefs/簡單存儲——SharedPreferencesSharedPreferences使用名稱模式Context::getSharedPreferences(

)commit()get<Type>()put<Type>()SharedPreferences內部類:Editor寫數(shù)據讀數(shù)據SharedPreferences支持三種訪問模式私有(MODE_PRIVATE):僅創(chuàng)建程序有權限對其進行讀取或寫入全局讀(MODE_WORLD_READABLE):不僅創(chuàng)建程序可以對其進行讀取或寫入,其他任何應用程序也讀取操作的權限,但沒有寫入操作的權限全局寫(MODE_WORLD_WRITEABLE):創(chuàng)建程序和其他任何程序都可以對其進行寫入操作,但沒有讀取的權限簡單存儲——SharedPreferencesSharedPreferences的使用定義SharedPreferences的訪問模式定義SharedPreferences的名稱,這個名稱與在Android文件系統(tǒng)中保存的文件同名。因此,只要具有相同的

SharedPreferences名稱的NVP內容,都會保存在同一個文件中Context.MODE_WORLD_WRITEABLE;簡單存儲——SharedPreferences私有模式publicstatic

int

MODE

=

Context.MODE_PRIVATE;public

static

int

MODE

=

Context.MODE_WORLD_READABLE

+全局讀寫模式public

static

finalStringPREFERENCE_NAME

="SaveSetting";獲取SharedPreferences對象——通過getSharedPreferences()函數(shù)修改:SharedPreferences.Editor類保存:mit()SharedPreferences廣泛支持各種基本數(shù)據類型,包括整型、布爾型、浮點型和長型等等SharedPreferences

sharedPreferences

=

getSharedPreferences(PREFERENCE_NAME,

MODE);模式名稱簡單存儲——SharedPreferencesSharedPreferences.Editor

editor

=

sharedPreferences.edit();editor.putString("Name",

"Tom");editor.putInt("Age",

20);editor.putFloat(“Height”,

1.81f);mit();讀取數(shù)據——SharedPreferences::

get<Type>()第1個參數(shù)是NVP的名稱第2個參數(shù)是在無法獲取到數(shù)值的時候使用的缺省值SharedPreferences

sharedPreferences

=

getSharedPreferences(PREFERENCE_NAME,MODE);Stringname

=

sharedPreferences.getString("Name","Default

Name");int

age

=

sharedPreferences.getInt("Age",

20);float

height

=sharedPreferences.getFloat(“Height”,

1.81f);簡單存儲——SharedPreferences獲取SharedPreferences對象get<Type>()——讀取數(shù)據SimplePreferenceDemo示例下圖是SimplePreferenceDemo示例的用戶界面用戶在界面上的輸入的信息,將通過SharedPreferences在Activity關閉時進行保存。當應用程序重新開啟時,保存在SharedPreferences的信息將被讀取出來,并重新呈現(xiàn)在用戶界面上簡單存儲——SharedPreferencesSimplePreferenceDemo示例運行后,通過FileExplorer查看/data/data下的數(shù)據,Android為每個應用程序建立了與包同名的目錄,用來保存應用程序產生的數(shù)據,這些數(shù)據包括文件、SharedPreferences文件和數(shù)據庫等SharedPreferences文件就保存在/data/data/<packagename>/shared_prefs目錄下簡單存儲——SharedPreferences在本示例中,shared_prefs目錄下生成了一個名為SaveSetting.xml的文件這個文件就是保存SharedPreferences的文件,文件大小為170字節(jié),在Linux下的權限為“-rw-rw-rw”簡單存儲——SharedPreferences在Linux系統(tǒng)中,文件權限分別描述了創(chuàng)建者、同組用戶和其他用戶對文件的操作限制。x表示可執(zhí)行,r表示可讀,w表示可寫,d表示目錄,-表示普通文件。因此,“-rw-rw-rw”表示SaveSetting.xml可以被創(chuàng)建者、同組用戶和其他用戶進行讀取和寫入操作,但不可執(zhí)行產生這樣的文件權限與程序人員設定的

SharedPreferences的訪問模式有關,“-rw-rw-rw”的權限是“全局讀+全局寫”的結果如果將SharedPreferences的訪問模式設置為私有,則文件權限將成為“-rw-rw---”,表示僅有創(chuàng)建者和同組用戶具有讀寫文件的權限簡單存儲——SharedPreferencesSaveSetting.xml文件是以XML格式保存的信息,內容如圖如下<?xml

version='1.0'

encoding='utf-8'

standalone='yes'

?><map><float

name="Height"

value="1.81"

/><string

name="Name">Tom</string><int

name="Age"

value="20"

/></map>簡單存儲——SharedPreferences在onStart()函數(shù)中調用loadSharedPreferences()函數(shù),讀取保存在SharedPreferences中的姓名、年齡和身高信息,并顯示在用戶界面上當Activity關閉時,在onStop()函數(shù)調用saveSharedPreferences(),保存界面上的信息SimplePreferenceDemo.java的完整代碼1. package

edu.hrbeu.SimplePreferenceDemo;2.import

android.app.Activity;import

android.content.Context;import

android.content.SharedPreferences;import

android.os.Bundle;import

android.widget.EditText;簡單存儲——SharedPreferences8.9. public

class

SimplePreferenceDemo

extends

Activity

{10.11.12.13.14.15.private

EditText

nameText;private

EditText

ageText;private

EditText

heightText;public

static

finalStringPREFERENCE_NAME

="SaveSetting";public

static

int

MODE

=

Context.MODE_WORLD_READABLE

+Context.MODE_WORLD_WRITEABLE;16.17.18.19.20.21.22.23.24.@Overridepublic

void

onCreate(Bundle

savedInstanceState)

{super.onCreate(savedInstanceState);setContentView(R.layout.main);nameText

=(EditText)findViewById(R.);ageText

=(EditText)findViewById(R.id.age);heightText

=

(EditText)findViewById(R.id.height);}簡單存儲——SharedPreferences@Overridepublic

void

onStart(){super.onStart();loadSharedPreferences();}@Overridepublic

void

onStop(){super.onStop();saveSharedPreferences();}25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.private

void

loadSharedPreferences(){SharedPreferences

sharedPreferences

=getSharedPreferences(PREFERENCE_NAME,

MODE);String

name

=

sharedPreferences.getString("Name","Tom");int

age

=

sharedPreferences.getInt("Age",

20);float

height

=sharedPreferences.getFloat("Height",);簡單存儲——SharedPreferences42.nameText.setText(name);ageText.setText(String.valueOf(age));heightText.setText(String.valueOf(height));}private

void

saveSharedPreferences(){SharedPreferences

sharedPreferences

=

getSharedPreferences(PREFERENCE_NAME,MODE);SharedPreferences.Editor

editor

=

sharedPreferences.edit();editor.putString("Name",

nameText.getText().toString());editor.putInt("Age",

Integer.parseInt(ageText.getText().toString()));editor.putFloat("Height",Float.parseFloat(heightText.getText().toString()));mit();}}簡單存儲——SharedPreferences示例SharePreferenceDemo示例將讀取SimplePreferenceDemo示例保存的信息,并在程序啟動時顯示在用戶界面上簡單存儲——SharedPreferences下面給出SharePreferenceDemo示例的核心代碼public

static

final

String

PREFERENCE_PACKAGE

="edu.hrbeu.SimplePreferenceDemo";public

static

finalStringPREFERENCE_NAME

="SaveSetting";public

static

int

MODE

=

Context.MODE_WORLD_READABLE

+Context.MODE_WORLD_WRITEABLE;9.10.11.12.4.public

void

onCreate(Bundle

savedInstanceState)

{Context

c

=null;try

{

c

=this.createPackageContext(PREFERENCE_PACKAGE,Context.CONTEXT_IGNORE_SECURITY);}

catch

(NameNotFoundException

e)

{e.printStackTrace();}SharedPreferences

sharedPreferences

=c.getSharedPreferences(PREFERENCE_NAME,

MODE);簡單存儲——SharedPreferences獲取Context13.14.15.String

name

=

sharedPreferences.getString("Name","Tom");int

age

=

sharedPreferences.getInt("Age",

20);float

height

=sharedPreferences.getFloat("Height",);16.17.18.String

msg=“姓名:”+String.valueof(name)+“\n”+“年齡:”+String.valueof(age)+“\n”+“身高:”+String.valueof(height);textView.setText(msg);19.20.

}簡單存儲——SharedPreferences第8行代碼調用了createPackageContext()獲取到了SimplePreferenceDemo示例的Context第8行代碼第1個參數(shù)是SimplePreferenceDemo的包名稱,在代碼第1行進行了定義第2個參數(shù)Context.CONTEXT_IGNORE_SECURIT表示忽略所有可能產生的安全問題。這段代碼可能引發(fā)異常,因此必須防止在try/catch中簡單存儲——SharedPreferences在代碼第12行,通過Context得到了SimplePreferenceDemo示例的SharedPreferences對象,同樣在getSharedPreferences()函數(shù)中,需要將正確的SharedPreferences名稱傳遞給函數(shù)訪問其他應用程序的SharedPreferences必須滿足三個條件共享者需要將SharedPreferences的訪問模式設置為全局讀或全局寫訪問者需要知道共享者的包名稱和SharedPreferences的名稱,以通過Context獲得SharedPreferences對象訪問者需要確切知道每個數(shù)據的名稱和數(shù)據類型,用以正確讀取數(shù)據簡單存儲——SharedPreferences文件存儲Android使用的是基于Linux的文件系統(tǒng),程序開發(fā)人員可以程序自身的私有文件的讀寫保存在資源目錄中的原始文件和XML文件的讀寫SD卡等外部存儲設備中文件的讀寫文件存儲內部存儲——程序自身的私有文件私有文件:文件保存在設備的內部存儲器上,在Linux系統(tǒng)下的/data/data/<package

name>/files目錄中Android系統(tǒng)不僅支持標準Java的IO類和方法還提供了能夠簡化讀寫流式文件過程的函數(shù)openFileOutput()openFileInput()。。。名稱模式FileOutputStreamopenFileOutput名稱FileInputStreamopenFileInputwrite()flush()close()read()close()寫數(shù)據讀數(shù)據文件路徑:/data/data/<package

name>/files/文件存儲openFileOutput()函數(shù)為寫入數(shù)據做準備而打開的應用程序私文件,如果指定的文件不存在,則創(chuàng)建一個新的文件語法格式:第1個參數(shù):文件名稱,這個參數(shù)不可以包含描述路徑的斜杠第2個參數(shù):操作模式函數(shù)的返回值:FileOutputStream對象public

FileOutputStream

openFileOutput(String

name,

int

mode)文件存儲Android系統(tǒng)支持四種文件操作模式模式說明MODE_PRIVATE私有模式,缺省模式,文件僅能夠被文件創(chuàng)建程序訪問,或具有相同UID的程序訪問。MODE_APPEND追加模式,如果文件已經存在,則在文件的結尾處添加新數(shù)據。MODE_WORLD_READABLE全局讀模式,允許任何程序讀取私有文件。MODE_WORLD_WRITEABLE全局寫模式,允許任何程序寫入私有文件。文件存儲示例代碼:FileOutputStream常用函數(shù):String

FILE_NAME

=

"fileDemo.txt";FileOutputStream

fos

=

openFileOutput(FILE_NAME,Context.

MODE_PRIVATE)String

text

=

“Somedata”;fos.write(text.getBytes());fos.flush();fos.close();文件名稱操作模式函數(shù)功能write(…)寫數(shù)據flush(

)刷清數(shù)據,調用close()之前,務必要調用close(

)關閉FileOutputStream文件存儲openFileInput()函數(shù)為讀取數(shù)據做準備而打開應用程序私文件語法格式:第1個參數(shù):文件名稱,這個參數(shù)不可以包含描述路徑的斜杠返回值:FileInputStream對象常用函數(shù):public

FileInputStream

openFileInput(String

name)函數(shù)功能read(…)讀數(shù)據close(

)關閉FileInputStream文件存儲示例代碼:String

FILE_NAME

=

"fileDemo.txt";FileInputStream

fis

=

openFileInput(FILE_NAME);3.byte[]

readBytes

=newbyte[fis.available()];while(fis.read(readBytes)

!=

-1){}因為文件操作可能會遇到各種問題而最終導致操作失敗,因此代碼應該使用try/catch捕獲可能產生的異常文件存儲InternalFileDemo示例用來演示在內部存儲器上進行文件寫入和讀取文件FileOutputStreamFileInputStream文件存儲InternalFileDemo示例的核心代碼OnClickListener

writeButtonListener

=

new

OnClickListener()

{@Overridepublic

void

onClick(View

v)

{FileOutputStream

fos

=

null;try

{if

(appendBox.isChecked()){fos

=

openFileOutput(FILE_NAME,Context.MODE_APPEND);}else

{fos=openFileOutput(FILE_NAME,Context.MODE_PRIVATE);10.

}String

text

=

entryText.getText().toString();fos.write(text.getBytes());labelView.setText("文件寫入成功,寫入長度:"+text.length());entryText.setText("");}

catch

(FileNotFoundException

e)

{文件存儲e.printStackTrace();}catch

(IOException

e)

{e.printStackTrace();}finally{if

(fos

!=

null){try

{fos.flush();fos.close();}

catch

(IOException

e)

{e.printStackTrace();}}}}16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.

};文件存儲OnClickListener

readButtonListener

=

new

OnClickListener()

{@Overridepublic

void

onClick(View

v)

{displayView.setText("");FileInputStream

fis

=null;try

{fis

=openFileInput(FILE_NAME);if

(fis.available()

==

0){return;42.

}byte[]

readBytes

=

new

byte[fis.available()];while(fis.read(readBytes)

!=

-1){}String

text

=

new

String(readBytes);displayView.setText(text);labelView.setText("文件讀取成功,文件長度:"+text.length());}

catch

(FileNotFoundException

e)

{文件存儲程序運行后,在/data/data/edu.hrbeu.InternalFileDemo/files/目錄下,找到了新建立的fileDemo.txt文件50.e.printStackTrace();51.}52.catch

(IOException

e)

{53.e.printStackTrace();54.}55.}56.

};文件存儲fileDemo.txt文件fileDemo.txt從文件權限上進行分析,“-rw-rw---”表明文件僅允許文件創(chuàng)建者和同組用戶讀寫,其他用戶無權使用文件的大小為9個字節(jié),保存的數(shù)據為“Some

data”文件存儲外部存儲Android的外部存儲設備指的是SD卡(Secure

DigitalMemoryCard),是一種廣泛使用于數(shù)碼設備上的記憶卡不是所有的Android手機都有SD卡,但Android系統(tǒng)提供了對SD卡的便捷的訪問方法文件存儲SD卡適用于保存大尺寸的文件或者是一些無需設置訪問權限的文件,可以保存錄制的大容量的視頻文件和音頻文件等SD卡使用的是FAT(File

Allocation

Table)的文件系統(tǒng),不支持訪問模式和權限控制,但可以使用內部存儲器,該存儲器采用Linux文件系統(tǒng),可以設置文件訪問權限,保證文件的私密性Android模擬器支持SD卡,但模擬器中沒有缺省的SD卡,開發(fā)人員須在模擬器中手工添加SD卡的映像文件文件存儲訪問SD卡權限設置——AndroidManifest.xml1.

….

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>…文件存儲編程訪問SD卡——File類首先需要檢測系統(tǒng)的/sdcard目錄是否可用如果不可用,則說明設備中的SD卡已經被移除,在Android模擬器則表明SD卡映像沒有被正確加載如果可用,則直接通過使用標準的Java.io.File類進行訪問Java.io.FileFile(…)CreateNewFile(…)exists(…)canWrite(…)文件存儲將數(shù)據讀取/保存在SD卡——FileInput(Output)Stream通過“生產隨機數(shù)列”按鈕生產10個隨機小數(shù)通過“寫入SD卡”按鈕將生產的數(shù)據保存在SD卡的目錄下SDcardFileDemo示例說明了如何將數(shù)據保存在SD卡Java.io.FileFileInputStreamread()close()FileOutputStreamwrite()flush()close()文件存儲下圖是SDcardFileDemo示例的用戶界面文件存儲SDcardFileDemo示例運行后,在每次點擊“寫入SD卡”按鈕后,都會在SD卡中生產一個新文件,文件名各不相同SD卡中生產的文件文件存儲SDcardFileDemo示例與InternalFileDemo示例的核心代碼比較相似SDcardFileDemo示例與InternalFileDemo示例的不同之處第7行代碼中添加了/sdcard目錄存在性檢查第8行代碼使用“絕對目錄+文件名”的形式表示新建立的文件第12行代碼寫入文件前對文件存在性和可寫入性進行檢查第5行代碼為了保證在SD卡中多次寫入時文件名不會重復,在文件名中使用了唯一且不重復的標識,這個標識通過調用System.currentTimeMillis()函數(shù)獲得,表示從1970年00:00:00到當前所經過的毫秒數(shù)文件存儲下面是SDcardFileDemo示例的核心代碼OnClickListener

writeButtonListener

=

new

OnClickListener(){@Overridepublic

void

onClick(View

v)

{String

fileName

=

"SdcardFile-"+System.currentTimeMillis()+".txt";File

dir

=

newFile("/sdcard/");if(dir.exists()

&&dir.canWrite())

{File

newFile

=

new

File(dir.getAbsolutePath()

+

"/"

+fileName);FileOutputStream

fos

=

null;displayView.setText(randomNumbersString); //顯示隨機數(shù)private

static

String

randomNumbersString

=

"";OnClickListener

randomGetButtonListener

=

new

OnClickListener()

{@Overridepublic

void

onClick(View

v)

{randomNumbersString=String.valueOf(Math.random());//產生隨機數(shù)

6.7.

}8.

});文件存儲try

{newFile.createNewFile();3.if

(newFile.exists()

&&

newFile.canWrite())

{4.fos

=newFileOutputStream(newFile);5.fos.write(randomNumbersString.getBytes());15.labelView.setText(fileName+"文件寫入SD卡");16.}17.}

catch

(IOException

e)

{18.e.printStackTrace();19.}

finally

{20.if

(fos

!=

null)

{21.try{22.fos.flush();23.fos.close();24.}25.catch

(IOExceptione){

}26.}27.}28.}29.30.

};}文件存儲資源文件程序開發(fā)人員可以將程序開發(fā)階段已經準備好的原始格式文件和XML文件分別存放在/res/raw和/res/xml目錄下,供應用程序在運行時進行訪問原始格式文件可以是任何格式的文件,例如視頻格式文件、音頻格式文件、圖像文件和數(shù)據文件等等,在應用程序編譯和打包時,/res/raw目錄下的所有文件都會保留原有格式不變/res/xml目錄下的XML文件,一般用來保存格式化的數(shù)據,在應用程序編譯和打包時會將XML文件轉換為高效的二進制格式,應用程序運行時會以特殊的方式進行訪問文件存儲原始格式資源文件(raw)讀取ResourceInputStreamthis.getResources();openRawResource();read()close()文件存儲ResourceFileDemo示例演示了如何在程序運行時訪問資源文件當用戶點擊“讀取原始文件”按鈕時,程序將讀取/res/raw/raw_file.txt文件,并將內容顯示在界面上文件存儲下面是ResourceFileDemo示例的核心代碼final

Resources

resource

=

this.getResources();button1.setOnClickListener(new

View.OnClickListener()

{@Overridepublic

void

onClick(View

v)

{//

TODO

Auto-generated

method

stubtry

{InputStream

inputStream

=

resource.openRawResource(R.raw.raw_file);byte

[]

reader

=

new

byte[inputStream.available()];while(inputStream.read(reader)

!=

-1)10. {

}textView02.setText(new

String(reader,

“utf-8”));inputStream.close();……文件存儲讀取原始格式文件,首先需要調用getResource()函數(shù)獲得資源對象,然后通過調用資源對象的

openRawResource()函數(shù),以二進制流的形式打開指定的原始格式文件。在讀取文件結束后,調用close()函數(shù)關閉文件流ResourceFileDemo示例中關于讀取原始格式文件的核心代碼如下Resources

resources

=

this.getResources();InputStream

inputStream

=null;try

{inputStream

=

resources.openRawResource(R.raw.raw_file);byte[]

reader

=newbyte[inputStream.available()];while

(inputStream.read(reader)

!=-1)

{}文件存儲labelView.setText(new

String(reader,"utf-8"));}

catch

(IOException

e)

{Log.e("ResourceFileDemo",

e.getMessage(),

e);}

finally

{if

(inputStream

!=

null)

{try

{inputStream.close();15.

}catch

(IOExceptione){

}}18.

}代碼第8行的new

String(reader,"utf-8"),表示以UTF-8的編碼方式,從字節(jié)數(shù)組中實例化一個字符串程序開發(fā)人員需要確定/res/raw/raw_file.txt文件使用的是UTF-8編碼方式,否則程序運行時會產生亂碼文件存儲確認的方法右擊raw_file.txt文件選擇“Properties”打開raw_file.txt文件的屬性設置框在Resource欄下的Text

file

encoding中,選擇“Other:UTF-8”文件存儲當用戶點擊“讀取XML文件”按鈕時,程序將讀取/res/xml/people.xml文件,并將內容顯示在界面上文件存儲/res/xml目錄下的XML文件會轉換為一種高效的二進制格式說明如何在程序運行時讀取/res/xml目錄下的XML文件首先在/res/xml目錄下創(chuàng)建一個名為people.xml的文件XML文件定義了多個<person>元素,每個<person>元素都包含三個屬性name、age和height,分別表示姓名、年齡和身高/res/xml/people.xml文件代碼如下<people><person

name="李某某"age="21"

height="1.81"/><person

name="王某某"age="25"

height="1.76"/><person

name="張某某"age="20"

height="1.69"/></people>根節(jié)點名稱屬性一條元素文件存儲讀取XML格式文件ResourceXmlPullParserthis.getResources();getXml();next()getName()getAttrCount()getAttrName()getAttrValue()屬性元素名稱下一個文件存儲讀取XML格式文件首先通過調用資源對象的getXml()函數(shù),獲取到XML解析器XmlPullParserXmlPullParser是Android平臺標準的XML解析器,這項技術來自一個開源的XML解析API項目XMLPULLResourceFileDemo示例中關于讀取XML文件的核心代碼如下XmlPullParser

parser

=

resources.getXml(R.xml.people);String

msg

=

"";try

{while

(parser.next()

!=

XmlPullParser.END_DOCUMENT)

{String

people=

parser.getName();String

name

=

null;文件存儲7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.String

age

=null;String

height

=

null;if

((people

!=

null)

&&

people.equals("person"))

{int

count=parser.getAttributeCount();for

(int

i

=0;i

<count;

i++){String

attrName

=

parser.getAttributeName(i);String

attrValue

=

parser.getAttributeValue(i);if

((attrName

!=null)

&&

attrName.equals("name"))

{name

=attrValue;}else

if

((attrName

!=null)

&&

attrName.equals("age"))

{age

=attrValue;}else

if

((attrName

!=null)

&&

attrName.equals("height"))

{height=attrValue;}}if

((name

!=

null)

&&

(age

!=

null)

&&

(height

!=

null))

{msg+="姓名:"+name+",年齡:"+age+",身高:"+height+"\n";文件存儲}}24.25.26.}}

catch

(Exceptione){Log.e("ResourceFileDemo",

e.getMessage(),

e);29.

}displayView.setText(msg);第1行代碼通過資源對象的getXml()函數(shù)獲取到XML解析器第4行代碼的parser.next()方法可以獲取到高等級的解析事件,并通過對比確定事件類型第5行代碼使用getName()函數(shù)獲得元素的名稱第10行代碼使用getAttributeCount()函數(shù)獲取元素的屬性數(shù)量文件存儲第12行代碼通過getAttributeName()函數(shù)得到屬性名稱第14行到第19行代碼通過分析屬性名獲取到正確的屬性值第23行代碼將屬性值整理成需要顯示的信息XmlPullParser的XML事件類型事件類型說明START_TAG讀取到標簽開始標志TEXT讀取文本內容END_TAG讀取到標簽結束標志END_DOCUMENT文檔末尾數(shù)據庫存儲SQLite數(shù)據庫SQLite是一個開源的嵌入式關系數(shù)據庫,在2000年由D.Richard

Hipp發(fā)布SQLite數(shù)據庫特點更加適用于嵌入式系統(tǒng),嵌入到使用它的應用程序中占用資源非常少,運行高效可靠,可移植性好提供了零配置(zero-configuration)運行模式SQLite數(shù)據庫易用性:不僅提高了運行效率,而且屏蔽了數(shù)據庫使用和管理的復雜性,程序僅需要進行最基本的數(shù)據操作,其他操作可以交給進程內部的數(shù)據庫引擎完成數(shù)據庫存儲SQLite數(shù)據庫采用了模塊化設計,由8個獨立的模塊構成,這些獨立模塊又構成了三個主要的子系統(tǒng),模塊將復雜的查詢過程分解為細小的工作進行處理數(shù)據庫存儲接口由SQLiteC

API組成,因此無論是應用程序、腳本,還是庫文件,最終都是通過接口與SQLite交互編譯器由分詞器和分析器組成分詞器和分析器對SQL語句進行語法檢查,然后把SQL語句轉化為底層能更方便處理的分層的數(shù)據結構,這種分層的數(shù)據結構稱為“語法樹”把語法樹傳給代碼生成器進行處理,生成一種針對SQLite的匯編代碼最后由虛擬機執(zhí)行數(shù)據庫存儲虛擬機SQLite數(shù)據庫體系結構中最核心的部分是虛擬機,也稱為虛擬數(shù)據庫引擎(Virtual

Database

Engine,VDBE)與Java虛擬機相似,虛擬數(shù)據庫引擎用來解釋執(zhí)行字節(jié)代碼虛擬數(shù)據庫引擎的字節(jié)代碼由128個操作碼構成,這些操作碼主要用以對數(shù)據庫進行操作,每一條指令都可以完成特定的數(shù)據庫操作,或以特定的方式處理棧的內容數(shù)據庫存儲后端后端由B-樹、頁緩存和操作系統(tǒng)接口構成B-樹的主要功能就是索引,它維護著各個頁面之間的復雜的關系,便于快速找到所需數(shù)據頁緩存的主要作用就是通過操作系統(tǒng)接口在B-樹和磁盤之間傳遞頁面B-樹和頁緩存共同對數(shù)據進行管理數(shù)據庫存儲SQLite數(shù)據庫具有很強的移植性,可以運行在Windows,Linux,BSD,Mac

OS

X和一些商用Unix系統(tǒng),比如

Sun的Solaris,IBM的AIXSQLite數(shù)據庫也可以工作在許多嵌入式操作系統(tǒng)下,例如QNX,VxWorks,Palm

OS,Symbin和Windows

CESQLite的核心大約有3萬行標準C代碼,模塊化的設計使這些代碼更加易于理解數(shù)據庫存儲數(shù)據庫表(屬性)數(shù)據創(chuàng)建 創(chuàng)建打開 打開操作插入刪除更新查詢…數(shù)據庫概念回顧:Android數(shù)據庫操作手工操作代碼操作數(shù)據庫存儲手動建庫使用sqlite3工具,通過命令行完成數(shù)據庫的建立過程sqlite3是SQLite數(shù)據庫自帶的一個基于命令行的SQL命令執(zhí)行工具,并可以顯示命令執(zhí)行結果啟動sqlite3工具:sqlite3工具被集成在Android系統(tǒng)中,用戶在Linux的命令行界面中輸入sqlite3啟動Linux的命令行界面:CMD中輸入adb

shell命令啟動sqlite3工具:輸入sqlite3#sqlite3SQLite

versionEnter

“.help”

for

instructionssqlite>數(shù)據庫存儲正確退出sqlite3工具的方法是使用.exit命令原則上,每個應用程序的數(shù)據庫都保存在各自的/data/data/<packagename>/databases目錄下,但如果使用手工方式建立數(shù)據庫,則必須手工建立數(shù)據庫目錄,目前版本無須修改數(shù)據庫目錄的權限sqlite>

.exit#rootsystem2009-07-18

15:43

databases2009-07-1815:31

lib#mkdir

databases#ls

–ldrwxrwxrwx

rootdrwxr-xr-x

system#數(shù)據庫存儲在SQLite數(shù)據庫中,每個數(shù)據庫保存在一個獨立的文件中,使用sqlite3工具后加文件名的方式打開數(shù)據庫文件,如果指定文件不存在,sqlite3工具則自動創(chuàng)建新文件下面的代碼將創(chuàng)建名為people的數(shù)據庫,在文件系統(tǒng)中將產生一個名為people.db的數(shù)據庫文件#sqlite3

people.dbSQLite

versionEnter

“.help”

for

instructionssqlite>數(shù)據庫存儲創(chuàng)建數(shù)據庫:create

table命令下面的代碼在新創(chuàng)建的數(shù)據庫中,構造了一個名為peopleinfo的表,關系模式為peopleinfo(_id,name,age,height)表包含四個屬性,_id是整型的主鍵;name表示姓名,字符型,notnull表示這個屬性一定要填寫,不可以為空值;age表示年齡,整數(shù)型;height表示身高,浮點型sqlite>

create

table

peopleinfo...>

(_idinteger

primary

keyautoincrement,...>

name

text

not

null,...>

age

integer,...>

height

float);sqlite>數(shù)據庫存儲為了確認數(shù)據表是否創(chuàng)建成功,可以使用.tables命令,顯示當前數(shù)據庫中的所有表從下面的代碼中可以觀察到,當前數(shù)據庫僅有一個名為peopleinfo的表當然,也可以使用.schema命令查看建立表時使用的

SQL命令。如果當前數(shù)據庫中包含多個表,則可以使用

[.schema表名]的形式,顯示指定表的建立命令sqlite>

.tablespoepleinfosqlite>sqlite>.schemaCREATE

TABLE

peopleinfo

(_id

integer

primary

keyautoincrement,name

text

not

null,

age

integer,

height

float);sqlite>數(shù)據庫存儲添加數(shù)據,使用insert

into…values命令代碼運行成功后,數(shù)據庫的peopleinfo表將有三條數(shù)據。因為_id是自增加的主鍵,因此在輸入null后,SQLite數(shù)據庫會自動填寫該項的內容sqlite>

insert

intopeopleinfo

values(null,'Tom',21,1.81);sqlite>

insert

intopeopleinfo

values(null,'Jim',22,1.78);sqlite>

insert

intopeopleinfo

values(null,'Lily',19,1.68);_idnameageheight1Tom211.812Jim221.783Lily191.68數(shù)據庫存儲Select命令:顯示指定數(shù)據表中的所有數(shù)據信息,命令格式為:[select

屬性from

表名]select*

frompeopleinfo;1|Tom|21|1.812|Jim|22|1.783|Lily|19|1.68sqlite>數(shù)據庫存儲mode命令:將結果輸出格式更改為“表格”方式mode命令除了支持常見的column格式為,還支持csv格式、html格式、insert格式、line格式、list格式、tabs格式和tcl格式sqlite>

.mode

columnsqlite>select

*

from

peopleinfo;3.

1Tom211.814.

2Jim221.785.

3Lily191.686.

sqlite>數(shù)據庫存儲更新數(shù)據——update命令:命令格式為[update

表名set

屬性=“新值”where條件]更新數(shù)據后,同樣使用select命令顯示數(shù)據,則可以確定數(shù)據是否正確更新下面的代碼將姓名為Lily數(shù)據中的高度值更新為1.88sqlite>update

peopleinfosetheight=1.88

where

name="Lily";sqlite>select

*

from

peopleinfo;select*

frompeopleinfo;4.

1Tom211.815.

2Jim221.786.

3Lily191.887.

sqlite>數(shù)據庫存儲delete命令:刪除數(shù)據可以使用命令格式:[delete

from

表名where

條件]下面的代碼將_id為3數(shù)據從表peopleinfo中刪除TomJim21221.811.78sqlite>deletefrom

peopleinfowhere

_id=3;sqlite>select

*

from

peopleinfo;select*

frompeopleinfo;12sqlite>數(shù)據庫存儲sqlite3工具還支持大量的命令,可以使用.help命令查詢

sqlite3的命令列表編號命令說明1.bail

ON|OFF遇到錯誤時停止,缺省為OFF2.databases顯示數(shù)據庫名稱和文件位置3.dump

?TABLE?

...將數(shù)據庫以SQL文本形式導出4.echo

ON|OFF開啟和關閉回顯5.exit退出6.explain

ON|OFF開啟或關閉適當輸出模式,如果開啟模式將更改為column,并自動設置寬度數(shù)據庫存儲編號命令說明7.header(s)

ON|OFF開啟或關閉標題顯示8.help顯示幫助信息9.import

FILE

TABLE將數(shù)據從文件導入表中10.indices

TABLE顯示表中所的列名11.load

FILE

?ENTRY?導入擴展庫12.mode

MODE?TABLE?設置輸入格式13.nullvalue

STRING打印時使用STRING代替NULL14.output

FILENAME將輸入保存到文件15.output

stdout將輸入顯示在屏幕上16.prompt

MAINCONTINUE替換標準提示符數(shù)據庫存儲編號命令說明17.quit退出18.read

FILENAME在文件中執(zhí)行SQL語句19.schema?TABLE?顯示表的創(chuàng)建語句20.separator

STRING更改輸入和導入的分隔符21.show顯示當前設置變量值22.tables

?PATTERN?顯示符合匹配模式的表名23.timeout

MS嘗試打開被鎖定的表MS毫秒24.timer

ON|OFF開啟或關閉CPU計時器25.width

NUM

NUM

...設置column模式的寬度數(shù)據庫存儲添加、更查詢新、刪除和等操作AppDBAdapterSQLiteDatabaseSQLiteOpenHelper打開/創(chuàng)建操作代碼建庫在代碼中動態(tài)建立數(shù)據庫是比較常用的方法在程序運行過程中,當需要進行數(shù)據庫操作時,應用程序會首先嘗試打開數(shù)據庫,此時如果數(shù)據庫并不存在,程序則會自動建立數(shù)據庫,然后再打開數(shù)據庫在編程實現(xiàn)時,一般將所有對數(shù)據庫的操作都封裝在一個類中,因此只要調用這個類,就可以完成對ge數(shù)tWri據tabl庫eDa的tabasegetReadableDatabase添加刪除查詢更新ContentValuesCursor數(shù)據庫存儲SQLiteDemo是對數(shù)據庫操作的一個示例ContentValues多條數(shù)據處理單條數(shù)據處理輸入輸出操作數(shù)據庫存儲下面內容是DBAdapter類的部分代碼,封裝了數(shù)據庫的建立、打開和關閉數(shù)據庫及數(shù)據庫各種操作1. public

class

DBAdapter

{private

staticfinal

String

DB_NAME

=

"people.db";private

static

finalString

DB_TABLE

=

"peopleinfo";private

static

finalint

DB_VERSION

=

1;public

static

finalString

KEY_ID

=

"_id";public

static

final

String

KEY_NAME

=

"name";public

static

final

String

KEY_AGE

=

"age";public

staticfinal

String

KEY_HEIGHT

=

"height";2.3.4.5.6.7.8.9.10.11.private

Context

context;12.13.private

SQLiteDatabase

db;private

DBOpenHelper

dbOpenHelper;數(shù)據庫名表名版本號屬性數(shù)據庫基本信息數(shù)據庫類數(shù)據庫打開幫助類數(shù)據庫存儲private

static

class

DBOpenHelper

extends

SQLiteOpenHelper

{}public

DBAdapter(Context

_context)

{context

=_context;}14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.//利用SQLiteOpenHelper打開數(shù)據庫public

voidopen()

throws

SQLiteException

{dbOpenHelper

=

new

DBOpenHelper(context,

DB_NAME,

null,

DB_VERSION);try

{db=dbOpenHelper.getWritableDatabase();}catch

(SQLiteException

ex)

{db=dbOpenHelper.getReadableDatabase();}}30.publicvoid

close()

{//關閉數(shù)據庫31.if

(db

!=null){32.db.close();33.db=null;34.}35.}36.

}數(shù)據庫存儲從代碼的第2行到第9行可以看出,在DBAdapter類中首先聲明了數(shù)據庫的基本信息,包括數(shù)據庫文件的名稱、數(shù)據庫表格名稱和數(shù)據庫版本,以及數(shù)據庫表中的屬性名稱從這些基本信息上不難發(fā)現(xiàn),這個數(shù)據庫與前一小節(jié)手動建立的數(shù)據庫是完全相同的數(shù)據庫存儲第11行代碼聲明了SQLiteDatabase對象db。SQLiteDatabase類封裝了非常多的方法,用以建立、刪除數(shù)據庫,執(zhí)行SQL命令,對數(shù)據進行管理等工作第13行代碼聲明了一個非常重要的幫助類

SQLiteOpenHelper,這個幫助類可以輔助建立、更新和打開數(shù)據庫第21行代碼定義了open()函數(shù)用來打開數(shù)據庫,但open()函數(shù)中并沒有任何對數(shù)據庫進行實際操作的代碼,而是調用了SQLiteOpenHelper::getWritableDatabase()函數(shù)和

getReadableDatabase()函數(shù)。這個兩個函數(shù)會根據數(shù)據庫是否存在、版本號和是否可寫等情況,決定在返回數(shù)據庫對象前,是否需要建立數(shù)據庫數(shù)據庫存儲在代碼第30行的close()函數(shù)中,調用了SQLiteDatabase對象的close()方法關閉數(shù)據庫。這是上面的代碼中,唯一的一個地方直接調用了SQLiteDatabase對象的方法SQLiteDatabase中也封裝了打開數(shù)據庫的函數(shù)

openDatabases()和創(chuàng)建數(shù)據庫函數(shù)

openOrCreateDatabases(),因為代碼中使用了幫助類

SQLiteOpenHelper,從而避免直接調用SQLiteDatabase中的打開和創(chuàng)建數(shù)據庫的方法,簡化了數(shù)據庫打開過程中繁瑣的邏輯判斷過程代碼第15行實現(xiàn)了內部靜態(tài)類DBOpenHelper,繼承了幫助類SQLiteOpenHelper數(shù)據庫存儲重載了onCreate()函數(shù)和onUpgrade()函數(shù)的代碼如下private

static

class

DBOpenHelper

extends

SQLiteOpenHelper

{public

DBOpenHelper(Context

context,

String

name,

CursorFactory

factory,

int

version){super(context,

name,

factory,

version);}private

static

final

String

DB_CREATE

=

"create

table"

+6.7.DB_TABLE

+

"

("

+

KEY_ID

+

"

integer

primary

key

autoincrement,

"

+KEY_NAME+

"

text

not

null,

"

+

KEY_AGE+

"

integer,"

+

KEY_HEIGHT

+

"float);";8.@Overridepublicvoid

onCreate(SQLiteDatabase

_db){_db.execSQL(DB_CREATE);}13.“創(chuàng)建表”命令的組成執(zhí)行命令數(shù)據庫存儲第5行到第7行代碼的是創(chuàng)建表的SQL命令第10行和第15行代碼分別重載了onCreate()函數(shù)和

onUpgrade()函數(shù),這是繼承SQLiteOpenHelper類必須重載的兩個函數(shù)。onCreate()函數(shù)在數(shù)據庫第一次建立時被調用,一般用來用來創(chuàng)建數(shù)據庫中的表,并做適當?shù)某跏蓟ぷ鰼Overridepublic

void

onUpgrade(SQLiteDatabase

_db,

int

_oldVersion,

int

_newVersion)

{_db.execSQL("DROP

TABLE

IF

EXISTS

"

+

DB_TABLE);onCreate(_db);}14.15.16.17.18.19.

}數(shù)據庫存儲在代碼第11行中,通過調用SQLiteDatabase對象的

execSQL()方法,執(zhí)行創(chuàng)建表的SQL命令。onUpgrade()函數(shù)在數(shù)據庫需要升級時被調用,一般用來刪除舊的數(shù)據庫表,并將數(shù)據轉移到新版本的數(shù)據庫表中第16行和第17行代碼中,為了簡單起見,并沒有做任何的的數(shù)據轉移,而僅僅刪除原有的表后建立新的數(shù)據庫表數(shù)據庫存儲程序開發(fā)人員不應直接調用onCreate()和onUpgrade()函數(shù),而應該由SQLiteOpenHelper類來決定何時調用這兩個函數(shù)SQLiteOpenHelper類的getWritableDatabase()函數(shù)和

getReadableDatabase()函數(shù)是可以直接調用的函數(shù)getWritableDataba

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論