版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 世界糧食日珍惜節(jié)約糧食主題66
- 戒毒管理知識培訓課件
- 2023年多路信號老化檢測系統(tǒng)項目構思建設方案
- 2023年高檔生物顯微鏡項目建設總綱及方案
- 貴州工程應用技術學院《行政法原理》2023-2024學年第一學期期末試卷
- 創(chuàng)意繪畫教學講座
- 2024版互惠共贏戰(zhàn)略合作協(xié)議一
- 2024設計院項目并購與股權收購及經營合作協(xié)議3篇
- 二零二五年度房產交易稅費籌劃服務協(xié)議范本6篇
- 2024銑刨機租賃與道路銑刨施工成本控制協(xié)議3篇
- 2024-2025學年北京房山區(qū)初三(上)期末英語試卷
- 2024年三年級英語教學工作總結(修改)
- 咖啡廳店面轉讓協(xié)議書
- 期末(試題)-2024-2025學年人教PEP版英語六年級上冊
- 鮮奶購銷合同模板
- 申論公務員考試試題與參考答案(2024年)
- DB4101T 9.1-2023 反恐怖防范管理規(guī)范 第1部分:通則
- 2024-2030年中國公安信息化建設與IT應用行業(yè)競爭策略及投資模式分析報告
- 2024年加油站場地出租協(xié)議
- 產品生命周期曲線(高清)
- 機械工程學報標準格式
評論
0/150
提交評論