版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
什么是3G3G,全稱(chēng)為3rdGeneration,中文含義就是指第三代數(shù)字通信。所謂3G,是指將無(wú)線(xiàn)通信與國(guó)際互聯(lián)網(wǎng)等多媒體通信結(jié)合的新一代移動(dòng)通信系統(tǒng)。
3G只是一種通信技術(shù)標(biāo)準(zhǔn),符合這個(gè)標(biāo)準(zhǔn)的技術(shù)有WCDMA、CDMA2000、TD-SCDMA三種無(wú)線(xiàn)接口標(biāo)準(zhǔn)。中國(guó)聯(lián)通使用的是WCDMA(世界上大部分3G網(wǎng)絡(luò)都采用的是該標(biāo)準(zhǔn))
中國(guó)電信使用的是CDMA2000(日、韓和北美使用);中國(guó)移動(dòng)使用的是具有自主知識(shí)產(chǎn)權(quán)的TD-SCDMA(只有中國(guó)才使用)。相對(duì)第一代模擬制式手機(jī)(1G)和第二代GSM、CDMA等數(shù)字手機(jī)(2G),3G手機(jī)能處理圖像、音樂(lè)、視頻等多種媒體形式,提供包括網(wǎng)頁(yè)瀏覽、電話(huà)會(huì)議、電子商務(wù)等多種信息服務(wù)。3G網(wǎng)絡(luò)與前兩代的主要區(qū)別是在傳輸聲音和數(shù)據(jù)的速度上有很大的提升。目前中國(guó)正在建設(shè)3G網(wǎng)絡(luò),大城市的3G網(wǎng)絡(luò)基本上已經(jīng)鋪設(shè)好,像北京鋪設(shè)好了超過(guò)4000個(gè)基站,深圳鋪設(shè)了1000多個(gè)基站。但是要全民普及到3G手機(jī)尚且需要幾年時(shí)間?,F(xiàn)在,大家使用的手機(jī)大多還是2.5G手機(jī),符合2.5G網(wǎng)絡(luò)的接口標(biāo)準(zhǔn)有CDMA20001X和GPRS,中國(guó)聯(lián)通使用的是CDMA20001X標(biāo)準(zhǔn),中國(guó)移動(dòng)使用的是GPRS標(biāo)準(zhǔn)。目前,我們可以把2.5G移動(dòng)通信技術(shù)看作是2G邁向3G的銜接性技術(shù),在2.5G網(wǎng)絡(luò)下出現(xiàn)了如WAP、藍(lán)牙(Bluetoot)等技術(shù)。對(duì)于2.5G網(wǎng)絡(luò),我們應(yīng)該也要有所了解,因?yàn)橐院蟠蠹业狡髽I(yè)中有可能會(huì)面對(duì)2.5G網(wǎng)絡(luò)下的應(yīng)用,如:wap項(xiàng)目。
什么是AndroidAndroid是Google在2007年11月5日推出的開(kāi)源手機(jī)操作系統(tǒng)。目前Android在中國(guó)的發(fā)展是非?;鸬模瑸榱斯?jié)省研發(fā)費(fèi)用,國(guó)內(nèi)很多的手機(jī)廠商和移動(dòng)運(yùn)營(yíng)商紛紛加入到了android陣營(yíng),其中包括中國(guó)移動(dòng),中國(guó)聯(lián)通,中國(guó)電信,華為,聯(lián)想等大企業(yè)。在中國(guó)不管是知名的手機(jī)生產(chǎn)廠商還是山寨手機(jī)廠商,都已經(jīng)開(kāi)始生產(chǎn)Android操作系統(tǒng)的手機(jī)。另外android應(yīng)用的范圍不僅僅在手機(jī),還被應(yīng)用在汽車(chē)、平板電腦、和智能上網(wǎng)設(shè)備上,聽(tīng)說(shuō)國(guó)外已經(jīng)有了安裝有Android系統(tǒng),并且能夠上網(wǎng)的智能電飯煲,用戶(hù)在千里之外就可以操作電飯煲進(jìn)行煮飯。由于大家大多使用的手機(jī)都屬傻瓜手機(jī),也就是打打電話(huà)、發(fā)發(fā)短信。從今天開(kāi)始,大家就應(yīng)該改變這個(gè)觀念了,你們需要把智能手機(jī)看作是一臺(tái)電腦,它能完成電腦所能完成的一切。所以你可以像在電腦一樣,在智能手機(jī)上安裝軟件,以滿(mǎn)足你工作和生活的需要。
Android的升級(jí)Android系統(tǒng)今后將繼續(xù)每半年一次的升級(jí)步伐,分別定在每年的夏天和年終。每代Android系統(tǒng)都將以甜點(diǎn)命名.比如:1.5版叫做Cupcake(紙杯蛋糕)1.6版為Donut(甜甜圈)2.1版的éclair(閃電泡芙,一種法式奶油夾心甜點(diǎn)),此版本曾被叫做Flan“水果餡餅”,之后是2.2版的Froyo(凍酸奶)2.3版的Gingerbread(姜餅).添加了sip通話(huà)的支持,在省電上下了功夫,做成了黑色主題3.0版的Honeycomb(蜂巢)主要是針對(duì)平板電腦,為平板和手機(jī)的整合做準(zhǔn)備,有了對(duì)設(shè)備的判斷開(kāi)關(guān)4.0版的IcecreamSandWich(簡(jiǎn)稱(chēng)ics,冰激凌三明治)
統(tǒng)一版本,電視手機(jī)平板融合以CDEFG字頭順序排列.Donut將把社交網(wǎng)絡(luò)功能作為升級(jí)重點(diǎn),在"手機(jī)的各種體驗(yàn)中"都增加社交網(wǎng)絡(luò)元素[7].對(duì)手機(jī)業(yè)界的影響已經(jīng)與HTC、NTTDoCoMo、KDDI、Motorola等世界通信領(lǐng)域34家公司于免費(fèi)提供達(dá)成一致。今后對(duì)于移動(dòng)通信的影響勢(shì)必會(huì)進(jìn)一步體現(xiàn)出來(lái)。但是如此廣泛公司的同盟是否能夠有效運(yùn)作及以持久值得拭目以待。
智能手機(jī)軟件平臺(tái)智能手機(jī)軟件平臺(tái)有:SymbianWindowsMobileRIMBlackBerryAndroidiPhone
Java/J2ME
Android的未來(lái)android和自身-消費(fèi)市場(chǎng)的開(kāi)源挑戰(zhàn)Android的最大的挑戰(zhàn)是開(kāi)源,android可能永遠(yuǎn)是開(kāi)源項(xiàng)目,為了成功必須要銷(xiāo)售數(shù)百萬(wàn)臺(tái),它不是第一個(gè)開(kāi)源手機(jī),但是google領(lǐng)銜移動(dòng)市場(chǎng)的開(kāi)始.
開(kāi)源是雙刃劍,有著大量的人才和公司資源.但另一方面,代碼不集中,就像分裂的linux一樣.但是google也有他自己給予開(kāi)發(fā)商的約束:cts測(cè)試這是google程序員自己編寫(xiě)的測(cè)試case.其目的就是不讓我們的開(kāi)發(fā)商對(duì)代碼的結(jié)構(gòu)做太大變化的修改,如果說(shuō)測(cè)試case不能通過(guò),那么我們的這個(gè)操作系統(tǒng)就無(wú)法得到google的認(rèn)證.授權(quán)android
android以?xún)煞N不同的開(kāi)源許可發(fā)布.linux內(nèi)核是GPL發(fā)布,開(kāi)源os需要該授權(quán).android平臺(tái)(不含內(nèi)核)由apache發(fā)布.兩種發(fā)布模式都是開(kāi)源為主,不同是后者面向商業(yè)用途.
Android體系結(jié)構(gòu)
Dalvikvm和jvm的比較區(qū)別jvmdalvikvm優(yōu)點(diǎn)編譯后文件格式.java->.class->.jar.java->.class->.dex->.odex在編譯時(shí)優(yōu)化代碼,而不是在運(yùn)行時(shí),將多個(gè)文件整合成一個(gè),整體減少文件個(gè)數(shù)i/o操作,提高類(lèi)查詢(xún)的速度,常量池的引入字節(jié)碼格式零字節(jié)地址格式二/三地址的混合形式
執(zhí)行的效率要高些,成操作需要更多的load/store指令(指令分配次數(shù)和內(nèi)存訪(fǎng)問(wèn)次數(shù)),二/三地址占內(nèi)存多些,但操作更少,訪(fǎng)問(wèn)內(nèi)存執(zhí)行數(shù)度是一個(gè)瓶頸基于的架構(gòu)基于棧的架構(gòu)基于寄存器的架構(gòu)
JdkjavacSdkdex
如何安裝AndroidSDK和Eclipse插件所需開(kāi)發(fā)環(huán)境:JDK5或以上版本(僅有JRE不夠)、Eclipse3.6
或以上版本下載用于在Eclipse開(kāi)發(fā)android應(yīng)用的ADT插件在企業(yè)開(kāi)發(fā)中,很多程序員使用EclipseIDE作為應(yīng)用的開(kāi)發(fā)環(huán)境。為了使得Android應(yīng)用的創(chuàng)建,運(yùn)行和調(diào)試更加方便快捷。Android的開(kāi)發(fā)團(tuán)隊(duì)專(zhuān)門(mén)針對(duì)EclipseIDE定制了一個(gè)插件:AndroidDevelopmentTools(ADT)
下載地址:/android/ADT-15.0.1.zip安裝Eclipse插件(ADT)啟動(dòng)Eclipse,選擇Help>InstallNewSoftware,在出現(xiàn)的對(duì)話(huà)框里,點(diǎn)擊Add按鈕,在對(duì)話(huà)框的name一欄輸入“ADT”,然后點(diǎn)擊Archive...,瀏覽和選擇已經(jīng)下載的ADT插件壓縮文件。點(diǎn)擊OK.。返回可用軟件的視圖,你會(huì)看到這個(gè)插件,然后選擇DeveloperTools(會(huì)選中下面的“AndroidDeveloperTools”和“AndroidEditors“),點(diǎn)擊Next,最后重啟Eclipse。下載安裝AndroidSDK:AndroidSDK包含了開(kāi)發(fā)Android應(yīng)用所依賴(lài)的jar文件、運(yùn)行環(huán)境及相關(guān)工具。下載地址:
/android/android-sdk_r07-windows.zip
/android/installer_r15-windows.exe下載完SDK后,把.zip文件解壓到你電腦上合適位置。啟動(dòng)Eclipse,選擇window->preferences,在打開(kāi)的視圖左邊點(diǎn)擊android,在右邊的SDKLocation中選擇AndroidSDK所在位置。
如何安裝AndroidSDK和Eclipse插件
開(kāi)發(fā)第一個(gè)Android應(yīng)用打開(kāi)Eclipse,新建項(xiàng)目(點(diǎn)擊FileNewProject),在項(xiàng)目列表中展開(kāi)Android目錄,選擇AndroidProject,如下圖:
開(kāi)發(fā)第一個(gè)Android應(yīng)用
開(kāi)發(fā)第一個(gè)Android應(yīng)用點(diǎn)擊”finish”即可完成項(xiàng)目的創(chuàng)建,創(chuàng)建后的項(xiàng)目已經(jīng)是一個(gè)可運(yùn)行的Android應(yīng)用,我們可以通過(guò)下面方式運(yùn)行此應(yīng)用:點(diǎn)擊工具欄上機(jī)器人形狀的虛擬設(shè)備管理器(簡(jiǎn)稱(chēng)“AVD“),如下:
開(kāi)發(fā)第一個(gè)Android應(yīng)用在打開(kāi)的虛擬設(shè)備管理器中創(chuàng)建一個(gè)虛擬手機(jī):
開(kāi)發(fā)第一個(gè)Android應(yīng)用在項(xiàng)目上右鍵點(diǎn)擊runasAndroidapplication,如下圖:
Android模擬器無(wú)法啟動(dòng)原因:Android_SDK_HOME環(huán)境變量沒(méi)有設(shè)置。每當(dāng)有一個(gè)新的AVD被創(chuàng)建,AndroidSDKandAVDManager都會(huì)在“我的文檔”路徑下的.android/avd文件夾創(chuàng)建對(duì)應(yīng)的avd文件夾(my_avd.avd)及配置文件(my_avd.ini);同時(shí),當(dāng)你啟動(dòng)一個(gè)AVD時(shí),Eclipse或者AndroidSDKandAVDManager就會(huì)去ANDROID_SDK_HOME對(duì)應(yīng)的路徑下去查找AVD文件,并啟動(dòng)AVD。當(dāng)Android_SDK_HOME環(huán)境變量沒(méi)有設(shè)置時(shí),AndroidSDKandAVDManager會(huì)在當(dāng)前用戶(hù)的“我的文檔”下創(chuàng)建.android/avd文件夾,并創(chuàng)建對(duì)應(yīng)的avd文件夾(my_avd.avd)及配置文件(my_avd.ini)。而當(dāng)你通過(guò)Eclipse或AndroidSDKandAVDManager啟動(dòng)AVD時(shí),AndroidSDKandAVDManager卻會(huì)去Windows默認(rèn)的“我的文檔”路徑(C:\DocumentsandSettings\user\MyDocuments)去查找AVD文件因此,沒(méi)有設(shè)置Android_SDK_HOME變量的情況下,如果你沒(méi)有修改過(guò)Windows的“我的文檔”路徑,啟動(dòng)AVD是沒(méi)有問(wèn)題的。但是如果修改過(guò),就會(huì)出現(xiàn)下面的錯(cuò)誤emulator:ERROR:unknownvirtualdevicename:'my_avd‘emulator:couldnotfindvirtualdevicenamed'my_avd‘解決方法:添加Android_SDK_HOME環(huán)境變量,從變量名上看最好把ANDROID_SDK_HOME指向AndroidSDK目錄,然后啟動(dòng)AVD
Android應(yīng)用程序架構(gòu)src/java原代碼存放目錄gen/自動(dòng)生成目錄gen目錄中存放所有由Android開(kāi)發(fā)工具自動(dòng)生成的文件。目錄中最重要的就是R.java文件。這個(gè)文件由Android開(kāi)發(fā)工具自動(dòng)產(chǎn)生的。Android開(kāi)發(fā)工具會(huì)自動(dòng)根據(jù)你放入res目錄的資源,同步更新修改R.java文件。正因?yàn)镽.java文件是由開(kāi)發(fā)工具自動(dòng)生成的,所以我們應(yīng)避免手工修改R.java。R.java在應(yīng)用中起到了字典的作用,它包含了各種資源的id,通過(guò)R.java,應(yīng)用可以很方便地找到對(duì)應(yīng)資源。另外編繹器也會(huì)檢查R.java列表中的資源是否被使用到,沒(méi)有被使用到的資源不會(huì)編繹進(jìn)軟件中,這樣可以減少應(yīng)用在手機(jī)占用的空間。res/資源(Resource)目錄在這個(gè)目錄中我們可以存放應(yīng)用使用到的各種資源,如xml界面文件,圖片或數(shù)據(jù)。具體請(qǐng)看ppt下方備注欄。assets資源目錄Android除了提供/res目錄存放資源文件外,在/assets目錄也可以存放資源文件,而且/assets目錄下的資源文件不會(huì)在R.java自動(dòng)生成ID,所以讀取/assets目錄下的文件必須指定文件的路徑,如:file:///android_asset/xxx.3gpAndroidManifest.xml
項(xiàng)目清單文件這個(gè)文件列出了應(yīng)用程序所提供的功能,以后你開(kāi)發(fā)好的各種組件需要在該文件中進(jìn)行配置,如果應(yīng)用使用到了系統(tǒng)內(nèi)置的應(yīng)用(如電話(huà)服務(wù)、互聯(lián)網(wǎng)服務(wù)、短信服務(wù)、GPS服務(wù)等等),你還需在該文件中聲明使用權(quán)限。perties
項(xiàng)目環(huán)境信息,一般是不需要修改此文件
通過(guò)命令操作1android
顯示SDKandAVDmanager2androidlistavds
列出我們創(chuàng)建的模擬器
通過(guò)命令操作3androidlisttargets
列出我們可以使用的sdk的版本4adbdevices
列出所有的設(shè)備
通過(guò)命令操作5adbshell掛載到linux的空間6adbinstallxxx.apk如果有多個(gè)設(shè)備,我們可以指定設(shè)備
adbinstall–semulator-5554D:/xxx.apk7emulator–avdadvname啟動(dòng)模擬器
例如:emulator–avd2.2(2.2為我們創(chuàng)建設(shè)備的名稱(chēng))8mkmdcard20md:/sdcard.img創(chuàng)建sdcard9adbpull<remote><local>10adbpush<local><remote>11androidcreateavd–nameandroid2.2–target8創(chuàng)建模擬器12ctrl+F11橫豎屏的切換
android工程的打包過(guò)程我們通過(guò)加壓工具就可以查看
電話(huà)拔號(hào)器效果圖:
電話(huà)拔號(hào)器因?yàn)閼?yīng)用要使用手機(jī)的電話(huà)服務(wù),所以要在清單文件AndroidManifest.xml中添加電話(huà)服務(wù)權(quán)限:<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="/apk/res/android"
package="cn.itcast.action"
android:versionCode="1"
android:versionName="1.0">略....
<uses-sdkandroid:minSdkVersion=“6"/>
<uses-permissionandroid:name="android.permission.CALL_PHONE"/></manifest>
電話(huà)拔號(hào)器界面布局:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/inputmobile"/>
<EditTextandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/mobile"/>
<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/button"android:id="@+id/button"/></LinearLayout>LinearLayout(線(xiàn)性布局)、AbsoluteLayout(絕對(duì)布局)、RelativeLayout(相對(duì)布局)、TableLayout(表格布局)、FrameLayout(幀布局)
Android中的顯示單位px(pixels)像素
一般HVGA代表320x480像素,這個(gè)用的比較多。
dip或dp(deviceindependentpixels)設(shè)備獨(dú)立像素
這個(gè)和設(shè)備硬件有關(guān),一般為了支持WVGA、HVGA和QVGA推薦使用這個(gè),不依賴(lài)像素。
sp(scaledpixels—bestfortextsize)比例像素
主要處理字體的大小,可以根據(jù)系統(tǒng)的字體自適應(yīng)。除了上面三個(gè)顯示單位,下面還有幾個(gè)不太常用:
in(inches)英寸mm(millimeters)毫米pt(points)點(diǎn),1/72英寸為了適應(yīng)不同分辨率,不同的像素密度,推薦使用dip,文字使用sp。
電話(huà)拔號(hào)器Activity:publicclassDialerActionextendsActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);Buttonbutton=(Button)findViewById(R.id.button);button.setOnClickListener(newView.OnClickListener(){ publicvoidonClick(Viewv){ EditTexteditText=(EditText)findViewById(R.id.mobile);
Intentintent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:"+editText.getText())); DialerAction.this.startActivity(intent); }});}}
電話(huà)拔號(hào)器測(cè)試步驟:
1>在Eclipse中運(yùn)行此應(yīng)用
2>在Dos窗口中進(jìn)入androidSDK安裝路徑的tools目錄,輸入以下命令再開(kāi)啟一個(gè)Android模擬器:
emulator-dataitcast注:itcast為用戶(hù)數(shù)據(jù)存取文件,如果該文件不存在,默認(rèn)在tools目錄創(chuàng)建該文件
3>在電話(huà)擾號(hào)器中輸入上圖現(xiàn)顯的電話(huà)號(hào)碼
“尚未注冊(cè)網(wǎng)絡(luò)”錯(cuò)誤信息的解決辦法打開(kāi)Android模擬器時(shí),出現(xiàn)無(wú)信號(hào),拔打電話(huà)或發(fā)短信時(shí),提示“尚未注冊(cè)網(wǎng)絡(luò)”錯(cuò)誤信息的解決方案如下。
場(chǎng)景一:你的電腦沒(méi)有連接上互聯(lián)網(wǎng),同時(shí)也沒(méi)有在局域網(wǎng)。解決辦法:右鍵點(diǎn)擊網(wǎng)上鄰居,選擇"屬性",在網(wǎng)絡(luò)連接窗口中右鍵點(diǎn)擊"本地連接",選擇"屬性",設(shè)置TCP/IP屬性如下:
IP地址:00
子網(wǎng)掩碼:
默認(rèn)網(wǎng)關(guān):00
首選DNS服務(wù)器:00
場(chǎng)景二:你的電腦沒(méi)有連接上互聯(lián)網(wǎng),但在局域網(wǎng)。解決辦法:右鍵點(diǎn)擊網(wǎng)上鄰居,選擇"屬性",在網(wǎng)絡(luò)連接窗口中右鍵點(diǎn)擊"本地連接",選擇"屬性",設(shè)置TCP/IP屬性如下:
IP地址:設(shè)置成你所在局域網(wǎng)的IP,如:00
子網(wǎng)掩碼:設(shè)置成你所在局域網(wǎng)的掩碼,如:
默認(rèn)網(wǎng)關(guān):設(shè)置成你所在局域網(wǎng)的網(wǎng)關(guān),一般網(wǎng)關(guān)的IP格式為:*.*.*.1,如:
首選DNS服務(wù)器:設(shè)置成你所在局域網(wǎng)的路由器IP,一般路由器的IP格式為:*.*.*.1,如:
最后一種解決方案是:讓你的電腦連接上互聯(lián)網(wǎng)。
短信發(fā)送器效果圖:
短信發(fā)送器因?yàn)閼?yīng)用要使用手機(jī)的短信服務(wù),所以要在清單文件AndroidManifest.xml中添加短信服務(wù)權(quán)限:<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="/apk/res/android"
package="cn.itcast.sms"
android:versionCode="1"
android:versionName="1.0">
略....
<uses-sdkandroid:minSdkVersion=“4"/>
<uses-permissionandroid:name="android.permission.SEND_SMS"/></manifest>
短信發(fā)送器界面布局:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"
android:orientation="vertical“android:layout_width="fill_parent“android:layout_height="fill_parent">
<TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/inputmobile"/>
<EditTextandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/mobile"/>
<TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/content"/>
<EditTextandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:minLines="3"android:id="@+id/content"/>
<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/button"android:id="@+id/button"/></LinearLayout>
短信發(fā)送器Activity主要代碼:
Stringmobile=mobileView.getText().toString();
Stringcontent=contentView.getText().toString();
SmsManagersmsManager=SmsManager.getDefault();
PendingIntentsentIntent=PendingIntent.getBroadcast(SMSSender.this,0,newIntent(),0);
//如果字?jǐn)?shù)超過(guò)70,需拆分成多條短信發(fā)送
List<String>msgs=smsManager.divideMessage(content);
for(Stringmsg:msgs){
smsManager.sendTextMessage(mobile,null,msg,sentIntent,null);
//最后二個(gè)參數(shù)為短信已發(fā)送的廣播意圖,最后一個(gè)參數(shù)為短信對(duì)方已收到短信的廣播意圖
}
Toast.makeText(SMSSender.this,"短信發(fā)送完成",Toast.LENGTH_LONG).show();
短信發(fā)送器測(cè)試步驟:
1>在Eclipse中運(yùn)行此應(yīng)用
2>在Dos窗口中進(jìn)入androidSDK安裝路徑的tools目錄,輸入以下命令再開(kāi)啟一個(gè)Android模擬器:
emulator-dataitcast注:itcast為用戶(hù)數(shù)據(jù)存取文件,如果該文件不存在,默認(rèn)在tools目錄創(chuàng)建該文件
3>在短信發(fā)送器的手機(jī)號(hào)中輸入上圖現(xiàn)顯的電話(huà)號(hào)碼注:目前Android系統(tǒng)對(duì)中文短信尚未支持,所以發(fā)送中文短信會(huì)有亂碼,這個(gè)問(wèn)題日后會(huì)被解決的。
發(fā)送彩信可以通過(guò)調(diào)用系統(tǒng)自帶的短信程序發(fā)送彩信:Intentintent=newIntent(Intent.ACTION_SEND);intent.putExtra(Intent.EXTRA_STREAM,Uri.parse("file:///sdcard/cong.png"));intent.putExtra("address",);intent.putExtra("exit_on_sent",true);intent.putExtra("subject","it'ssubject");intent.putExtra("sms_body","it'scontent");intent.setType”(“image/jpeg);//視頻:video/mpeg*,文本:text/plain
對(duì)應(yīng)用進(jìn)行單元測(cè)試在實(shí)際開(kāi)發(fā)中,開(kāi)發(fā)android軟件的過(guò)程需要不斷地進(jìn)行測(cè)試。而使用Junit測(cè)試框架,側(cè)是正規(guī)Android開(kāi)發(fā)的必用技術(shù),在Junit中可以得到組件,可以模擬發(fā)送事件和檢測(cè)程序處理的正確性。第一步:首先在AndroidManifest.xml中加入下面紅色代碼:<manifestxmlns:android="/apk/res/android"
package="cn.itcast.action“android:versionCode="1“android:versionName="1.0">
<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
<uses-libraryandroid:name="android.test.runner"/>
....
</application>
<uses-sdkandroid:minSdkVersion="6"/>
<instrumentationandroid:name="android.test.InstrumentationTestRunner"
android:targetPackage="cn.itcast.action"android:label="TestsforMyApp"/></manifest>上面targetPackage指定的包要和應(yīng)用的package相同。第二步:編寫(xiě)單元測(cè)試代碼(選擇要測(cè)試的方法,右鍵點(diǎn)擊“RunAs”--“AndroidJunitTest”):importandroid.test.AndroidTestCase;importandroid.util.Log;publicclassXMLTestextendsAndroidTestCase{
publicvoidtestSomething()throwsThrowable{
Assert.assertTrue(1+1==3);
}}
數(shù)據(jù)存儲(chǔ)與訪(fǎng)問(wèn)很多時(shí)候我們的軟件需要對(duì)處理后的數(shù)據(jù)進(jìn)行存儲(chǔ)或再次訪(fǎng)問(wèn)。Android為數(shù)據(jù)存儲(chǔ)提供了如下幾種方式:文件SharedPreferences(參數(shù))SQLite數(shù)據(jù)庫(kù)內(nèi)容提供者(Contentprovider)網(wǎng)絡(luò)
使用文件進(jìn)行數(shù)據(jù)存儲(chǔ)首先給大家介紹使用文件如何對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ),Activity提供了openFileOutput()方法可以用于把數(shù)據(jù)輸出到文件中,具體的實(shí)現(xiàn)過(guò)程與在J2SE環(huán)境中保存數(shù)據(jù)到文件中是一樣的。publicclassFileActivityextendsActivity{
@OverridepublicvoidonCreate(BundlesavedInstanceState){
...
FileOutputStreamoutStream=this.openFileOutput("itcast.txt",Context.MODE_PRIVATE);
outStream.write("傳智播客".getBytes());
outStream.close();
}}openFileOutput()方法的第一參數(shù)用于指定文件名稱(chēng),不能包含路徑分隔符“/”,如果文件不存在,Android會(huì)自動(dòng)創(chuàng)建它。創(chuàng)建的文件保存在/data/data/<packagename>/files目錄,如:
/data/data/cn.itcast.action/files/itcast.txt
,通過(guò)點(diǎn)擊Eclipse菜單“Window”-“ShowView”-“Other”,在對(duì)話(huà)窗口中展開(kāi)android文件夾,選擇下面的FileExplorer視圖,然后在FileExplorer視圖中展開(kāi)/data/data/<packagename>/files目錄就可以看到該文件。openFileOutput()方法的第二參數(shù)用于指定操作模式,有四種模式,分別為:
Context.MODE_PRIVATE
=0Context.MODE_APPEND
=32768Context.MODE_WORLD_READABLE=1Context.MODE_WORLD_WRITEABLE=2
使用文件進(jìn)行數(shù)據(jù)存儲(chǔ)Context.MODE_PRIVATE:為默認(rèn)操作模式,代表該文件是私有數(shù)據(jù),只能被應(yīng)用本身訪(fǎng)問(wèn),在該模式下,寫(xiě)入的內(nèi)容會(huì)覆蓋原文件的內(nèi)容,如果想把新寫(xiě)入的內(nèi)容追加到原文件中??梢允褂肅ontext.MODE_APPENDContext.MODE_APPEND:模式會(huì)檢查文件是否存在,存在就往文件追加內(nèi)容,否則就創(chuàng)建新文件。Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來(lái)控制其他應(yīng)用是否有權(quán)限讀寫(xiě)該文件。MODE_WORLD_READABLE:表示當(dāng)前文件可以被其他應(yīng)用讀??;MODE_WORLD_WRITEABLE:表示當(dāng)前文件可以被其他應(yīng)用寫(xiě)入。如果希望文件被其他應(yīng)用讀和寫(xiě),可以傳入:
openFileOutput("itcast.txt",Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);android有一套自己的安全模型,當(dāng)應(yīng)用程序(.apk)在安裝時(shí)系統(tǒng)就會(huì)分配給他一個(gè)userid,當(dāng)該應(yīng)用要去訪(fǎng)問(wèn)其他資源比如文件的時(shí)候,就需要userid匹配。默認(rèn)情況下,任何應(yīng)用創(chuàng)建的文件,sharedpreferences,數(shù)據(jù)庫(kù)都應(yīng)該是私有的(位于/data/data/<packagename>/files),其他程序無(wú)法訪(fǎng)問(wèn)。除非在創(chuàng)建時(shí)指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE,只有這樣其他程序才能正確訪(fǎng)問(wèn)。
讀取文件內(nèi)容如果要打開(kāi)存放在/data/data/<packagename>/files目錄應(yīng)用私有的文件,可以使用Activity提供openFileInput()方法。FileInputStreaminStream=this.getContext().openFileInput("itcast.txt");Log.i("FileTest",readInStream(inStream));readInStream()的方法請(qǐng)看本頁(yè)下面?zhèn)渥?。或者直接使用文件的絕對(duì)路徑:Filefile=newFile("/data/data/cn.itcast.action/files/itcast.txt");FileInputStreaminStream=newFileInputStream(file);Log.i("FileTest",readInStream(inStream));注意:上面文件路徑中的“cn.itcast.action”為應(yīng)用所在包,當(dāng)你在編寫(xiě)代碼時(shí)應(yīng)替換為你自己應(yīng)用使用的包。對(duì)于私有文件只能被創(chuàng)建該文件的應(yīng)用訪(fǎng)問(wèn),如果希望文件能被其他應(yīng)用讀和寫(xiě),可以在創(chuàng)建文件時(shí),指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權(quán)限。Activity還提供了getCacheDir()和getFilesDir()方法:getCacheDir()方法用于獲取/data/data/<packagename>/cache目錄getFilesDir()方法用于獲取/data/data/<packagename>/files目錄
把文件存放在SDCard使用Activity的openFileOutput()方法保存文件,文件是存放在手機(jī)空間上,一般手機(jī)的存儲(chǔ)空間不是很大,存放些小文件還行,如果要存放像視頻這樣的大文件,是不可行的。對(duì)于像視頻這樣的大文件,我們可以把它存放在SDCard。
SDCard是干什么的?你可以把它看作是移動(dòng)硬盤(pán)或U盤(pán)。在模擬器中使用SDCard,你需要先創(chuàng)建一張SDCard卡(當(dāng)然不是真的SDCard,只是鏡像文件)。創(chuàng)建SDCard可以在Eclipse創(chuàng)建模擬器時(shí)隨同創(chuàng)建,也可以使用DOS命令進(jìn)行創(chuàng)建,如下:在Dos窗口中進(jìn)入androidSDK安裝路徑的tools目錄,輸入以下命令創(chuàng)建一張容量為2G的SDCard,文件后綴可以隨便取,建議使用.img:mksdcard2048M
D:\AndroidTool\sdcard.img在程序中訪(fǎng)問(wèn)SDCard,你需要申請(qǐng)?jiān)L問(wèn)SDCard的權(quán)限。在AndroidManifest.xml中加入訪(fǎng)問(wèn)SDCard的權(quán)限如下:<!--在SDCard中創(chuàng)建與刪除文件權(quán)限--><uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!--往SDCard寫(xiě)入數(shù)據(jù)權(quán)限--><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
把文件存放在SDCard要往SDCard存放文件,程序必須先判斷手機(jī)是否裝有SDCard,并且可以進(jìn)行讀寫(xiě)。注意:訪(fǎng)問(wèn)SDCard必須在AndroidManifest.xml中加入訪(fǎng)問(wèn)SDCard的權(quán)限if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){FilesdCardDir=Environment.getExternalStorageDirectory();//獲取SDCard目錄
FilesaveFile=newFile(sdCardDir,“itcast.txt”);FileOutputStreamoutStream=newFileOutputStream(saveFile);outStream.write("傳智播客".getBytes());outStream.close();}Environment.getExternalStorageState()方法用于獲取SDCard的狀態(tài),如果手機(jī)裝有SDCard,并且可以進(jìn)行讀寫(xiě),那么方法返回的狀態(tài)等于Environment.MEDIA_MOUNTED。Environment.getExternalStorageDirectory()方法用于獲取SDCard的目錄,當(dāng)然要獲取SDCard的目錄,你也可以這樣寫(xiě):FilesdCardDir=newFile("/mnt/sdcard");//獲取SDCard目錄FilesaveFile=newFile(sdCardDir,"itcast.txt");
//上面兩句代碼可以合成一句:
FilesaveFile=newFile("/mnt/sdcard/itcast.txt");FileOutputStreamoutStream=newFileOutputStream(saveFile);outStream.write("傳智播客test".getBytes());outStream.close();
使用SAX或者DOM或者pull解析XML文件在Android平臺(tái)上可以使用SimpleAPIforXML(SAX)、DocumentObjectModel(DOM)和Android附帶的pull解析器解析XML文件。
下面是本例子要解析的XML文件:文件名稱(chēng):itcast.xml<?xmlversion="1.0"encoding="UTF-8"?><persons>
<personid=“18">
<name>allen</name>
<age>36</age>
</person>
<personid=“28">
<name>james</name>
<age>25</age>
</person></persons>例子定義了一個(gè)javabean用于存放上面解析出來(lái)的xml內(nèi)容,
這個(gè)javabean為Person,代碼請(qǐng)見(jiàn)本頁(yè)下面?zhèn)渥ⅲ?/p>
使用SAX讀取XML文件SAX是一個(gè)解析速度快并且占用內(nèi)存少的xml解析器,非常適合用于Android等移動(dòng)設(shè)備。SAX解析XML文件采用的是事件驅(qū)動(dòng),也就是說(shuō),它并不需要解析完整個(gè)文檔,在按內(nèi)容順序解析文檔的過(guò)程中,SAX會(huì)判斷當(dāng)前讀到的字符是否合法XML語(yǔ)法中的某部分,如果符合就會(huì)觸發(fā)事件。所謂事件,其實(shí)就是一些回調(diào)(callback)方法,這些方法(事件)定義在ContentHandler接口。下面是一些ContentHandler接口常用的方法:startDocument()當(dāng)遇到文檔的開(kāi)頭的時(shí)候,調(diào)用這個(gè)方法,可以在其中做一些預(yù)處理的工作。endDocument()和上面的方法相對(duì)應(yīng),當(dāng)文檔結(jié)束的時(shí)候,調(diào)用這個(gè)方法,可以在其中做一些善后的工作。startElement(StringnamespaceURI,StringlocalName,StringqName,Attributesatts)當(dāng)讀到一個(gè)開(kāi)始標(biāo)簽的時(shí)候,會(huì)觸發(fā)這個(gè)方法。namespaceURI就是命名空間,localName是不帶命名空間前綴的標(biāo)簽名,qName是帶命名空間前綴的標(biāo)簽名。通過(guò)atts可以得到所有的屬性名和相應(yīng)的值。要注意的是SAX中一個(gè)重要的特點(diǎn)就是它的流式處理,當(dāng)遇到一個(gè)標(biāo)簽的時(shí)候,它并不會(huì)紀(jì)錄下以前所碰到的標(biāo)簽,也就是說(shuō),在startElement()方法中,所有你所知道的信息,就是標(biāo)簽的名字和屬性,至于標(biāo)簽的嵌套結(jié)構(gòu),上層標(biāo)簽的名字,是否有子元屬等等其它與結(jié)構(gòu)相關(guān)的信息,都是不得而知的,都需要你的程序來(lái)完成。這使得SAX在編程處理上沒(méi)有DOM來(lái)得那么方便。endElement(Stringuri,StringlocalName,Stringname)這個(gè)方法和上面的方法相對(duì)應(yīng),在遇到結(jié)束標(biāo)簽的時(shí)候,調(diào)用這個(gè)方法。characters(char[]ch,intstart,intlength)這個(gè)方法用來(lái)處理在XML文件中讀到的內(nèi)容,第一個(gè)參數(shù)為文件的字符串內(nèi)容,后面兩個(gè)參數(shù)是讀到的字符串在這個(gè)數(shù)組中的起始位置和長(zhǎng)度,使用newString(ch,start,length)就可以獲取內(nèi)容。
使用SAX讀取XML文件只要為SAX提供實(shí)現(xiàn)ContentHandler接口的類(lèi),那么該類(lèi)就可以得到通知事件(實(shí)際上就是SAX調(diào)用了該類(lèi)中的回調(diào)方法)。因?yàn)镃ontentHandler是一個(gè)接口,在使用的時(shí)候可能會(huì)有些不方便,因此,SAX還為其制定了一個(gè)Helper類(lèi):DefaultHandler,它實(shí)現(xiàn)了ContentHandler接口,但是其所有的方法體都為空,在實(shí)現(xiàn)的時(shí)候,你只需要繼承這個(gè)類(lèi),然后重寫(xiě)相應(yīng)的方法即可。使用SAX解析itcast.xml的代碼如下:publicstaticList<Person>readXML(InputStreaminStream){
try{
SAXParserFactoryspf=SAXParserFactory.newInstance();
SAXParsersaxParser=spf.newSAXParser();//創(chuàng)建解析器
//設(shè)置解析器的相關(guān)特性,/sax/features/namespaces=true表示開(kāi)啟命名空間特性
//saxParser.setProperty("/sax/features/namespaces",true);
XMLContentHandlerhandler=newXMLContentHandler(); saxParser.parse(inStream,handler); inStream.close(); returnhandler.getPersons();}catch(Exceptione){ e.printStackTrace();}returnnull;}SAX支持已內(nèi)置到JDK1.5中,你無(wú)需添加任何的jar文件。關(guān)于XMLContentHandler的代碼實(shí)現(xiàn)請(qǐng)看本頁(yè)下面?zhèn)渥ⅰ?/p>
使用DOM讀取XML文件除了使用SAX可以解析XML文件,大家也可以使用熟悉的DOM來(lái)解析XML文件。
DOM解析XML文件時(shí),會(huì)將XML文件的所有內(nèi)容以文檔樹(shù)方式存放在內(nèi)存中,然后允許您使用DOMAPI遍歷XML樹(shù)、檢索所需的數(shù)據(jù)。使用DOM操作XML的代碼看起來(lái)是比較直觀的,并且在編碼方面比基于SAX的實(shí)現(xiàn)更加簡(jiǎn)單。但是,因?yàn)镈OM需要將XML文件的所有內(nèi)容以文檔樹(shù)方式存放在內(nèi)存中,所以?xún)?nèi)存的消耗比較大,特別對(duì)于運(yùn)行Android的移動(dòng)設(shè)備來(lái)說(shuō),因?yàn)樵O(shè)備的資源比較寶貴,所以建議還是采用SAX來(lái)解析XML文件,當(dāng)然,如果XML文件的內(nèi)容比較小采用DOM也是可行的。代碼請(qǐng)看本頁(yè)下方備注
使用Pull解析器讀取XML文件除了可以使用SAX或DOM解析XML文件之外,大家也可以使用Android內(nèi)置的Pull解析器解析XML文件。Pull解析器是一個(gè)開(kāi)源的java項(xiàng)目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入類(lèi)路徑中,因?yàn)锳ndroid已經(jīng)集成進(jìn)了Pull解析器,所以無(wú)需添加任何jar文件。android系統(tǒng)本身使用到的各種xml文件,其內(nèi)部也是采用Pull解析器進(jìn)行解析的。
Pull解析器的運(yùn)行方式與SAX解析器相似。它提供了類(lèi)似的事件,如:開(kāi)始元素和結(jié)束元素事件,使用parser.next()可以進(jìn)入下一個(gè)元素并觸發(fā)相應(yīng)事件。跟SAX不同的是,Pull解析器產(chǎn)生的事件是一個(gè)數(shù)字,而非方法,因此可以使用一個(gè)switch對(duì)感興趣的事件進(jìn)行處理。當(dāng)元素開(kāi)始解析時(shí),調(diào)用parser.nextText()方法可以獲取下一個(gè)Text類(lèi)型節(jié)點(diǎn)的值。使用Pull解析器讀取itcast.xml的代碼在本頁(yè)下方備注Pull解析器的源碼及文檔下載網(wǎng)址:/
使用Pull解析器生成XML文件有些時(shí)候,我們需要生成一個(gè)XML文件,生成XML文件的方法有很多,如:可以只使用一個(gè)StringBuilder組拼XML內(nèi)容,然后把內(nèi)容寫(xiě)入到文件中;或者使用DOMAPI生成XML文件,或者也可以使用pull解析器生成XML文件,這里推薦大家使用Pull解析器。使用Pull解析器生成一個(gè)與itcast.xml文件內(nèi)容相同的myitcast.xml文件,代碼在本頁(yè)下方備注使用代碼如下(生成XML文件):FilexmlFile=newFile("myitcast.xml");FileOutputStreamoutStream=newFileOutputStream(xmlFile);OutputStreamWriteroutStreamWriter=newOutputStreamWriter(outStream,"UTF-8");BufferedWriterwriter=newBufferedWriter(outStreamWriter);writeXML(persons,writer);writer.flush();writer.close();如果只想得到生成的xml字符串內(nèi)容,可以使用StringWriter:StringWriterwriter=newStringWriter();writeXML(persons,writer);Stringcontent=writer.toString();
使用SharedPreferences進(jìn)行數(shù)據(jù)存儲(chǔ)很多時(shí)候我們開(kāi)發(fā)的軟件需要向用戶(hù)提供軟件參數(shù)設(shè)置功能,例如我們常用的QQ,用戶(hù)可以設(shè)置是否允許陌生人添加自己為好友。對(duì)于軟件配置參數(shù)的保存,如果是window軟件通常我們會(huì)采用ini文件進(jìn)行保存,如果是j2se應(yīng)用,我們會(huì)采用properties屬性文件或者xml進(jìn)行保存。如果是Android應(yīng)用,我們最適合采用什么方式保存軟件配置參數(shù)呢?Android平臺(tái)給我們提供了一個(gè)SharedPreferences類(lèi),它是一個(gè)輕量級(jí)的存儲(chǔ)類(lèi),特別適合用于保存軟件配置參數(shù)。使用SharedPreferences保存數(shù)據(jù),其背后是用xml文件存放數(shù)據(jù),文件存放在/data/data/<packagename>/shared_prefs目錄下:SharedPreferencessharedPreferences=getSharedPreferences("itcast",Context.MODE_PRIVATE);Editoreditor=sharedPreferences.edit();//獲取編輯器editor.putString("name","傳智播客");editor.putInt("age",4);mit();//提交修改生成的itcast.xml文件內(nèi)容如下:<?xmlversion='1.0'encoding='utf-8'standalone='yes'?><map><stringname="name">傳智播客</string><intname="age"value="4"/></map>因?yàn)镾haredPreferences背后是使用xml文件保存數(shù)據(jù),getSharedPreferences(name,mode)方法的第一個(gè)參數(shù)用于指定該文件的名稱(chēng),名稱(chēng)不用帶后綴,后綴會(huì)由Android自動(dòng)加上。方法的第二個(gè)參數(shù)指定文件的操作模式,共有四種操作模式,這四種模式前面介紹使用文件方式保存數(shù)據(jù)時(shí)已經(jīng)講解過(guò)。如果希望SharedPreferences背后使用的xml文件能被其他應(yīng)用讀和寫(xiě),可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權(quán)限。另外Activity還提供了另一個(gè)getPreferences(mode)方法操作SharedPreferences,這個(gè)方法默認(rèn)使用當(dāng)前類(lèi)不帶包名的類(lèi)名作為文件的名稱(chēng)。
訪(fǎng)問(wèn)SharedPreferences中的數(shù)據(jù)訪(fǎng)問(wèn)SharedPreferences中的數(shù)據(jù)代碼如下:SharedPreferencessharedPreferences=getSharedPreferences("itcast",Context.MODE_PRIVATE);//getString()第二個(gè)參數(shù)為缺省值,如果preference中不存在該key,將返回缺省值Stringname=sharedPreferences.getString("name","");intage=sharedPreferences.getInt("age",1);如果訪(fǎng)問(wèn)其他應(yīng)用中的Preference,前提條件是:該preference創(chuàng)建時(shí)指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE權(quán)限。如:有個(gè)<packagename>為cn.itcast.action的應(yīng)用使用下面語(yǔ)句創(chuàng)建了preference。getSharedPreferences("itcast",Context.MODE_WORLD_READABLE);其他應(yīng)用要訪(fǎng)問(wèn)上面應(yīng)用的preference,首先需要?jiǎng)?chuàng)建上面應(yīng)用的Context,然后通過(guò)Context訪(fǎng)問(wèn)preference,訪(fǎng)問(wèn)preference時(shí)會(huì)在應(yīng)用所在包下的shared_prefs目錄找到preference:ContextotherAppsContext=createPackageContext("cn.itcast.action",Context.CONTEXT_IGNORE_SECURITY);SharedPreferencessharedPreferences=otherAppsContext.getSharedPreferences("itcast",Context.MODE_WORLD_READABLE);Stringname=sharedPreferences.getString("name","");intage=sharedPreferences.getInt("age",0);如果不通過(guò)創(chuàng)建Context訪(fǎng)問(wèn)其他應(yīng)用的preference,也可以以讀取xml文件方式直接訪(fǎng)問(wèn)其他應(yīng)用preference對(duì)應(yīng)的xml文件,如:
FilexmlFile=newFile(“/data/data/<packagename>/shared_prefs/itcast.xml”);//<packagename>應(yīng)替換成應(yīng)用的包名
使用嵌入式關(guān)系型SQLite數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)在Android平臺(tái)上,集成了一個(gè)嵌入式關(guān)系型數(shù)據(jù)庫(kù)—SQLite,SQLite3支持NULL、INTEGER、REAL(浮點(diǎn)數(shù)字)、TEXT(字符串文本)和BLOB(二進(jìn)制對(duì)象)數(shù)據(jù)類(lèi)型,雖然它支持的類(lèi)型只有五種,但實(shí)際上sqlite3也接受varchar(n)、char(n)、decimal(p,s)等數(shù)據(jù)類(lèi)型,只不過(guò)在運(yùn)算或保存時(shí)會(huì)轉(zhuǎn)成對(duì)應(yīng)的五種數(shù)據(jù)類(lèi)型。SQLite最大的特點(diǎn)是你可以把各種類(lèi)型的數(shù)據(jù)保存到任何字段中,而不用關(guān)心字段聲明的數(shù)據(jù)類(lèi)型是什么。例如:可以在Integer類(lèi)型的字段中存放字符串,或者在布爾型字段中存放浮點(diǎn)數(shù),或者在字符型字段中存放日期型值。但有一種情況例外:定義為INTEGERPRIMARYKEY的字段只能存儲(chǔ)64位整數(shù),當(dāng)向這種字段保存除整數(shù)以外的數(shù)據(jù)時(shí),將會(huì)產(chǎn)生錯(cuò)誤。另外,
SQLite在解析CREATETABLE語(yǔ)句時(shí),會(huì)忽略CREATETABLE語(yǔ)句中跟在字段名后面的數(shù)據(jù)類(lèi)型信息,如下面語(yǔ)句會(huì)忽略name字段的類(lèi)型信息:CREATETABLEperson(personidintegerprimarykeyautoincrement,namevarchar(20))SQLite可以解析大部分標(biāo)準(zhǔn)SQL語(yǔ)句,如:查詢(xún)語(yǔ)句:select*from表名where條件子句groupby分組字句having...orderby排序子句如:select*fromperson
select*frompersonorderbyiddesc
selectnamefrompersongroupbynamehavingcount(*)>1分頁(yè)SQL與mysql類(lèi)似,下面SQL語(yǔ)句獲取5條記錄,跳過(guò)前面3條記錄select*fromAccountlimit5offset3或者select*fromAccountlimit3,5插入語(yǔ)句:insertinto表名(字段列表)values(值列表)。如:
insertintoperson(name,age)values(‘傳智’,3)更新語(yǔ)句:update表名set字段名=值where條件子句。如:updatepersonsetname=‘傳智‘whereid=10刪除語(yǔ)句:deletefrom表名where條件子句。如:deletefrompersonwhereid=10
使用SQLiteOpenHelper對(duì)數(shù)據(jù)庫(kù)進(jìn)行版本管理我們?cè)诰帉?xiě)數(shù)據(jù)庫(kù)應(yīng)用軟件時(shí),需要考慮這樣的問(wèn)題:因?yàn)槲覀冮_(kāi)發(fā)的軟件可能會(huì)安裝在很多用戶(hù)的手機(jī)上,如果應(yīng)用使用到了SQLite數(shù)據(jù)庫(kù),我們必須在用戶(hù)初次使用軟件時(shí)創(chuàng)建出應(yīng)用使用到的數(shù)據(jù)庫(kù)表結(jié)構(gòu)及添加一些初始化記錄,另外在軟件升級(jí)的時(shí)候,也需要對(duì)數(shù)據(jù)表結(jié)構(gòu)進(jìn)行更新。那么,我們?nèi)绾尾拍軐?shí)現(xiàn)在用戶(hù)初次使用或升級(jí)軟件時(shí)自動(dòng)在用戶(hù)的手機(jī)上創(chuàng)建出應(yīng)用需要的數(shù)據(jù)庫(kù)表呢?總不能讓我們?cè)诿總€(gè)需要安裝此軟件的手機(jī)上通過(guò)手工方式創(chuàng)建數(shù)據(jù)庫(kù)表吧?因?yàn)檫@種需求是每個(gè)數(shù)據(jù)庫(kù)應(yīng)用都要面臨的,所以在Android系統(tǒng),為我們提供了一個(gè)名為SQLiteOpenHelper的抽象類(lèi),必須繼承它才能使用,它是通過(guò)對(duì)數(shù)據(jù)庫(kù)版本進(jìn)行管理來(lái)實(shí)現(xiàn)前面提出的需求。
為了實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)版本進(jìn)行管理,SQLiteOpenHelper類(lèi)提供了兩個(gè)重要的方法,分別是onCreate(SQLiteDatabasedb)和onUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion),前者用于初次使用軟件時(shí)生成數(shù)據(jù)庫(kù)表,后者用于升級(jí)軟件時(shí)更新數(shù)據(jù)庫(kù)表結(jié)構(gòu)。當(dāng)調(diào)用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法獲取用于操作數(shù)據(jù)庫(kù)的SQLiteDatabase實(shí)例的時(shí)候,如果數(shù)據(jù)庫(kù)不存在,Android系統(tǒng)會(huì)自動(dòng)生成一個(gè)數(shù)據(jù)庫(kù),接著調(diào)用onCreate()方法,onCreate()方法在初次生成數(shù)據(jù)庫(kù)時(shí)才會(huì)被調(diào)用,在onCreate()方法里可以生成數(shù)據(jù)庫(kù)表結(jié)構(gòu)及添加一些應(yīng)用使用到的初始化數(shù)據(jù)。onUpgrade()方法在數(shù)據(jù)庫(kù)的版本發(fā)生變化時(shí)會(huì)被調(diào)用,一般在軟件升級(jí)時(shí)才需改變版本號(hào),而數(shù)據(jù)庫(kù)的版本是由程序員控制的,假設(shè)數(shù)據(jù)庫(kù)現(xiàn)在的版本是1,由于業(yè)務(wù)的變更,修改了數(shù)據(jù)庫(kù)表結(jié)構(gòu),這時(shí)候就需要升級(jí)軟件,升級(jí)軟件時(shí)希望更新用戶(hù)手機(jī)里的數(shù)據(jù)庫(kù)表結(jié)構(gòu),為了實(shí)現(xiàn)這一目的,可以把原來(lái)的數(shù)據(jù)庫(kù)版本設(shè)置為2(有同學(xué)問(wèn)設(shè)置為3行不行?當(dāng)然可以,如果你愿意,設(shè)置為100也行),并且在onUpgrade()方法里面實(shí)現(xiàn)表結(jié)構(gòu)的更新。當(dāng)軟件的版本升級(jí)次數(shù)比較多,這時(shí)在onUpgrade()方法里面可以根據(jù)原版號(hào)和目標(biāo)版本號(hào)進(jìn)行判斷,然后作出相應(yīng)的表結(jié)構(gòu)及數(shù)據(jù)更新。getWritableDatabase()和getReadableDatabase()方法都可以獲取一個(gè)用于操作數(shù)據(jù)庫(kù)的SQLiteDatabase實(shí)例。但getWritableDatabase()方法以讀寫(xiě)方式打開(kāi)數(shù)據(jù)庫(kù),一旦數(shù)據(jù)庫(kù)的磁盤(pán)空間滿(mǎn)了,數(shù)據(jù)庫(kù)就只能讀而不能寫(xiě),倘若使用getWritableDatabase()打開(kāi)數(shù)據(jù)庫(kù)就會(huì)出錯(cuò)。getReadableDatabase()方法先以讀寫(xiě)方式打開(kāi)數(shù)據(jù)庫(kù),如果數(shù)據(jù)庫(kù)的磁盤(pán)空間滿(mǎn)了,就會(huì)打開(kāi)失敗,當(dāng)打開(kāi)失敗后會(huì)繼續(xù)嘗試以只讀方式打開(kāi)數(shù)據(jù)庫(kù)。
使用SQLiteOpenHelper對(duì)數(shù)據(jù)庫(kù)進(jìn)行版本管理publicclassDatabaseHelperextendsSQLiteOpenHelper{//類(lèi)沒(méi)有實(shí)例化,是不能用作父類(lèi)構(gòu)造器的參數(shù),必須聲明為靜態(tài)
privatestaticfinalStringname="itcast";
//數(shù)據(jù)庫(kù)名稱(chēng)
privatestaticfinalintversion=1;//數(shù)據(jù)庫(kù)版本
publicDatabaseHelper(Contextcont
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 5G+AR技術(shù)在慢病遠(yuǎn)程隨訪(fǎng)中實(shí)踐
- 2025年廣安市武勝縣公證處招聘非在編公證員助理的備考題庫(kù)及答案詳解參考
- 初中歷史人物評(píng)價(jià)學(xué)習(xí)分析結(jié)果的可視化呈現(xiàn)與教學(xué)策略改進(jìn)研究教學(xué)研究課題報(bào)告
- 2025年湖州市敬業(yè)特種設(shè)備技術(shù)咨詢(xún)有限公司招聘5人備考題庫(kù)及答案詳解一套
- 3D打印導(dǎo)板在神經(jīng)外科手術(shù)中的精準(zhǔn)設(shè)計(jì)與規(guī)劃
- 2025年天津市政建設(shè)集團(tuán)有限公司面向社會(huì)公開(kāi)選聘總法律顧問(wèn)備考題庫(kù)及參考答案詳解一套
- 2025年關(guān)于公開(kāi)招聘派遣至莆田市城廂區(qū)交通運(yùn)輸局非在編工作人員的備考題庫(kù)及參考答案詳解1套
- 平?jīng)鍪惺兄睂W(xué)校公開(kāi)招聘2026屆協(xié)議培養(yǎng)師范生23人備考題庫(kù)(第二批)及答案詳解1套
- 2025年非遺皮影五年文旅演出效果報(bào)告
- 2025年中國(guó)藥科大學(xué)研究生院工作人員招聘?jìng)淇碱}庫(kù)及參考答案詳解一套
- 毛澤東生平簡(jiǎn)介(1893-1949年)
- 課程設(shè)計(jì)傳動(dòng)裝置輸入軸組合結(jié)構(gòu)設(shè)計(jì)說(shuō)明書(shū)
- 《資本論》第一卷第六篇“工資”
- 中國(guó)近現(xiàn)代史綱要知到章節(jié)答案智慧樹(shù)2023年湖南城市學(xué)院
- 腎上腺神經(jīng)母細(xì)胞瘤影像診斷與鑒別診斷
- (中職)Photoshop基礎(chǔ)實(shí)用教程全冊(cè)教案2022-2023學(xué)年
- 項(xiàng)目經(jīng)理答辯題庫(kù)題
- JJF 1851-2020α譜儀校準(zhǔn)規(guī)范
- GB/T 7441-2008汽輪機(jī)及被驅(qū)動(dòng)機(jī)械發(fā)出的空間噪聲的測(cè)量
- GB/T 39267-2020北斗衛(wèi)星導(dǎo)航術(shù)語(yǔ)
- GB/T 36344-2018信息技術(shù)數(shù)據(jù)質(zhì)量評(píng)價(jià)指標(biāo)
評(píng)論
0/150
提交評(píng)論