版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、北京傳智播客教育 ,3G應(yīng)用開發(fā)之Android,講師:黎活明,北京傳智播客教育 ,什么是3G,3G,全稱為3rd Generation,中文含義就是指第三代數(shù)字通信。 所謂3G,是指將無線通信與國際互聯(lián)網(wǎng)等多媒體通信結(jié)合的新一代移動通信系統(tǒng)。 3G只是一種通信技術(shù)標(biāo)準(zhǔn),符合這個標(biāo)準(zhǔn)的技術(shù)有WCDMA、CDMA2000、TD-SCDMA三種制式。中國聯(lián)通使用的是WCDMA(世界上大部分3G網(wǎng)絡(luò)都采用的是該標(biāo)準(zhǔn)) ;中國電信使用的是CDMA2000 (日、韓和北美使用);中國移動使用的是具有自主知識產(chǎn)權(quán)的TD-SCDMA(只有中國才使用) 。相對第一代模擬制式手機(jī)(1G)和第二代GSM、CDMA
2、等數(shù)字手機(jī)(2G),3G網(wǎng)絡(luò)能處理圖像、音樂、視頻等多種媒體形式,提供包括網(wǎng)頁瀏覽、電話會議、電子商務(wù)等多種信息服務(wù)。第三代與前兩代的主要區(qū)別是在傳輸聲音和數(shù)據(jù)的速度上有很大的提升。 由于3G商用需要相當(dāng)浩大的工程,要從目前的2G邁向3G不可能一下就銜接得上,因此前幾年2.5G的手機(jī)就出現(xiàn)了。符合2.5G標(biāo)準(zhǔn)的技術(shù)有CDMA2000 1X和GPRS,中國聯(lián)通使用的是CDMA2000 1X標(biāo)準(zhǔn),中國移動使用的是GPRS標(biāo)準(zhǔn)。目前,我們可以把2.5G移動通信技術(shù)看作是2G邁向3G的銜接性技術(shù),在2.5G網(wǎng)絡(luò)下出現(xiàn)了如WAP、藍(lán)牙(Bluetoot) 等技術(shù)。,北京傳智播客教育 ,智能手機(jī)軟件平臺,
3、智能手機(jī)軟件平臺有: Symbian, Windows Mobile, RIM BlackBerry, Android, iPhone, Palm, Brew, Java/J2ME。 2009年市場份額: Symbian 51% RIM BlackBerry 18% iPhone 13.3 windows Mobile 9.3% linux 4.6% Android 1.8%,北京傳智播客教育 ,什么是Android,Android一詞的本義指“機(jī)器人”,Android是Google于07年11月5日宣布的基于Linux平臺開源手機(jī)操作系統(tǒng)名稱,該平臺由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組成
4、。在國內(nèi),聯(lián)想、戴爾、多普達(dá)、飛利浦、中興、三星、摩托羅拉、等廠商已經(jīng)推出基于Android平臺的智能手機(jī)。 在3G應(yīng)用開發(fā)領(lǐng)域,Android的發(fā)展前景不容小視,也將會成為未來主流的手機(jī)操作系統(tǒng)。,北京傳智播客教育 ,如何安裝 Android SDK 和Eclipse 插件,所需開發(fā)環(huán)境: JDK 5 或 JDK 6 (僅有JRE不夠) Eclipse 3.5 (galileo) 下載ADT 的Eclipse 插件 安裝 Eclipse 插件 (ADT) 啟動 Eclipse,選擇 Help Install New Software,在出現(xiàn)的對話框里,點擊Add按鈕,在對話框的name一欄輸
5、入“ADT”, 然后點擊Archive.,瀏覽和選擇已經(jīng)下載的ADT插件壓縮文件。 點擊 OK.。返回可用軟件的視圖,你會看到這個插件,然后選擇Developer Tools (會選中下面的“Android Developer Tools”和 “Android Editors“),點擊 Next,最后重啟 Eclipse。 下載Android SDK: 下載完SDK后,把.zip文件解壓到你電腦上合適位置。啟動 Eclipse,選擇window-preferences,在打開的視圖左邊點擊android,在右邊的SDK Location中選擇Android SDK所在位置。,北京傳智播客教育
6、,開發(fā)第一個Android應(yīng)用,打開Eclipse,新建項目(點擊FileNewProject),在項目列表中展開Android目錄,選擇Android Project,如下圖:,北京傳智播客教育 ,開發(fā)第一個Android應(yīng)用,北京傳智播客教育 ,開發(fā)第一個Android應(yīng)用,點擊”finish”即可完成項目的創(chuàng)建,創(chuàng)建后的項目已經(jīng)是一個可運行的Android應(yīng)用,我們可以通過下面方式運行此應(yīng)用: 點擊工具欄上手機(jī)形狀的虛擬設(shè)備管理器(簡稱“AVD“),如下:,北京傳智播客教育 ,開發(fā)第一個Android應(yīng)用,在打開的虛擬設(shè)備管理器中創(chuàng)建一個虛擬手機(jī):,北京傳智播客教育 ,開發(fā)第一個Andr
7、oid應(yīng)用,在項目上右鍵點擊run as Android application,如下圖:,北京傳智播客教育 ,Android應(yīng)用程序架構(gòu),src/ java原代碼存放目錄 gen/ 自動生成目錄 gen 目錄中存放所有由Android開發(fā)工具自動生成的文件。目錄中最重要的就是R.java文件。 這個文件由Android開發(fā)工具自動產(chǎn)生的。Android開發(fā)工具會自動根據(jù)你放入res目錄的xml界面文件、圖標(biāo)與常量,同步更新修改R.java文件。正因為R.java文件是由開發(fā)工具自動生成的,所以我們應(yīng)避免手工修改R.java。R.java在應(yīng)用中起到了字典的作用,它包含了界面、圖標(biāo)、常量等各種
8、資源的id,通過R.java,應(yīng)用可以很方便地找到對應(yīng)資源。另外編繹器也會檢查R.java列表中的資源是否被使用到,沒有被使用到的資源不會編繹進(jìn)軟件中,這樣可以減少應(yīng)用在手機(jī)占用的空間。 res/ 資源(Resource)目錄 在這個目錄中我們可以存放應(yīng)用使用到的各種資源,如xml界面文件,圖片或數(shù)據(jù)。具體請看ppt下方備注欄。 AndroidManifest.xml 功能清單文件 這個文件列出了應(yīng)用程序所提供的功能,在這個文件中,你可以指定應(yīng)用程序使用到的服務(wù)(如電話服務(wù)、互聯(lián)網(wǎng)服務(wù)、短信服務(wù)、GPS服務(wù)等等)。另外當(dāng)你新添加一個Activity的時候,也需要在這個文件中進(jìn)行相應(yīng)配置,只有配
9、置好后,才能調(diào)用此Activity。 perties 項目環(huán)境信息,一般是不需要修改此文件,北京傳智播客教育 ,電話拔號器,效果圖:,北京傳智播客教育 ,電話拔號器,因為應(yīng)用要使用手機(jī)的電話服務(wù),所以要在清單文件AndroidManifest.xml中添加電話服務(wù)權(quán)限: 略. ,北京傳智播客教育 ,電話拔號器,界面布局: LinearLayout (線性布局)、AbsoluteLayout(絕對布局)、RelativeLayout(相對布局)、TableLayout(表格布局)、FrameLayout(幀布局),北京傳智播客教育 ,電話拔號器,Activity: publ
10、ic class DialerAction extends Activity Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() public void onClick(View v) EditT
11、ext editText = (EditText)findViewById(R.id.mobile); Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(tel:+ editText.getText(); DialerAction.this.startActivity(intent); ); ,北京傳智播客教育 ,電話拔號器,測試步驟: 1在Eclipse中運行此應(yīng)用 2在Dos窗口中進(jìn)入android SDK安裝路徑的tools目錄,輸入以下命令再開啟一個Android模擬器: emulator -data itcast 注:i
12、tcast為用戶數(shù)據(jù)存取文件,如果該文件不存在,默認(rèn)在tools目錄創(chuàng)建該文件 3在電話擾號器中輸入上圖現(xiàn)顯的電話號碼,北京傳智播客教育 ,短信發(fā)送器,效果圖:,北京傳智播客教育 ,短信發(fā)送器,因為應(yīng)用要使用手機(jī)的短信服務(wù),所以要在清單文件AndroidManifest.xml中添加短信服務(wù)權(quán)限: 略. ,北京傳智播客教育 ,短信發(fā)送器,界面布局: ,北京傳智播客教育 ,短信發(fā)送器,Activity主要代碼: String mobile = mobileView.getText().toString(); String content = contentView.getText().toStr
13、ing(); SmsManager smsManager = SmsManager.getDefault(); PendingIntent sentIntent = PendingIntent.getBroadcast(SMSSender.this, 0, new Intent(), 0); if(content.length()70)/如果字?jǐn)?shù)超過70,需拆分成多條短信發(fā)送 List msgs = smsManager.divideMessage(content); for(String msg : msgs) smsManager.sendTextMessage(mobile, null,
14、 msg, sentIntent, null); /最后二個參數(shù)為短信已發(fā)送的廣播意圖,最后一個參數(shù)為短信對方已收到短信的廣播意圖 else smsManager.sendTextMessage(mobile, null, content, sentIntent, null); Toast.makeText(SMSSender.this, 短信發(fā)送完成, Toast.LENGTH_LONG).show();,北京傳智播客教育 ,短信發(fā)送器,測試步驟: 1在Eclipse中運行此應(yīng)用 2在Dos窗口中進(jìn)入android SDK安裝路徑的tools目錄,輸入以下命令再開啟一個Android模擬器:
15、 emulator -data itcast 注:itcast為用戶數(shù)據(jù)存取文件,如果該文件不存在,默認(rèn)在tools目錄創(chuàng)建該文件 3在短信發(fā)送器的手機(jī)號中輸入上圖現(xiàn)顯的電話號碼 注:目前Android系統(tǒng)對中文短信尚未支持,所以發(fā)送中文短信會有亂碼,這個問題日后會被解決的。,北京傳智播客教育 ,數(shù)據(jù)存儲與訪問,很多時候我們的軟件需要對處理后的數(shù)據(jù)進(jìn)行存儲或再次訪問。Android為數(shù)據(jù)存儲提供了多種方式,分別有如下幾種: 文件 SharedPreferences SQLite數(shù)據(jù)庫 內(nèi)容提供者(Content provider) 網(wǎng)絡(luò),北京傳智播客教育 ,使用文件進(jìn)行數(shù)據(jù)存儲,首先給大家介紹
16、使用文件如何對數(shù)據(jù)進(jìn)行存儲,Activity提供了openFileOutput()方法可以用于把數(shù)據(jù)輸出到文件中,具體的實現(xiàn)過程與在J2SE環(huán)境中保存數(shù)據(jù)到文件中是一樣的。 public class FileActivity extends Activity Override public void onCreate(Bundle savedInstanceState) . FileOutputStream outStream = this.openFileOutput(itcast.txt, Context.MODE_PRIVATE); outStream.write(傳智播客.getByt
17、es(); outStream.close(); openFileOutput()方法的第一參數(shù)用于指定文件名稱,不能包含路徑分隔符“/” ,如果文件不存在,Android 會自動創(chuàng)建它。創(chuàng)建的文件保存在/data/data/files目錄,如: /data/data/cn.itcast.action/files/itcast.txt ,通過點擊Eclipse菜單“Window”-“Show View”-“Other”,在對話窗口中展開android文件夾,選擇下面的File Explorer視圖,然后在File Explorer視圖中展開/data/data/files目錄就可以看到該文件。
18、 openFileOutput()方法的第二參數(shù)用于指定操作模式,有四種模式,分別為: Context.MODE_PRIVATE = 0 Context.MODE_APPEND = 32768 Context.MODE_WORLD_READABLE = 1 Context.MODE_WORLD_WRITEABLE = 2,北京傳智播客教育 ,使用文件進(jìn)行數(shù)據(jù)存儲,Context.MODE_PRIVATE:為默認(rèn)操作模式,代表該文件是私有數(shù)據(jù),只能被應(yīng)用本身訪問,在該模式下,寫入的內(nèi)容會覆蓋原文件的內(nèi)容,如果想把新寫入的內(nèi)容追加到原文件中??梢允褂肅ontext.MODE_APPEND Cont
19、ext.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內(nèi)容,否則就創(chuàng)建新文件。 Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應(yīng)用是否有權(quán)限讀寫該文件。 MODE_WORLD_READABLE:表示當(dāng)前文件可以被其他應(yīng)用讀??;MODE_WORLD_WRITEABLE:表示當(dāng)前文件可以被其他應(yīng)用寫入。 如果希望文件被其他應(yīng)用讀和寫,可以傳入: openFileOutput(itcast.txt, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRIT
20、EABLE); android有一套自己的安全模型,當(dāng)應(yīng)用程序(.apk)在安裝時系統(tǒng)就會分配給他一個userid,當(dāng)該應(yīng)用要去訪問其他資源比如文件的時候,就需要userid匹配。默認(rèn)情況下,任何應(yīng)用創(chuàng)建的文件,sharedpreferences,數(shù)據(jù)庫都應(yīng)該是私有的(位于/data/data/files),其他程序無法訪問。除非在創(chuàng)建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其他程序才能正確訪問。,北京傳智播客教育 ,讀取文件內(nèi)容,如果要打開存放在/data/data/files目錄應(yīng)用私有的文件,可
21、以使用Activity提供openFileInput()方法。 FileInputStream inStream = this.getContext().openFileInput(itcast.txt); Log.i(FileTest, readInStream(inStream); readInStream()的方法請看本頁下面?zhèn)渥ⅰ?或者直接使用文件的絕對路徑: File file = new File(/data/data/cn.itcast.action/files/itcast.txt); FileInputStream inStream = new FileInputStream
22、(file); Log.i(FileTest, readInStream(inStream); 注意:上面文件路徑中的“cn.itcast.action”為應(yīng)用所在包,當(dāng)你在編寫代碼時應(yīng)替換為你自己應(yīng)用使用的包。 對于私有文件只能被創(chuàng)建該文件的應(yīng)用訪問,如果希望文件能被其他應(yīng)用讀和寫,可以在創(chuàng)建文件時,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權(quán)限。 Activity還提供了getCacheDir()和getFilesDir()方法: getCacheDir()方法用于獲取/data/data/cache目錄 getFi
23、lesDir()方法用于獲取/data/data/files目錄,北京傳智播客教育 ,把文件存放在SDCard,使用Activity的openFileOutput()方法保存文件,文件是存放在手機(jī)空間上,一般手機(jī)的存儲空間不是很大,存放些小文件還行,如果要存放像視頻這樣的大文件,是不可行的。對于像視頻這樣的大文件,我們可以把它存放在SDCard。 SDCard是干什么的?你可以把它看作是移動硬盤或U盤。 在模擬器中使用SDCard,你需要先創(chuàng)建一張SDCard卡(當(dāng)然不是真的SDCard,只是鏡像文件)。創(chuàng)建SDCard可以在Eclipse創(chuàng)建模擬器時隨同創(chuàng)建,也可以使用DOS命令進(jìn)行創(chuàng)建,如
24、下: 在Dos窗口中進(jìn)入android SDK安裝路徑的tools目錄,輸入以下命令創(chuàng)建一張容量為2G的SDCard,文件后綴可以隨便取,建議使用.img: mksdcard 2048M D:AndroidToolsdcard.img 在程序中訪問SDCard,你需要申請訪問SDCard的權(quán)限。 在AndroidManifest.xml中加入訪問SDCard的權(quán)限如下: ,北京傳智播客教育 ,把文件存放在SDCard,要往SDCard存放文件,程序必須先判斷手機(jī)是否裝有SDCard,并且可以進(jìn)行讀寫。 注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的權(quán)
25、限 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) File sdCardDir = Environment.getExternalStorageDirectory();/獲取SDCard目錄 File saveFile = new File(sdCardDir, “itcast.txt”); FileOutputStream outStream = new FileOutputStream(saveFile); outStream.write(傳智播客.getBytes(); outStre
26、am.close(); Environment.getExternalStorageState()方法用于獲取SDCard的狀態(tài),如果手機(jī)裝有SDCard,并且可以進(jìn)行讀寫,那么方法返回的狀態(tài)等于Environment.MEDIA_MOUNTED。 Environment.getExternalStorageDirectory()方法用于獲取SDCard的目錄,當(dāng)然要獲取SDCard的目錄,你也可以這樣寫: File sdCardDir = new File(/sdcard); /獲取SDCard目錄 File saveFile = new File(sdCardDir, itcast.txt
27、); /上面兩句代碼可以合成一句: File saveFile = new File(/sdcard/itcast.txt); FileOutputStream outStream = new FileOutputStream(saveFile); outStream.write(傳智播客test.getBytes(); outStream.close();,北京傳智播客教育 ,使用SAX或者DOM或者pull讀取XML文件,在Android平臺上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附帶的pull解析器
28、解析XML文件。 下面是本例子要解析的XML文件: 文件名稱:itcast.xml 李明 30 李向梅 25 例子定義了一個javabean用于存放上面解析出來的xml內(nèi)容, 這個javabean為Person,代碼請見本頁下面?zhèn)渥ⅲ?北京傳智播客教育 ,使用SAX讀取XML文件,SAX是一個解析速度快并且占用內(nèi)存少的xml解析器,非常適合用于Android等移動設(shè)備。 SAX解析XML文件采用的是事件驅(qū)動,也就是說,它并不需要解析完整個文檔,在按內(nèi)容順序解析文檔的過程中,SAX會判斷當(dāng)前讀到的字符是否合法XML語法中的某部分,如果符合就會觸發(fā)事件。所謂事件,其實就是一些回調(diào)(callback
29、)方法,這些方法(事件)定義在ContentHandler接口。下面是一些ContentHandler接口常用的方法: startDocument() 當(dāng)遇到文檔的開頭的時候,調(diào)用這個方法,可以在其中做一些預(yù)處理的工作。 endDocument() 和上面的方法相對應(yīng),當(dāng)文檔結(jié)束的時候,調(diào)用這個方法,可以在其中做一些善后的工作。 startElement(String namespaceURI, String localName, String qName, Attributes atts) 當(dāng)讀到一個開始標(biāo)簽的時候,會觸發(fā)這個方法。namespaceURI就是命名空間,localName是不
30、帶命名空間前綴的標(biāo)簽名,qName是帶命名空間前綴的標(biāo)簽名。通過atts可以得到所有的屬性名和相應(yīng)的值。要注意的是SAX中一個重要的特點就是它的流式處理,當(dāng)遇到一個標(biāo)簽的時候,它并不會紀(jì)錄下以前所碰到的標(biāo)簽,也就是說,在startElement()方法中,所有你所知道的信息,就是標(biāo)簽的名字和屬性,至于標(biāo)簽的嵌套結(jié)構(gòu),上層標(biāo)簽的名字,是否有子元屬等等其它與結(jié)構(gòu)相關(guān)的信息,都是不得而知的,都需要你的程序來完成。這使得SAX在編程處理上沒有DOM來得那么方便。 endElement(String uri, String localName, String name) 這個方法和上面的方法相對應(yīng),在遇
31、到結(jié)束標(biāo)簽的時候,調(diào)用這個方法。 characters(char ch, int start, int length) 這個方法用來處理在XML文件中讀到的內(nèi)容,第一個參數(shù)用于存放文件的內(nèi)容,后面兩個參數(shù)是讀到的字符串在這個數(shù)組中的起始位置和長度,使用new String(ch,start,length)就可以獲取內(nèi)容。,北京傳智播客教育 ,使用SAX讀取XML文件,只要為SAX提供實現(xiàn)ContentHandler接口的類,那么該類就可以得到通知事件(實際上就是SAX調(diào)用了該類中的回調(diào)方法)。因為ContentHandler是一個接口,在使用的時候可能會有些不方便,因此,SAX還為其制定了一個
32、Helper類:DefaultHandler,它實現(xiàn)了這個接口,但是其所有的方法體都為空,在實現(xiàn)的時候,你只需要繼承這個類,然后重載相應(yīng)的方法即可。使用SAX解析itcast.xml的代碼如下: public static List readXML(InputStream inStream) try SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser saxParser = spf.newSAXParser(); /創(chuàng)建解析器 /設(shè)置解析器的相關(guān)特性,/sax/features/namesp
33、aces = true 表示開啟命名空間特性 saxParser.setProperty(/sax/features/namespaces,true); XMLContentHandler handler = new XMLContentHandler(); saxParser.parse(inStream, handler); inStream.close(); return handler.getPersons(); catch (Exception e) e.printStackTrace(); return null; SAX 支持已內(nèi)置到JDK1.5中,你無
34、需添加任何的jar文件。關(guān)于XMLContentHandler的代碼實現(xiàn)請看本頁下面?zhèn)渥ⅰ?北京傳智播客教育 ,使用DOM讀取XML文件,除了可以使用 SAX解析XML文件,大家也可以使用熟悉的DOM來解析XML文件。 DOM解析XML文件時,會將XML文件的所有內(nèi)容讀取到內(nèi)存中,然后允許您使用DOM API遍歷XML樹、檢索所需的數(shù)據(jù)。使用DOM操作XML的代碼看起來比較直觀,并且,在某些方面比基于SAX的實現(xiàn)更加簡單。但是,因為DOM需要將XML文件的所有內(nèi)容讀取到內(nèi)存中,所以內(nèi)存的消耗比較大,特別對于運行Android的移動設(shè)備來說,因為設(shè)備的資源比較寶貴,所以建議還是采用SAX來解析X
35、ML文件,當(dāng)然,如果XML文件的內(nèi)容比較小采用DOM是可行的。 代碼請看本頁下方備注,北京傳智播客教育 ,使用Pull解析器讀取XML文件,除了可以使用 SAX和DOM解析XML文件,大家也可以使用Android內(nèi)置的Pull解析器解析XML文件。 Pull解析器的運行方式與 SAX 解析器相似。它提供了類似的事件,如:開始元素和結(jié)束元素事件,使用parser.next()可以進(jìn)入下一個元素并觸發(fā)相應(yīng)事件。事件將作為數(shù)值代碼被發(fā)送,因此可以使用一個switch對感興趣的事件進(jìn)行處理。當(dāng)元素開始解析時,調(diào)用parser.nextText()方法可以獲取下一個Text類型元素的值。 使用Pull解
36、析器讀取itcast.xml的代碼在本頁下方備注 Pull解析器的源碼及文檔下載網(wǎng)址:/,北京傳智播客教育 ,使用Pull解析器生成XML文件,有些時候,我們需要生成一個XML文件,生成XML文件的方法有很多,如:可以只使用一個StringBuilder組拼XML內(nèi)容,然后把內(nèi)容寫入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,這里推薦大家使用Pull解析器。 使用Pull解析器生成一個與itcast.xml文件內(nèi)容相同的myitcast.xml文件,代碼在本頁下方備注 使用代碼如下(生成XML文件): F
37、ile xmlFile = new File(myitcast.xml); FileOutputStream outStream = new FileOutputStream(xmlFile); OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, UTF-8); BufferedWriter writer = new BufferedWriter(outStreamWriter); writeXML(persons, writer); writer.flush(); writer.close(); 如果只
38、想得到生成的xml內(nèi)容,可以使用StringWriter: StringWriter writer = new StringWriter(); writeXML(persons, writer); String content = writer.toString();,北京傳智播客教育 ,使用SharedPreferences進(jìn)行數(shù)據(jù)存儲,很多時候我們開發(fā)的軟件需要向用戶提供軟件參數(shù)設(shè)置功能,例如我們常用的QQ,用戶可以設(shè)置是否允許陌生人添加自己為好友。對于軟件配置參數(shù)的保存,如果是window軟件通常我們會采用ini文件進(jìn)行保存,如果是j2se應(yīng)用,我們會采用properties屬性文件進(jìn)行
39、保存。如果是Android應(yīng)用,我們最適合采用什么方式保存軟件配置參數(shù)呢?Android平臺給我們提供了一個SharedPreferences類,它是一個輕量級的存儲類,特別適合用于保存軟件配置參數(shù)。使用SharedPreferences保存數(shù)據(jù),其背后是用xml文件存放數(shù)據(jù),文件存放在/data/data/shared_prefs目錄下: SharedPreferences sharedPreferences = getSharedPreferences(itcast, Context.MODE_PRIVATE); Editor editor = sharedPreferences.edit
40、();/獲取編輯器 editor.putString(name, 傳智播客); editor.putInt(age, 4); mit();/提交修改 生成的itcast.xml文件內(nèi)容如下: 傳智播客 因為SharedPreferences背后是使用xml文件保存數(shù)據(jù),getSharedPreferences(name,mode)方法的第一個參數(shù)用于指定該文件的名稱,名稱不用帶后綴,后綴會由Android自動加上。方法的第二個參數(shù)指定文件的操作模式,共有四種操作模式,這四種模式前面介紹使用文件方式保存數(shù)據(jù)時已經(jīng)講解過。如果希望SharedPreferences背后使用的xml文件能被其他應(yīng)用讀
41、和寫,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權(quán)限。 另外Activity還提供了另一個getPreferences(mode)方法操作SharedPreferences,這個方法默認(rèn)使用當(dāng)前類不帶包名的類名作為文件的名稱。,北京傳智播客教育 ,訪問SharedPreferences中的數(shù)據(jù),訪問SharedPreferences中的數(shù)據(jù)代碼如下: SharedPreferences sharedPreferences = getSharedPreferences(itcast, Context.MODE_PRIV
42、ATE); /getString()第二個參數(shù)為缺省值,如果preference中不存在該key,將返回缺省值 String name = sharedPreferences.getString(name, ); int age = sharedPreferences.getInt(age, 1); 如果訪問其他應(yīng)用中的Preference,前提條件是:該preference創(chuàng)建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE權(quán)限。如:有個為cn.itcast.action的應(yīng)用使用下面語句創(chuàng)建了preference。
43、getSharedPreferences(itcast, Context.MODE_WORLD_READABLE); 其他應(yīng)用要訪問上面應(yīng)用的preference,首先需要創(chuàng)建上面應(yīng)用的Context,然后通過Context 訪問preference ,訪問preference時會在應(yīng)用所在包下的shared_prefs目錄找到preference : Context otherAppsContext = createPackageContext(cn.itcast.action, Context.CONTEXT_IGNORE_SECURITY); SharedPreferences shar
44、edPreferences = otherAppsContext.getSharedPreferences(itcast, Context.MODE_WORLD_READABLE); String name = sharedPreferences.getString(name, ); int age = sharedPreferences.getInt(age, 0); 如果不通過創(chuàng)建Context訪問其他應(yīng)用的preference,可以以讀取xml文件方式直接訪問其他應(yīng)用preference對應(yīng)的xml文件,如: File xmlFile = new File(“/data/data/sha
45、red_prefs/itcast.xml”);/應(yīng)替換成應(yīng)用的包名,北京傳智播客教育 ,使用嵌入式關(guān)系型SQLite數(shù)據(jù)庫存儲數(shù)據(jù),除了可以使用文件或SharedPreferences存儲數(shù)據(jù),還可以選擇使用SQLite數(shù)據(jù)庫存儲數(shù)據(jù)。 在Android平臺上,集成了一個嵌入式關(guān)系型數(shù)據(jù)庫SQLite,SQLite3支持 NULL、INTEGER、REAL(浮點數(shù)字)、TEXT(字符串文本)和BLOB(二進(jìn)制對象)數(shù)據(jù)類型,雖然它支持的類型雖然只有五種,但實際上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等數(shù)據(jù)類型,只不過在運算或保存時會轉(zhuǎn)成對應(yīng)的五種數(shù)
46、據(jù)類型。 SQLite最大的特點是你可以保存任何類型的數(shù)據(jù)到任何字段中,無論這列聲明的數(shù)據(jù)類型是什么。例如:可以在Integer字段中存放字符串,或者在布爾型字段中存放浮點數(shù),或者在字符型字段中存放日期型值。 但有一種情況例外:定義為INTEGER PRIMARY KEY的字段只能存儲64位整數(shù), 當(dāng)向這種字段中保存除整數(shù)以外的數(shù)據(jù)時,將會產(chǎn)生錯誤。 另外, SQLite 在解析CREATE TABLE 語句時,會忽略 CREATE TABLE 語句中跟在字段名后面的數(shù)據(jù)類型信息,如下面語句會忽略 name字段的類型信息: CREATE TABLE person (personid integ
47、er primary key autoincrement, name varchar(20) SQLite可以解析大部分標(biāo)準(zhǔn)SQL語句,如: 查詢語句:select * from 表名 where 條件子句 group by 分組字句 having . order by 排序子句 如:select * from person select * from person order by id desc select name from person group by name having count(*)1 分頁SQL與mysql類似,下面SQL語句獲取5條記錄,跳過前面3條記錄 select
48、 * from Account limit 5 offset 3 或者 select * from Account limit 3,5 插入語句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(傳智,3) 更新語句:update 表名 set 字段名=值 where 條件子句。如:update person set name=傳智 where id=10 刪除語句:delete from 表名 where 條件子句。如:delete from person where id=10,北京傳智播客教育
49、 ,使用SQLiteDatabase操作SQLite數(shù)據(jù)庫,Android提供了一個名為SQLiteDatabase的類,該類封裝了一些操作數(shù)據(jù)庫的API,使用該類可以完成對數(shù)據(jù)進(jìn)行添加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete)操作(這些操作簡稱為CRUD)。對SQLiteDatabase的學(xué)習(xí),我們應(yīng)該重點掌握execSQL()和rawQuery()方法。 execSQL()方法可以執(zhí)行insert、delete、update和CREATE TABLE之類有更改行為的SQL語句; rawQuery()方法可以執(zhí)行select語句。 execSQL(
50、)方法的使用例子: SQLiteDatabase db = .; db.execSQL(insert into person(name, age) values(傳智播客, 4); db.close(); 執(zhí)行上面SQL語句會往person表中添加進(jìn)一條記錄,在實際應(yīng)用中, 語句中的“傳智播客”這些參數(shù)值應(yīng)該由用戶輸入界面提供,如果把用戶輸入的內(nèi)容原樣組拼到上面的insert語句, 當(dāng)用戶輸入的內(nèi)容含有單引號時,組拼出來的SQL語句就會存在語法錯誤。要解決這個問題需要對單引號進(jìn)行轉(zhuǎn)義,也就是把單引號轉(zhuǎn)換成兩個單引號。有些時候用戶往往還會輸入像“ execSQL(String sql, Obje
51、ct bindArgs)方法的第一個參數(shù)為SQL語句,第二個參數(shù)為SQL語句中占位符參數(shù)的值,參數(shù)值在數(shù)組中的順序要和占位符的位置對應(yīng)。,北京傳智播客教育 ,使用SQLiteDatabase操作SQLite數(shù)據(jù)庫,SQLiteDatabase的rawQuery() 用于執(zhí)行select語句,使用例子如下: SQLiteDatabase db = .; Cursor cursor = db.rawQuery(“select * from person”, null); while (cursor.moveToNext() int personid = cursor.getInt(0); /獲取第
52、一列的值,第一列的索引從0開始 String name = cursor.getString(1);/獲取第二列的值 int age = cursor.getInt(2);/獲取第三列的值 cursor.close(); db.close(); rawQuery()方法的第一個參數(shù)為select語句;第二個參數(shù)為select語句中占位符參數(shù)的值,如果select語句沒有使用占位符,該參數(shù)可以設(shè)置為null。帶占位符參數(shù)的select語句使用例子如下: Cursor cursor = db.rawQuery(select * from person where name like ? and a
53、ge=?, new String%傳智%, 4); Cursor是結(jié)果集游標(biāo),用于對結(jié)果集進(jìn)行隨機(jī)訪問,如果大家熟悉jdbc, 其實Cursor與JDBC中的ResultSet作用很相似。使用moveToNext()方法可以將游標(biāo)從當(dāng)前行移動到下一行,如果已經(jīng)移過了結(jié)果集的最后一行,返回結(jié)果為false,否則為true。另外Cursor 還有常用的moveToPrevious()方法(用于將游標(biāo)從當(dāng)前行移動到上一行,如果已經(jīng)移過了結(jié)果集的第一行,返回值為false,否則為true )、moveToFirst()方法(用于將游標(biāo)移動到結(jié)果集的第一行,如果結(jié)果集為空,返回值為false,否則為tr
54、ue )和moveToLast()方法(用于將游標(biāo)移動到結(jié)果集的最后一行,如果結(jié)果集為空,返回值為false,否則為true ) 。,北京傳智播客教育 ,使用SQLiteDatabase操作SQLite數(shù)據(jù)庫,除了前面給大家介紹的execSQL()和rawQuery()方法, SQLiteDatabase還專門提供了對應(yīng)于添加、刪除、更新、查詢的操作方法: insert()、delete()、update()和query() 。這些方法實際上是給那些不太了解SQL語法的菜鳥使用的,對于熟悉SQL語法的程序員而言,直接使用execSQL()和rawQuery()方法執(zhí)行SQL語句就能完成數(shù)據(jù)的添
55、加、刪除、更新、查詢操作。 Insert()方法用于添加數(shù)據(jù),各個字段的數(shù)據(jù)使用ContentValues進(jìn)行存放。 ContentValues類似于MAP,相對于MAP,它提供了存取數(shù)據(jù)對應(yīng)的put(String key, Xxx value)和getAsXxx(String key)方法, key為字段名稱,value為字段值,Xxx指的是各種常用的數(shù)據(jù)類型,如:String、Integer等。 SQLiteDatabase db = databaseHelper.getWritableDatabase(); ContentValues values = new ContentValues
56、(); values.put(name, 傳智播客); values.put(age, 4); long rowid = db.insert(“person”, null, values);/返回新添記錄的行號,與主鍵id無關(guān) 不管第三個參數(shù)是否包含數(shù)據(jù),執(zhí)行Insert()方法必然會添加一條記錄,如果第三個參數(shù)為空,會添加一條除主鍵之外其他字段值為Null的記錄。Insert()方法內(nèi)部實際上通過構(gòu)造insert語句完成數(shù)據(jù)的添加,Insert()方法的第二個參數(shù)用于指定空值字段的名稱,相信大家對此參數(shù)會感到疑惑,此參數(shù)的作用是干嘛的?是這樣的:如果第三個參數(shù)values 為Null或者元素
57、個數(shù)為0, Insert()方法必然要添加一條除了主鍵之外其它字段為Null值的記錄,為了滿足這條insert語句的語法, insert語句必須給定一個字段名,如:insert into person(name) values(NULL),倘若不給定字段名 , insert語句就成了這樣: insert into person() values(),顯然這不滿足標(biāo)準(zhǔn)SQL的語法。對于字段名,建議使用主鍵之外的字段,如果使用了INTEGER類型的主鍵字段,執(zhí)行類似insert into person(personid) values(NULL)的insert語句后,該主鍵字段值也不會為NULL。
58、如果第三個參數(shù)values 不為Null并且元素的個數(shù)大于0 ,可以把第二個參數(shù)設(shè)置為null。,北京傳智播客教育 ,使用SQLiteDatabase操作SQLite數(shù)據(jù)庫,delete()方法的使用: SQLiteDatabase db = databaseHelper.getWritableDatabase(); db.delete(person, personid?, new String2); db.close(); 上面代碼用于從person表中刪除personid小于2的記錄。 update()方法的使用: SQLiteDatabase db = databaseHelper.ge
59、tWritableDatabase(); ContentValues values = new ContentValues(); values.put(“name”, “傳智播客”);/key為字段名,value為值 db.update(person, values, personid=?, new String1); db.close(); 上面代碼用于把person表中personid等于1的記錄的name字段的值改為“傳智播客”。,北京傳智播客教育 ,使用SQLiteDatabase操作SQLite數(shù)據(jù)庫,query()方法實際上是把select語句拆分成了若干個組成部分,然后作為方法的輸入?yún)?shù): SQLiteDatabase db = databaseHelper.getWritableDatabase(); Cursor cursor = db.query(person, new Stringpersonid,name,age, name like ?, new String%傳智%, n
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030建筑材料產(chǎn)業(yè)分析及產(chǎn)業(yè)趨勢預(yù)測與項目管理策略研究報告
- 2025-2030建筑機(jī)械生產(chǎn)設(shè)備制造業(yè)行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 2025-2030建筑建材產(chǎn)業(yè)市場供需特點分析及投資機(jī)會研判規(guī)劃報告
- 未來五年草魚魚苗企業(yè)縣域市場拓展與下沉戰(zhàn)略分析研究報告
- 2026年中山市東區(qū)街道辦事處公開招聘專職消防員備考題庫有答案詳解
- 2026年中國信達(dá)云南分公司校園招聘備考題庫附答案詳解
- 2026年宜昌高新區(qū)人民醫(yī)院編外醫(yī)療衛(wèi)生專業(yè)技術(shù)人才招聘備考題庫完整答案詳解
- 2026年山東核電有限公司招聘備考題庫及1套完整答案詳解
- 2026年四川富潤所屬高校資產(chǎn)公司董事長公開招聘備考題庫及一套答案詳解
- 2026年慈溪市勝山鎮(zhèn)衛(wèi)生院公開招聘派遣制編外工作人員備考題庫及答案詳解1套
- 2025年大學(xué)第一學(xué)年(食品營養(yǎng)與健康)營養(yǎng)學(xué)基礎(chǔ)測試題及答案
- 2025-2030烏干達(dá)基于咖啡的種植行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 2026年共青團(tuán)中央所屬單位招聘66人備考題庫及答案詳解一套
- 人民警察法培訓(xùn)課件
- 2026年哈爾濱職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性考試題庫參考答案詳解
- 2025云南昆明巫家壩建設(shè)發(fā)展有限責(zé)任公司及下屬公司第四季度社會招聘31人歷年真題匯編帶答案解析
- 輸尿管切開取石課件
- 小貓絕育協(xié)議書
- 66kV及以下架空電力線路設(shè)計標(biāo)準(zhǔn)
- 2025年浙江乍浦經(jīng)濟(jì)開發(fā)區(qū)(嘉興港區(qū))區(qū)屬國有公司公開招聘28人筆試考試備考試題及答案解析
- 胃腸外科危重患者監(jiān)護(hù)與護(hù)理
評論
0/150
提交評論