知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏壧峁┍憬莸闹С郑?
Android數(shù)據(jù)存儲實(shí)現(xiàn)的5大方式
發(fā)表時間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):59
數(shù)據(jù)存儲在開辟中是應(yīng)用最頻繁的,在這里重要介紹Android平臺中實(shí)現(xiàn)數(shù)據(jù)存儲的5種方法,加倍體系具體的介紹了5種存儲的辦法和異同。
第一種: 應(yīng)用SharedPreferences存儲數(shù)據(jù)
SharedPreferences是Android平臺上一個輕量級的存儲類,主如果保存一些常用的設(shè)備比如窗口狀況,一般在Activity中 重載窗口狀況onSaveInstanceState保存一般應(yīng)用SharedPreferences完成,它供給了Android平臺慣例的Long長 整形、Int整形、String字符串型的保存。
它是什么樣的處理方法呢? SharedPreferences類似以前Windows體系上的ini設(shè)備文件,然則它分為多種權(quán)限,可以全局共享拜訪,android123提示最終是以xml方法來保存,整體效力來看不是特其余高,對于慣例的輕量級而言比SQLite要好不少,如不雅真的存儲量不大年夜可以推敲本身定義文件格式。xml 處理時Dalvik會經(jīng)由過程自帶底層的本地XML Parser解析,比如XMLpull方法,如許對于內(nèi)存資本占用比較好。
它的本質(zhì)是基于XML文件存儲key-value鍵值對數(shù)據(jù),平日用來存儲一些簡單的設(shè)備信息。
其存儲地位在/data/data/<包名>/shared_prefs目次下。
SharedPreferences對象本身只能獲取數(shù)據(jù)而不支撐存儲和修改,存儲修改是經(jīng)由過程Editor對象實(shí)現(xiàn)。
實(shí)現(xiàn)SharedPreferences存儲的步調(diào)如下:
一、根據(jù)Context獲取SharedPreferences對象
二、應(yīng)用edit()辦法獲取Editor對象。
三、經(jīng)由過程Editor對象存儲key-value鍵值對數(shù)據(jù)。
四、經(jīng)由過程commit()辦法提交數(shù)據(jù)。
下面是示例代碼:
Java代碼
這段代碼履行過后,即在/data/data/com.test/shared_prefs目次下生成了一個SP.xml文件,一個應(yīng)用可以創(chuàng)建多個如許的xml文件。
SharedPreferences對象與SQLite數(shù)據(jù)庫比擬,免除了創(chuàng)建數(shù)據(jù)庫,創(chuàng)建表,寫SQL語句等諸多操作,相對而言加倍便利,簡潔。然則SharedPreferences也有其自身缺點(diǎn),比如其本能機(jī)能存儲boolean,int,float,long和String五種簡單的數(shù)據(jù)類型,比如其無法進(jìn)行前提萌芽等。所以不論SharedPreferences的數(shù)據(jù)存儲操作是若何簡單,它也只能是存儲方法的一種彌補(bǔ),而無法完全替代如SQLite數(shù)據(jù)庫如許的其他數(shù)據(jù)存儲方法。
第二種: 內(nèi)部文件存儲數(shù)據(jù)
關(guān)于文件存儲,Activity供給了openFileOutput()辦法可以用于把數(shù)據(jù)輸出到文件中,具體的實(shí)現(xiàn)過程與在J2SE情況中保存數(shù)據(jù)到文件中是一樣的。
文件可用來存放大年夜量數(shù)據(jù),如文本、圖片、音頻等。
默認(rèn)地位:/data/data/<包>/files/***.***。
代碼示例:
Java代碼
openFileOutput()辦法的第一參數(shù)用于指定文件名稱,不克不及包含路徑分隔符“/” ,如不雅文件不存在,Android 會主動創(chuàng)建它。
創(chuàng)建的文件保存在/data/data/<package name>/files目次,如: /data/data/cn.itcast.action/files/itcast.txt ,經(jīng)由過程點(diǎn)擊Eclipse菜單“Window”-“Show View”-“Other”,在對話窗口中展開android文件夾,選擇下面的File Explorer視圖,然后在File Explorer視圖中展開/data/data/<package name>/files目次就可以看到該文件。
openFileOutput()辦法的第二參數(shù)用于指定操作模式,有四種模式,分別為:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:為默認(rèn)操作模式,代表該文件是私稀有據(jù),只能被應(yīng)用本身拜訪,在該模式下,寫入的內(nèi)容會覆蓋原文件的內(nèi)容,如不雅想把新寫入的內(nèi)容追加到原文件中??梢詰?yīng)用Context.MODE_APPEND
Context.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_WRITEABLE); android有一套本身的安然模型,當(dāng)應(yīng)用法度榜樣(.apk)在安裝時體系就會分派給他一個userid,當(dāng)該應(yīng)用要去拜訪其他資本好交手件的時刻,就須要userid匹配。默認(rèn)情況下,任何應(yīng)用創(chuàng)建的文件,sharedpreferences,數(shù)據(jù)庫都應(yīng)當(dāng)是私有的(位于/data/data/<package name>/files),其他法度榜樣無法拜訪。
除非在創(chuàng)建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有如許其他法度榜樣才能精確拜訪。
攫取文件示例:
Java代碼
對于私有文件只能被創(chuàng)建該文件的應(yīng)用拜訪,如不雅欲望文件能被其他應(yīng)用讀和寫,可以在創(chuàng)建文件時,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權(quán)限。
Activity還供給了getCacheDir()和getFilesDir()辦法: getCacheDir()辦法用于獲取/data/data/<package name>/cache目次 getFilesDir()辦法用于獲取/data/data/<package name>/files目次。
第三種: 外部文件存儲數(shù)據(jù)
把文件存入SDCard:
應(yīng)用Activity的openFileOutput()辦法保存文件,文件是存放在手機(jī)空間上,一般手機(jī)的存儲空間不是很大年夜,存放些小文件還行,如不雅要存放像視潑魅如許的大年夜文件,是弗成行的。對于像視潑魅如許的大年夜文件,我們可以把它存放在SDCard。
SDCard是干什么的?你可以把它看作是移動硬盤或U盤。 在模仿器中應(yīng)用SDCard,你須要先創(chuàng)建一張SDCard卡(當(dāng)然不是真的SDCard,只是鏡像文件)。
創(chuàng)建SDCard可以在Eclipse創(chuàng)建模仿器時伴隨創(chuàng)建,也可以應(yīng)用DOS敕令進(jìn)行創(chuàng)建,如下: 在Dos窗口中進(jìn)入android SDK安裝路徑的tools目次,輸入以下敕令創(chuàng)建一張容量為2G的SDCard,文件后綴可以隨便取,建議應(yīng)用.img: mksdcard 2048M D:\AndroidTool\sdcard.img 在法度榜樣中拜訪SDCard,你須要申請拜訪SDCard的權(quán)限。
在AndroidManifest.xml中參加拜訪SDCard的權(quán)限如下:
Java代碼
要往SDCard存放文件,法度榜樣必須先斷定手機(jī)是否裝有SDCard,并且可以進(jìn)行讀寫。
留意:拜訪SDCard必須在AndroidManifest.xml中參加拜訪SDCard的權(quán)限。
Java代碼
Environment.getExternalStorageState()辦法用于獲取SDCard的狀況,如不雅手機(jī)裝有SDCard,并且可以進(jìn)行讀寫,那么辦法返回的狀況等于Environment.MEDIA_MOUNTED。
Environment.getExternalStorageDirectory()辦法用于獲取SDCard的目次,當(dāng)然要獲取SDCard的目次,你也可以如許寫:
Java代碼
第四種: SQLite數(shù)據(jù)庫存儲數(shù)據(jù)
SQLite是輕量級嵌入式數(shù)據(jù)庫引擎,它支撐 SQL 說話,并且只應(yīng)用很少的內(nèi)存就有很好的機(jī)能。此外它照樣開源的,任何人都可以應(yīng)用它。很多開源項目((Mozilla, PHP, Python)都應(yīng)用了 SQLite.SQLite 由以下幾個組件構(gòu)成:SQL 編譯器、內(nèi)核、后端以及附件。SQLite 經(jīng)由過程應(yīng)用虛擬機(jī)和虛擬數(shù)據(jù)庫引擎(VDBE),使調(diào)試、修改和擴(kuò)大 SQLite 的內(nèi)核變得加倍便利。
特點(diǎn):
面向資本竽暌剮限的設(shè)備,
沒有辦事器過程,
所稀有據(jù)存放在同一文件中跨平臺,
可自由復(fù)制。
SQLite 內(nèi)部構(gòu)造:
[img]http://dl2.iteye.com/upload/attachment/0104/3780/9215176d-cf77-33f6-9b1c-885ea36d90f1.jpg
SQLite 根本上相符 SQL-92 標(biāo)準(zhǔn),和其他的重要 SQL 數(shù)據(jù)庫沒什么差別。它的長處就是高效,Android 運(yùn)行時情況包含了完全的 SQLite。
SQLite 和其他數(shù)據(jù)庫最大年夜的不合就是對數(shù)據(jù)類型的支撐,創(chuàng)建一個表時,可以在 CREATE TABLE 語句中指定某列的數(shù)據(jù)類型,然則你可以把任何數(shù)據(jù)類型放入任何列中。當(dāng)某個值插入數(shù)據(jù)庫時,SQLite 將檢查它的類型。如不雅該類型與接洽關(guān)系的列不匹配,則 SQLite 會測驗(yàn)測驗(yàn)將該值轉(zhuǎn)換成該列的類型。如不雅不克不及轉(zhuǎn)換,則該值將作為其本身具有的類型存儲。比如可以把一個字符串(String)放入 INTEGER 列。SQLite 稱這為“弱類型”(manifest typing.)。 此外,SQLite 不支撐一些標(biāo)準(zhǔn)的 SQL 功能,特別是外鍵束縛(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 還有一些 ALTER TABLE 功能。 除了上述功能外,SQLite 是一個完全的 SQL 體系,擁有完全的觸發(fā)器,交易等等。
Android 集成了 SQLite 數(shù)據(jù)庫 Android 在運(yùn)行時(run-time)集成了 SQLite,所以每個 Android 應(yīng)用法度榜樣都可以應(yīng)用 SQLite 數(shù)據(jù)庫。
對于熟悉 SQL 的開辟人員來時,在 Android 開辟中應(yīng)用 SQLite 相當(dāng)簡單。然則,因?yàn)?JDBC 會消費(fèi)太多的體系資本,所以 JDBC 對于手機(jī)這種內(nèi)存受限設(shè)備來說并不合適。是以,Android 供給了一些新的 API 來應(yīng)用 SQLite 數(shù)據(jù)庫,Android 開辟中,法度榜樣員須要學(xué)應(yīng)用這些 API。
數(shù)據(jù)庫存儲在 data/< 項目文件夾 >/databases/ 下。 Android 開辟中應(yīng)用 SQLite 數(shù)據(jù)庫 Activites 可以經(jīng)由過程 Content Provider 或者 Service 拜訪一個數(shù)據(jù)庫。
下面會具體講解如不雅創(chuàng)建數(shù)據(jù)庫,添加數(shù)據(jù)和萌芽數(shù)據(jù)庫。 創(chuàng)建數(shù)據(jù)庫 Android 不主動供給數(shù)據(jù)庫。在 Android 應(yīng)用法度榜樣中應(yīng)用 SQLite,必須本身創(chuàng)建數(shù)據(jù)庫,然后創(chuàng)建表、索引,填充數(shù)據(jù)。
Android 供給了 SQLiteOpenHelper 贊助你創(chuàng)建一個數(shù)據(jù)庫,你只要持續(xù) SQLiteOpenHelper 類,就可以輕松的創(chuàng)建數(shù)據(jù)庫。SQLiteOpenHelper 類根據(jù)開辟應(yīng)用法度榜樣的須要,封裝了創(chuàng)建和更新數(shù)據(jù)庫應(yīng)用的邏輯。
SQLiteOpenHelper 的子類,至少須要實(shí)現(xiàn)三個辦法:
1 構(gòu)造函數(shù),調(diào)用父類 SQLiteOpenHelper 的構(gòu)造函數(shù)。這個辦法須要四個參數(shù):高低文情況(例如,一個 Activity),數(shù)據(jù)庫名字,一個可選的游標(biāo)工廠(平日是 Null),一個代表你正在應(yīng)用的數(shù)據(jù)庫模型版本的┞符數(shù)。
2 onCreate()辦法,它須要一個 SQLiteDatabase 對象作為參數(shù),根據(jù)須要對這個對象填充表和初始化數(shù)據(jù)。
3 onUpgrage() 辦法,它須要三個參數(shù),一個 SQLiteDatabase 對象,一個舊的版本號和一個新的版本號,如許你就可以清跋假使何把一個數(shù)據(jù)庫大年夜舊的模型改變到新的模型。
下面示例代碼展示了若何持續(xù) SQLiteOpenHelper 創(chuàng)建數(shù)據(jù)庫:
Java代碼
接下來評論辯論具體若何創(chuàng)建表、插入數(shù)據(jù)、刪除表等等。調(diào)用 getReadableDatabase() 或 getWriteableDatabase() 辦法,你可以獲得 SQLiteDatabase 實(shí)例,具體調(diào)用那個辦法,取決于你是否須要改變數(shù)據(jù)庫的內(nèi)容:
Java代碼
膳綾擎這段代碼會返回一個 SQLiteDatabase 類的實(shí)例,應(yīng)用這個對象,你就可以萌芽或者修改數(shù)據(jù)庫。 當(dāng)你完成了對數(shù)據(jù)庫的操作(例如你的 Activity 已經(jīng)封閉),須要調(diào)用 SQLiteDatabase 的 Close() 辦法來釋放掉落數(shù)據(jù)庫連接。 創(chuàng)建表和索引 為了創(chuàng)建表和索引,須要調(diào)用 SQLiteDatabase 的 execSQL() 辦法來履行 DDL 語句。如不雅沒有異常,這個辦法沒有返回值。
例如,你可以履行如下代碼:
db.execSQL(“CREATE TABLE mytable (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, value REAL);”);
這條語句會創(chuàng)建一個名為 mytable 的表,表有一個列名為 _id,并且是主鍵,這列的值是會主動增長的┞符數(shù)(例如,當(dāng)你插入一行時,SQLite 會給這列主動賦值),別的還有兩列:title( 字符 ) 和 value( 浮點(diǎn)數(shù) )。 SQLite 會主動為主鍵列創(chuàng)建索引。 平日情況下,第一次創(chuàng)建數(shù)據(jù)庫時創(chuàng)建了表和索引。
如不雅你不須要改變表的 schema,不須要刪除表和索引 . 刪除表和索引,須要應(yīng)用 execSQL() 辦法調(diào)用 DROP INDEX 和 DROP TABLE 語句。 給表添加數(shù)據(jù) 膳綾擎的代碼,已經(jīng)創(chuàng)建了數(shù)據(jù)庫和表,如今須要給表添加數(shù)據(jù)。有兩種辦法可以給表添加數(shù)據(jù)。
像膳綾擎創(chuàng)建表一樣,你可以應(yīng)用 execSQL() 辦法履行 INSERT, UPDATE, DELETE 等語句來更新表的數(shù)據(jù)。execSQL() 辦法實(shí)用于所有不返回結(jié)不雅的 SQL 語句。
例如: db.execSQL(“INSERT INTO widgets (name, inventory)”+ “VALUES (‘Sprocket’, 5)”);
另一種辦法是應(yīng)用 SQLiteDatabase 對象的 insert(), update(), delete() 辦法。這些辦法把 SQL 語句的一部分作為參數(shù)。
示例如下:
Java代碼
update()辦法有四個參數(shù),分別是表名,表示列名和值的 ContentValues 對象,可選的 WHERE 前提和可選的填充 WHERE 語句的字符串,這些字符串會調(diào)換 WHERE 前提中的“?”標(biāo)記。
update() 根據(jù)前提,更新指定列的值,所以用 execSQL() 辦法可以達(dá)到同樣的目標(biāo)。 WHERE 前提和其參數(shù)和用過的其他 SQL APIs 類似。
例如:
String[] parms=new String[] {“this is a string”};
db.update(“widgets”, WordStrments, “name=?”, parms);
delete() 辦法的應(yīng)用和 update() 類似,應(yīng)用表名,可選的 WHERE 前提和響應(yīng)的填充 WHERE 前提的字符串。 萌芽數(shù)據(jù)庫 類似 INSERT, UPDATE, DELETE,有兩種辦法應(yīng)用 SELECT 大年夜 SQLite 數(shù)據(jù)庫檢索數(shù)據(jù)。
1 .應(yīng)用 rawQuery() 直接調(diào)用 SELECT 語句; 應(yīng)用 query() 辦法構(gòu)建一個萌芽。
Raw Queries 正如 API 名字,rawQuery() 是最簡單的解決辦法。經(jīng)由過程這個辦法你就可聲調(diào)用 SQL SELECT 語句。
例如: Cursor c=db.rawQuery( “SELECT name FROM sqlite_master WHERE type=’table’ AND name=’mytable’”, null);
在膳綾擎例子中,我們萌芽 SQLite 體系表(sqlite_master)檢查 table 表是否存在。返回值是一個 cursor 對象,這個對象的辦法可以迭代萌芽結(jié)不雅。 如不雅萌芽是動態(tài)的,應(yīng)用這個辦法就會異常復(fù)雜。
例如,當(dāng)你須要萌芽的列在法度榜樣編譯的時刻不克不及肯定,這時刻應(yīng)用 query() 辦法會便利很多。
Regular Queries query() 辦法用 SELECT 語句段構(gòu)建萌芽。SELECT 語句內(nèi)容作為 query() 辦法的參數(shù),比如:要萌芽的表名,要獲取的字段名,WHERE 前提,包含可選的地位參數(shù),去替代 WHERE 前提中地位參數(shù)的值,GROUP BY 前提,HAVING 前提。 除了表名,其他參數(shù)可所以 null。所以,以前的代碼段可以可寫成:
String[] columns={“ID”, ”inventory”};
Java代碼
應(yīng)用游標(biāo)
不管你若何履行萌芽,都邑返回一個 Cursor,這是 Android 的 SQLite 數(shù)據(jù)庫游標(biāo),
應(yīng)用游標(biāo),你可以:
經(jīng)由過程應(yīng)用 getCount() 辦法獲得結(jié)不雅集中有若干記錄;
經(jīng)由過程 moveToFirst(), moveToNext(), 和 isAfterLast() 辦法遍歷所有記錄;
經(jīng)由過程 getColumnNames() 獲得字段名;
經(jīng)由過程 getColumnIndex() 轉(zhuǎn)換成字段號;
經(jīng)由過程 getString(),getInt() 等辦法獲得給定字段當(dāng)前記錄的值;
經(jīng)由過程 requery() 辦法從新履行萌芽獲得游標(biāo);
經(jīng)由過程 close() 辦法釋放游標(biāo)資本;
例如,下面代碼遍歷 mytable 表:
Java代碼
在 Android 中應(yīng)用 SQLite 數(shù)據(jù)庫治理對象 在其他數(shù)據(jù)庫上作開辟,一般都應(yīng)用對象來檢查和處理數(shù)據(jù)庫的內(nèi)容,而不是僅僅應(yīng)用數(shù)據(jù)庫的 API。
應(yīng)用 Android 模仿器,有兩種可供選擇的辦法來治理數(shù)據(jù)庫。
起首,模仿器綁定了 sqlite3 控制臺法度榜樣,可以應(yīng)用 adb shell 敕令來調(diào)用他。只要你進(jìn)入了模仿器的 shell,在數(shù)據(jù)庫的路徑履行 sqlite3 敕令就可以了。
數(shù)據(jù)庫文件一般存放在: /data/data/your.app.package/databases/your-db-name 如不雅你愛好應(yīng)用更友愛的對象,你可以把數(shù)據(jù)庫拷貝到你的開辟機(jī)上,應(yīng)用 SQLite-aware 客戶妒攀來操作它。如許的話,你在一個數(shù)據(jù)庫的拷貝上操作,如不雅你想要你的修改能反竽暌鉤到設(shè)備上,你須要把數(shù)據(jù)庫備份歸去。
把數(shù)據(jù)庫大年夜設(shè)備上考出來,你可以應(yīng)用 adb pull 敕令(或者在 IDE 上做響應(yīng)操作)。
存儲一個修悛改的數(shù)據(jù)庫到設(shè)備上,應(yīng)用 adb push 敕令。 一個最便利的 SQLite 客戶端是 FireFox SQLite Manager 擴(kuò)大,它可以跨所有平臺應(yīng)用。
下圖是SQLite Manager對象:
[img]http://dl2.iteye.com/upload/attachment/0104/3785/e6fabbe0-0372-34ff-b96b-8ddbfc322f89.jpg
如不雅你想要開辟 Android 應(yīng)用法度榜樣,必定須要在 Android 上存儲數(shù)據(jù),應(yīng)用 SQLite 數(shù)據(jù)庫是一種異常好的選擇。
第五種: 收集存儲數(shù)據(jù)
前面介紹的幾種存儲都是將數(shù)據(jù)存儲在本地設(shè)備上,除此之外,還有一種存儲(獲取)數(shù)據(jù)的方法,經(jīng)由過程收集來實(shí)現(xiàn)數(shù)據(jù)的存儲和獲取。
我們可聲調(diào)用WebService返回的數(shù)據(jù)或是解析HTTP協(xié)定實(shí)現(xiàn)收集數(shù)據(jù)交互。
具體須要熟悉java.net.*,Android.net.*這兩個包的內(nèi)容,在這就不贅述了,請大年夜家參閱相干文檔。
下面是一個經(jīng)由過程地區(qū)名稱萌芽該地區(qū)的氣象預(yù)告,以POST發(fā)送的方法發(fā)送請求到webservicex.net站點(diǎn),拜訪WebService.webservicex.net站點(diǎn)上供給萌芽氣象預(yù)告的辦事。
代碼如下:
Java代碼
別忘記了在設(shè)備文件中設(shè)置拜訪收集權(quán)限:
Java代碼
第一種: 應(yīng)用SharedPreferences存儲數(shù)據(jù)
SharedPreferences是Android平臺上一個輕量級的存儲類,主如果保存一些常用的設(shè)備比如窗口狀況,一般在Activity中 重載窗口狀況onSaveInstanceState保存一般應(yīng)用SharedPreferences完成,它供給了Android平臺慣例的Long長 整形、Int整形、String字符串型的保存。
它是什么樣的處理方法呢? SharedPreferences類似以前Windows體系上的ini設(shè)備文件,然則它分為多種權(quán)限,可以全局共享拜訪,android123提示最終是以xml方法來保存,整體效力來看不是特其余高,對于慣例的輕量級而言比SQLite要好不少,如不雅真的存儲量不大年夜可以推敲本身定義文件格式。xml 處理時Dalvik會經(jīng)由過程自帶底層的本地XML Parser解析,比如XMLpull方法,如許對于內(nèi)存資本占用比較好。
它的本質(zhì)是基于XML文件存儲key-value鍵值對數(shù)據(jù),平日用來存儲一些簡單的設(shè)備信息。
其存儲地位在/data/data/<包名>/shared_prefs目次下。
SharedPreferences對象本身只能獲取數(shù)據(jù)而不支撐存儲和修改,存儲修改是經(jīng)由過程Editor對象實(shí)現(xiàn)。
實(shí)現(xiàn)SharedPreferences存儲的步調(diào)如下:
一、根據(jù)Context獲取SharedPreferences對象
二、應(yīng)用edit()辦法獲取Editor對象。
三、經(jīng)由過程Editor對象存儲key-value鍵值對數(shù)據(jù)。
四、經(jīng)由過程commit()辦法提交數(shù)據(jù)。
下面是示例代碼:
Java代碼
- public class MainActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //獲取SharedPreferences對象
- Context ctx = MainActivity.this;
- SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
- //存入數(shù)據(jù)
- Editor editor = sp.edit();
- editor.putString("STRING_KEY", "string");
- editor.putInt("INT_KEY", 0);
- editor.putBoolean("BOOLEAN_KEY", true);
- editor.commit();
- //返回STRING_KEY的值
- Log.d("SP", sp.getString("STRING_KEY", "none"));
- //如不雅NOT_EXIST不存在,則返回值為"none"
- Log.d("SP", sp.getString("NOT_EXIST", "none"));
- }
- }
這段代碼履行過后,即在/data/data/com.test/shared_prefs目次下生成了一個SP.xml文件,一個應(yīng)用可以創(chuàng)建多個如許的xml文件。
SharedPreferences對象與SQLite數(shù)據(jù)庫比擬,免除了創(chuàng)建數(shù)據(jù)庫,創(chuàng)建表,寫SQL語句等諸多操作,相對而言加倍便利,簡潔。然則SharedPreferences也有其自身缺點(diǎn),比如其本能機(jī)能存儲boolean,int,float,long和String五種簡單的數(shù)據(jù)類型,比如其無法進(jìn)行前提萌芽等。所以不論SharedPreferences的數(shù)據(jù)存儲操作是若何簡單,它也只能是存儲方法的一種彌補(bǔ),而無法完全替代如SQLite數(shù)據(jù)庫如許的其他數(shù)據(jù)存儲方法。
第二種: 內(nèi)部文件存儲數(shù)據(jù)
關(guān)于文件存儲,Activity供給了openFileOutput()辦法可以用于把數(shù)據(jù)輸出到文件中,具體的實(shí)現(xiàn)過程與在J2SE情況中保存數(shù)據(jù)到文件中是一樣的。
文件可用來存放大年夜量數(shù)據(jù),如文本、圖片、音頻等。
默認(rèn)地位:/data/data/<包>/files/***.***。
代碼示例:
Java代碼
- public void save()
- {
- try {
- FileOutputStream outStream=this.openFileOutput("a.txt",Context.MODE_WORLD_READABLE);
- outStream.write(text.getText().toString().getBytes());
- outStream.close();
- Toast.makeText(MyActivity.this,"Saved",Toast.LENGTH_LONG).show();
- } catch (FileNotFoundException e) {
- return;
- }
- catch (IOException e){
- return ;
- }
- }
openFileOutput()辦法的第一參數(shù)用于指定文件名稱,不克不及包含路徑分隔符“/” ,如不雅文件不存在,Android 會主動創(chuàng)建它。
創(chuàng)建的文件保存在/data/data/<package name>/files目次,如: /data/data/cn.itcast.action/files/itcast.txt ,經(jīng)由過程點(diǎn)擊Eclipse菜單“Window”-“Show View”-“Other”,在對話窗口中展開android文件夾,選擇下面的File Explorer視圖,然后在File Explorer視圖中展開/data/data/<package name>/files目次就可以看到該文件。
openFileOutput()辦法的第二參數(shù)用于指定操作模式,有四種模式,分別為:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:為默認(rèn)操作模式,代表該文件是私稀有據(jù),只能被應(yīng)用本身拜訪,在該模式下,寫入的內(nèi)容會覆蓋原文件的內(nèi)容,如不雅想把新寫入的內(nèi)容追加到原文件中??梢詰?yīng)用Context.MODE_APPEND
Context.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_WRITEABLE); android有一套本身的安然模型,當(dāng)應(yīng)用法度榜樣(.apk)在安裝時體系就會分派給他一個userid,當(dāng)該應(yīng)用要去拜訪其他資本好交手件的時刻,就須要userid匹配。默認(rèn)情況下,任何應(yīng)用創(chuàng)建的文件,sharedpreferences,數(shù)據(jù)庫都應(yīng)當(dāng)是私有的(位于/data/data/<package name>/files),其他法度榜樣無法拜訪。
除非在創(chuàng)建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有如許其他法度榜樣才能精確拜訪。
攫取文件示例:
Java代碼
- public void load()
- {
- try {
- FileInputStream inStream=this.openFileInput("a.txt");
- ByteArrayOutputStream stream=new ByteArrayOutputStream();
- byte[] buffer=new byte[1024];
- int length=-1;
- while((length=inStream.read(buffer))!=-1) {
- stream.write(buffer,0,length);
- }
- stream.close();
- inStream.close();
- text.setText(stream.toString());
- Toast.makeText(MyActivity.this,"Loaded",Toast.LENGTH_LONG).show();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- catch (IOException e){
- return ;
- }
- }
對于私有文件只能被創(chuàng)建該文件的應(yīng)用拜訪,如不雅欲望文件能被其他應(yīng)用讀和寫,可以在創(chuàng)建文件時,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權(quán)限。
Activity還供給了getCacheDir()和getFilesDir()辦法: getCacheDir()辦法用于獲取/data/data/<package name>/cache目次 getFilesDir()辦法用于獲取/data/data/<package name>/files目次。
第三種: 外部文件存儲數(shù)據(jù)
把文件存入SDCard:
應(yīng)用Activity的openFileOutput()辦法保存文件,文件是存放在手機(jī)空間上,一般手機(jī)的存儲空間不是很大年夜,存放些小文件還行,如不雅要存放像視潑魅如許的大年夜文件,是弗成行的。對于像視潑魅如許的大年夜文件,我們可以把它存放在SDCard。
SDCard是干什么的?你可以把它看作是移動硬盤或U盤。 在模仿器中應(yīng)用SDCard,你須要先創(chuàng)建一張SDCard卡(當(dāng)然不是真的SDCard,只是鏡像文件)。
創(chuàng)建SDCard可以在Eclipse創(chuàng)建模仿器時伴隨創(chuàng)建,也可以應(yīng)用DOS敕令進(jìn)行創(chuàng)建,如下: 在Dos窗口中進(jìn)入android SDK安裝路徑的tools目次,輸入以下敕令創(chuàng)建一張容量為2G的SDCard,文件后綴可以隨便取,建議應(yīng)用.img: mksdcard 2048M D:\AndroidTool\sdcard.img 在法度榜樣中拜訪SDCard,你須要申請拜訪SDCard的權(quán)限。
在AndroidManifest.xml中參加拜訪SDCard的權(quán)限如下:
Java代碼
- <!-- 在SDCard中創(chuàng)建與刪除文件權(quán)限 -->
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
- <!-- 往SDCard寫入數(shù)據(jù)權(quán)限 -->
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
要往SDCard存放文件,法度榜樣必須先斷定手機(jī)是否裝有SDCard,并且可以進(jìn)行讀寫。
留意:拜訪SDCard必須在AndroidManifest.xml中參加拜訪SDCard的權(quán)限。
Java代碼
- if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
- File sdCardDir = Environment.getExternalStorageDirectory();//獲取SDCard目次
- File saveFile = new File(sdCardDir, “a.txt”);
- FileOutputStream outStream = new FileOutputStream(saveFile);
- outStream.write("test".getBytes());
- outStream.close();
- }
Environment.getExternalStorageState()辦法用于獲取SDCard的狀況,如不雅手機(jī)裝有SDCard,并且可以進(jìn)行讀寫,那么辦法返回的狀況等于Environment.MEDIA_MOUNTED。
Environment.getExternalStorageDirectory()辦法用于獲取SDCard的目次,當(dāng)然要獲取SDCard的目次,你也可以如許寫:
Java代碼
- File sdCardDir = new File("/sdcard"); //獲取SDCard目次
- File saveFile = new File(sdCardDir, "itcast.txt");
- //膳綾擎兩句代碼可以合成一句:
- File saveFile = new File("/sdcard/a.txt");
- FileOutputStream outStream = new FileOutputStream(saveFile);
- outStream.write("test".getBytes());
- outStream.close();
第四種: SQLite數(shù)據(jù)庫存儲數(shù)據(jù)
SQLite是輕量級嵌入式數(shù)據(jù)庫引擎,它支撐 SQL 說話,并且只應(yīng)用很少的內(nèi)存就有很好的機(jī)能。此外它照樣開源的,任何人都可以應(yīng)用它。很多開源項目((Mozilla, PHP, Python)都應(yīng)用了 SQLite.SQLite 由以下幾個組件構(gòu)成:SQL 編譯器、內(nèi)核、后端以及附件。SQLite 經(jīng)由過程應(yīng)用虛擬機(jī)和虛擬數(shù)據(jù)庫引擎(VDBE),使調(diào)試、修改和擴(kuò)大 SQLite 的內(nèi)核變得加倍便利。
特點(diǎn):
面向資本竽暌剮限的設(shè)備,
沒有辦事器過程,
所稀有據(jù)存放在同一文件中跨平臺,
可自由復(fù)制。
SQLite 內(nèi)部構(gòu)造:
[img]http://dl2.iteye.com/upload/attachment/0104/3780/9215176d-cf77-33f6-9b1c-885ea36d90f1.jpg
SQLite 根本上相符 SQL-92 標(biāo)準(zhǔn),和其他的重要 SQL 數(shù)據(jù)庫沒什么差別。它的長處就是高效,Android 運(yùn)行時情況包含了完全的 SQLite。
SQLite 和其他數(shù)據(jù)庫最大年夜的不合就是對數(shù)據(jù)類型的支撐,創(chuàng)建一個表時,可以在 CREATE TABLE 語句中指定某列的數(shù)據(jù)類型,然則你可以把任何數(shù)據(jù)類型放入任何列中。當(dāng)某個值插入數(shù)據(jù)庫時,SQLite 將檢查它的類型。如不雅該類型與接洽關(guān)系的列不匹配,則 SQLite 會測驗(yàn)測驗(yàn)將該值轉(zhuǎn)換成該列的類型。如不雅不克不及轉(zhuǎn)換,則該值將作為其本身具有的類型存儲。比如可以把一個字符串(String)放入 INTEGER 列。SQLite 稱這為“弱類型”(manifest typing.)。 此外,SQLite 不支撐一些標(biāo)準(zhǔn)的 SQL 功能,特別是外鍵束縛(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 還有一些 ALTER TABLE 功能。 除了上述功能外,SQLite 是一個完全的 SQL 體系,擁有完全的觸發(fā)器,交易等等。
Android 集成了 SQLite 數(shù)據(jù)庫 Android 在運(yùn)行時(run-time)集成了 SQLite,所以每個 Android 應(yīng)用法度榜樣都可以應(yīng)用 SQLite 數(shù)據(jù)庫。
對于熟悉 SQL 的開辟人員來時,在 Android 開辟中應(yīng)用 SQLite 相當(dāng)簡單。然則,因?yàn)?JDBC 會消費(fèi)太多的體系資本,所以 JDBC 對于手機(jī)這種內(nèi)存受限設(shè)備來說并不合適。是以,Android 供給了一些新的 API 來應(yīng)用 SQLite 數(shù)據(jù)庫,Android 開辟中,法度榜樣員須要學(xué)應(yīng)用這些 API。
數(shù)據(jù)庫存儲在 data/< 項目文件夾 >/databases/ 下。 Android 開辟中應(yīng)用 SQLite 數(shù)據(jù)庫 Activites 可以經(jīng)由過程 Content Provider 或者 Service 拜訪一個數(shù)據(jù)庫。
下面會具體講解如不雅創(chuàng)建數(shù)據(jù)庫,添加數(shù)據(jù)和萌芽數(shù)據(jù)庫。 創(chuàng)建數(shù)據(jù)庫 Android 不主動供給數(shù)據(jù)庫。在 Android 應(yīng)用法度榜樣中應(yīng)用 SQLite,必須本身創(chuàng)建數(shù)據(jù)庫,然后創(chuàng)建表、索引,填充數(shù)據(jù)。
Android 供給了 SQLiteOpenHelper 贊助你創(chuàng)建一個數(shù)據(jù)庫,你只要持續(xù) SQLiteOpenHelper 類,就可以輕松的創(chuàng)建數(shù)據(jù)庫。SQLiteOpenHelper 類根據(jù)開辟應(yīng)用法度榜樣的須要,封裝了創(chuàng)建和更新數(shù)據(jù)庫應(yīng)用的邏輯。
SQLiteOpenHelper 的子類,至少須要實(shí)現(xiàn)三個辦法:
1 構(gòu)造函數(shù),調(diào)用父類 SQLiteOpenHelper 的構(gòu)造函數(shù)。這個辦法須要四個參數(shù):高低文情況(例如,一個 Activity),數(shù)據(jù)庫名字,一個可選的游標(biāo)工廠(平日是 Null),一個代表你正在應(yīng)用的數(shù)據(jù)庫模型版本的┞符數(shù)。
2 onCreate()辦法,它須要一個 SQLiteDatabase 對象作為參數(shù),根據(jù)須要對這個對象填充表和初始化數(shù)據(jù)。
3 onUpgrage() 辦法,它須要三個參數(shù),一個 SQLiteDatabase 對象,一個舊的版本號和一個新的版本號,如許你就可以清跋假使何把一個數(shù)據(jù)庫大年夜舊的模型改變到新的模型。
下面示例代碼展示了若何持續(xù) SQLiteOpenHelper 創(chuàng)建數(shù)據(jù)庫:
Java代碼
- public class DatabaseHelper extends SQLiteOpenHelper {
- DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)
- {
- super(context, name, cursorFactory, version);
- }
- @Override
- public void onCreate(SQLiteDatabase db) {
- // TODO 創(chuàng)建數(shù)據(jù)庫后,對數(shù)據(jù)庫的操作
- }
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- // TODO 更改數(shù)據(jù)庫版本的操作
- }
- @Override
- public void onOpen(SQLiteDatabase db) {
- super.onOpen(db);
- // TODO 每次成功打開數(shù)據(jù)庫后起首被履行
- }
- }
接下來評論辯論具體若何創(chuàng)建表、插入數(shù)據(jù)、刪除表等等。調(diào)用 getReadableDatabase() 或 getWriteableDatabase() 辦法,你可以獲得 SQLiteDatabase 實(shí)例,具體調(diào)用那個辦法,取決于你是否須要改變數(shù)據(jù)庫的內(nèi)容:
Java代碼
- db=(new DatabaseHelper(getContext())).getWritableDatabase();
- return (db == null) ? false : true;
膳綾擎這段代碼會返回一個 SQLiteDatabase 類的實(shí)例,應(yīng)用這個對象,你就可以萌芽或者修改數(shù)據(jù)庫。 當(dāng)你完成了對數(shù)據(jù)庫的操作(例如你的 Activity 已經(jīng)封閉),須要調(diào)用 SQLiteDatabase 的 Close() 辦法來釋放掉落數(shù)據(jù)庫連接。 創(chuàng)建表和索引 為了創(chuàng)建表和索引,須要調(diào)用 SQLiteDatabase 的 execSQL() 辦法來履行 DDL 語句。如不雅沒有異常,這個辦法沒有返回值。
例如,你可以履行如下代碼:
db.execSQL(“CREATE TABLE mytable (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, value REAL);”);
這條語句會創(chuàng)建一個名為 mytable 的表,表有一個列名為 _id,并且是主鍵,這列的值是會主動增長的┞符數(shù)(例如,當(dāng)你插入一行時,SQLite 會給這列主動賦值),別的還有兩列:title( 字符 ) 和 value( 浮點(diǎn)數(shù) )。 SQLite 會主動為主鍵列創(chuàng)建索引。 平日情況下,第一次創(chuàng)建數(shù)據(jù)庫時創(chuàng)建了表和索引。
如不雅你不須要改變表的 schema,不須要刪除表和索引 . 刪除表和索引,須要應(yīng)用 execSQL() 辦法調(diào)用 DROP INDEX 和 DROP TABLE 語句。 給表添加數(shù)據(jù) 膳綾擎的代碼,已經(jīng)創(chuàng)建了數(shù)據(jù)庫和表,如今須要給表添加數(shù)據(jù)。有兩種辦法可以給表添加數(shù)據(jù)。
像膳綾擎創(chuàng)建表一樣,你可以應(yīng)用 execSQL() 辦法履行 INSERT, UPDATE, DELETE 等語句來更新表的數(shù)據(jù)。execSQL() 辦法實(shí)用于所有不返回結(jié)不雅的 SQL 語句。
例如: db.execSQL(“INSERT INTO widgets (name, inventory)”+ “VALUES (‘Sprocket’, 5)”);
另一種辦法是應(yīng)用 SQLiteDatabase 對象的 insert(), update(), delete() 辦法。這些辦法把 SQL 語句的一部分作為參數(shù)。
示例如下:
Java代碼
- ContentValues cv=new ContentValues();
- cv.put(Constants.TITLE, "example title");
- cv.put(Constants.VALUE, SensorManager.GRAVITY_DEATH_STAR_I);
- db.insert("mytable", getNullColumnHack(), cv);
update()辦法有四個參數(shù),分別是表名,表示列名和值的 ContentValues 對象,可選的 WHERE 前提和可選的填充 WHERE 語句的字符串,這些字符串會調(diào)換 WHERE 前提中的“?”標(biāo)記。
update() 根據(jù)前提,更新指定列的值,所以用 execSQL() 辦法可以達(dá)到同樣的目標(biāo)。 WHERE 前提和其參數(shù)和用過的其他 SQL APIs 類似。
例如:
String[] parms=new String[] {“this is a string”};
db.update(“widgets”, WordStrments, “name=?”, parms);
delete() 辦法的應(yīng)用和 update() 類似,應(yīng)用表名,可選的 WHERE 前提和響應(yīng)的填充 WHERE 前提的字符串。 萌芽數(shù)據(jù)庫 類似 INSERT, UPDATE, DELETE,有兩種辦法應(yīng)用 SELECT 大年夜 SQLite 數(shù)據(jù)庫檢索數(shù)據(jù)。
1 .應(yīng)用 rawQuery() 直接調(diào)用 SELECT 語句; 應(yīng)用 query() 辦法構(gòu)建一個萌芽。
Raw Queries 正如 API 名字,rawQuery() 是最簡單的解決辦法。經(jīng)由過程這個辦法你就可聲調(diào)用 SQL SELECT 語句。
例如: Cursor c=db.rawQuery( “SELECT name FROM sqlite_master WHERE type=’table’ AND name=’mytable’”, null);
在膳綾擎例子中,我們萌芽 SQLite 體系表(sqlite_master)檢查 table 表是否存在。返回值是一個 cursor 對象,這個對象的辦法可以迭代萌芽結(jié)不雅。 如不雅萌芽是動態(tài)的,應(yīng)用這個辦法就會異常復(fù)雜。
例如,當(dāng)你須要萌芽的列在法度榜樣編譯的時刻不克不及肯定,這時刻應(yīng)用 query() 辦法會便利很多。
Regular Queries query() 辦法用 SELECT 語句段構(gòu)建萌芽。SELECT 語句內(nèi)容作為 query() 辦法的參數(shù),比如:要萌芽的表名,要獲取的字段名,WHERE 前提,包含可選的地位參數(shù),去替代 WHERE 前提中地位參數(shù)的值,GROUP BY 前提,HAVING 前提。 除了表名,其他參數(shù)可所以 null。所以,以前的代碼段可以可寫成:
String[] columns={“ID”, ”inventory”};
Java代碼
- String[] parms={"snicklefritz"};
- Cursor result=db.query("widgets", columns, "name=?",parms, null, null, null);
應(yīng)用游標(biāo)
不管你若何履行萌芽,都邑返回一個 Cursor,這是 Android 的 SQLite 數(shù)據(jù)庫游標(biāo),
應(yīng)用游標(biāo),你可以:
經(jīng)由過程應(yīng)用 getCount() 辦法獲得結(jié)不雅集中有若干記錄;
經(jīng)由過程 moveToFirst(), moveToNext(), 和 isAfterLast() 辦法遍歷所有記錄;
經(jīng)由過程 getColumnNames() 獲得字段名;
經(jīng)由過程 getColumnIndex() 轉(zhuǎn)換成字段號;
經(jīng)由過程 getString(),getInt() 等辦法獲得給定字段當(dāng)前記錄的值;
經(jīng)由過程 requery() 辦法從新履行萌芽獲得游標(biāo);
經(jīng)由過程 close() 辦法釋放游標(biāo)資本;
例如,下面代碼遍歷 mytable 表:
Java代碼
- Cursor result=db.rawQuery("SELECT ID, name, inventory FROM mytable");
- result.moveToFirst();
- while (!result.isAfterLast()) {
- int id=result.getInt(0);
- String name=result.getString(1);
- int inventory=result.getInt(2);
- // do something useful with these
- result.moveToNext();
- }
- result.close();
在 Android 中應(yīng)用 SQLite 數(shù)據(jù)庫治理對象 在其他數(shù)據(jù)庫上作開辟,一般都應(yīng)用對象來檢查和處理數(shù)據(jù)庫的內(nèi)容,而不是僅僅應(yīng)用數(shù)據(jù)庫的 API。
應(yīng)用 Android 模仿器,有兩種可供選擇的辦法來治理數(shù)據(jù)庫。
起首,模仿器綁定了 sqlite3 控制臺法度榜樣,可以應(yīng)用 adb shell 敕令來調(diào)用他。只要你進(jìn)入了模仿器的 shell,在數(shù)據(jù)庫的路徑履行 sqlite3 敕令就可以了。
數(shù)據(jù)庫文件一般存放在: /data/data/your.app.package/databases/your-db-name 如不雅你愛好應(yīng)用更友愛的對象,你可以把數(shù)據(jù)庫拷貝到你的開辟機(jī)上,應(yīng)用 SQLite-aware 客戶妒攀來操作它。如許的話,你在一個數(shù)據(jù)庫的拷貝上操作,如不雅你想要你的修改能反竽暌鉤到設(shè)備上,你須要把數(shù)據(jù)庫備份歸去。
把數(shù)據(jù)庫大年夜設(shè)備上考出來,你可以應(yīng)用 adb pull 敕令(或者在 IDE 上做響應(yīng)操作)。
存儲一個修悛改的數(shù)據(jù)庫到設(shè)備上,應(yīng)用 adb push 敕令。 一個最便利的 SQLite 客戶端是 FireFox SQLite Manager 擴(kuò)大,它可以跨所有平臺應(yīng)用。
下圖是SQLite Manager對象:
[img]http://dl2.iteye.com/upload/attachment/0104/3785/e6fabbe0-0372-34ff-b96b-8ddbfc322f89.jpg
如不雅你想要開辟 Android 應(yīng)用法度榜樣,必定須要在 Android 上存儲數(shù)據(jù),應(yīng)用 SQLite 數(shù)據(jù)庫是一種異常好的選擇。
第五種: 收集存儲數(shù)據(jù)
前面介紹的幾種存儲都是將數(shù)據(jù)存儲在本地設(shè)備上,除此之外,還有一種存儲(獲取)數(shù)據(jù)的方法,經(jīng)由過程收集來實(shí)現(xiàn)數(shù)據(jù)的存儲和獲取。
我們可聲調(diào)用WebService返回的數(shù)據(jù)或是解析HTTP協(xié)定實(shí)現(xiàn)收集數(shù)據(jù)交互。
具體須要熟悉java.net.*,Android.net.*這兩個包的內(nèi)容,在這就不贅述了,請大年夜家參閱相干文檔。
下面是一個經(jīng)由過程地區(qū)名稱萌芽該地區(qū)的氣象預(yù)告,以POST發(fā)送的方法發(fā)送請求到webservicex.net站點(diǎn),拜訪WebService.webservicex.net站點(diǎn)上供給萌芽氣象預(yù)告的辦事。
代碼如下:
Java代碼
- package com.android.weather;
- import java.util.ArrayList;
- import java.util.List;
- import org.apache.http.HttpResponse;
- import org.apache.http.NameValuePair;
- import org.apache.http.client.entity.UrlEncodedFormEntity;
- import org.apache.http.client.methods.HttpPost;
- import org.apache.http.impl.client.DefaultHttpClient;
- import org.apache.http.message.BasicNameValuePair;
- import org.apache.http.protocol.HTTP;
- import org.apache.http.util.EntityUtils;
- import android.app.Activity;
- import android.os.Bundle;
- public class MyAndroidWeatherActivity extends Activity {
- //定義須要獲取的內(nèi)容來源地址
- private static final String SERVER_URL =
- "http://www.webservicex.net/WeatherForecast.asmx/GetWeatherByPlaceName";
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- HttpPost request = new HttpPost(SERVER_URL); //根據(jù)內(nèi)容來源地址創(chuàng)建一個Http請求
- // 添加一個變量
- List<NameValuePair> params = new ArrayList<NameValuePair>();
- // 設(shè)置一個地區(qū)名稱
- params.add(new BasicNameValuePair("PlaceName", "NewYork")); //添加必須的參數(shù)
- try {
- //設(shè)置參數(shù)的編碼
- request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
- //發(fā)送請求并獲取反饋
- HttpResponse httpResponse = new DefaultHttpClient().execute(request);
- // 解析返回的內(nèi)容
- if(httpResponse.getStatusLine().getStatusCode() != 404){
- String result = EntityUtils.toString(httpResponse.getEntity());
- System.out.println(result);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
別忘記了在設(shè)備文件中設(shè)置拜訪收集權(quán)限:
Java代碼
- <uses-permission android:name="android.permission.INTERNET" />
相關(guān)案例查看更多
相關(guān)閱讀
- 汽車報廢管理系統(tǒng)
- 網(wǎng)站建設(shè)公司網(wǎng)站
- 公眾號模板消息
- 小程序用戶登錄
- 云南網(wǎng)站建設(shè) 網(wǎng)絡(luò)服務(wù)
- web服務(wù)
- 定制小程序開發(fā)
- 網(wǎng)站優(yōu)化哪家好
- 海報插件
- 小程序模板開發(fā)公司
- 網(wǎng)站制作
- 汽車報廢回收軟件
- 網(wǎng)絡(luò)公司哪家好
- 云南網(wǎng)站建設(shè)方案 doc
- 服務(wù)器
- 網(wǎng)站排名優(yōu)化
- 云南建設(shè)廳網(wǎng)站
- 云南小程序設(shè)計
- 昆明小程序開發(fā)聯(lián)系方式
- 全國前十名小程序開發(fā)公司
- 小程序密鑰
- 汽車拆解系統(tǒng)
- 小程序被攻擊
- 企業(yè)網(wǎng)站
- 云南小程序開發(fā)
- 網(wǎng)站建設(shè)首頁
- web學(xué)習(xí)路線
- web
- 人口普查小程序
- 報廢車