謝原武+龍文
摘要: 作為一個(gè)完整的應(yīng)用程序,數(shù)據(jù)存儲(chǔ)操作是必不可少的。Android系統(tǒng)一共提供了四種數(shù)據(jù)存儲(chǔ)方式分別為File文件存儲(chǔ)、Shared Preferences存儲(chǔ)、ContentProvider存儲(chǔ)和SQLite數(shù)據(jù)庫存儲(chǔ)。該文以“愛自己”健康A(chǔ)PP為例,簡單地介紹了這些本地?cái)?shù)據(jù)存儲(chǔ)的原理和特點(diǎn),并對(duì)其優(yōu)缺點(diǎn)進(jìn)行了分析。
關(guān)鍵詞:數(shù)據(jù)存儲(chǔ),數(shù)據(jù)管理,存儲(chǔ)機(jī)制
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)28-0012-02
Abstract: As a complete application, data storage operation is necessary. The Android system provides a total of four kinds of method of data storage: the File files are stored and Shared Preferences, ContentProvider storage and SQLite database storage. Based on this, through to this topic to complete the "love yourself" health APP, simply introduces the principle and characteristics of the local storage, and analyses their advantages and disadvantages.
Key words: data storage; data management; storage mechanism
1 引言
隨著社會(huì)的飛速發(fā)展和人民生活水平的進(jìn)一步提高,人們已經(jīng)不僅僅滿足于生活的溫飽和娛樂,而是更多地去關(guān)注自身的身體健康,去追求健康的生活方式。本課題開發(fā)和設(shè)計(jì)了一款基于Android平臺(tái)的“愛自己”健康醫(yī)療APP,算法和數(shù)據(jù)是這個(gè)軟件的程序運(yùn)行的核心,相應(yīng)的Android開發(fā)平臺(tái)提供了各種數(shù)據(jù)存儲(chǔ)機(jī)制,使得這個(gè)健康A(chǔ)PP在進(jìn)行數(shù)據(jù)存儲(chǔ)和管理時(shí)可以選擇使用不同的方式。本文對(duì)Android系統(tǒng)提供的存儲(chǔ)方式進(jìn)行了簡單研究,以及本次創(chuàng)新項(xiàng)目完成的“愛自己”健康A(chǔ)PP的存儲(chǔ)方式選擇。
2 數(shù)據(jù)存儲(chǔ)方式
2.1 File文件存儲(chǔ)
File文件存儲(chǔ)就是以I/O流形式來對(duì)數(shù)據(jù)進(jìn)行保存和讀取,可以直接將數(shù)據(jù)輸出到文件中,以文件的形式存入手機(jī)內(nèi)存或者SD卡中,默認(rèn)的存儲(chǔ)目錄是/data/data/Package_Name/files[1]。這是個(gè)默認(rèn)私有的文件,在訪問這文件的時(shí)候需要設(shè)置操作模式為可讀或可寫。它主要是提供了openFileOutput()和openFileInput方法對(duì)文件進(jìn)行讀寫。文件存儲(chǔ)是Android中最基本的一種數(shù)據(jù)存儲(chǔ)方式,不僅能將大量的數(shù)據(jù)存儲(chǔ)到系統(tǒng)中,還能存儲(chǔ)到手機(jī)SD卡上,進(jìn)而節(jié)省了手機(jī)自身的存儲(chǔ)空間,比數(shù)據(jù)庫存儲(chǔ)實(shí)現(xiàn)簡單。但是它的缺點(diǎn)是更新數(shù)據(jù)比較麻煩,數(shù)據(jù)不能共享和進(jìn)行條件訪問。
2.2 Shared Preferences存儲(chǔ)
Shared Preferences是在Android平臺(tái)上使用的一個(gè)輕量級(jí)存儲(chǔ)類,一般用來保存一些簡單的配置信息,實(shí)質(zhì)上是以.xml文件形式來存儲(chǔ)key-value鍵值對(duì)數(shù)據(jù),其對(duì)應(yīng)的文件可以是在/data/data/ Package_Name/shared_prefs文件夾中找到,跟文件存儲(chǔ)一樣,這樣的文件也是默認(rèn)私有的,在多個(gè)應(yīng)用程序之間是無法共享數(shù)據(jù)的。Shared Preferences對(duì)象本身只能獲取數(shù)據(jù),并不能支持?jǐn)?shù)據(jù)存儲(chǔ)和數(shù)據(jù)修改的操作,只能通過Shared Preferences.Editor()對(duì)象來進(jìn)行這些操作。Shared Preferences對(duì)象不用像數(shù)據(jù)庫管理那樣創(chuàng)建數(shù)據(jù)庫、創(chuàng)建表、寫SQL語句等操作,相對(duì)而言快速、方便、簡潔。但是這種方式只能存儲(chǔ)boolean、int、float、long和String5種簡單數(shù)據(jù)類型,而且數(shù)據(jù)是以XML格式存儲(chǔ)到手機(jī)內(nèi)存中,無法存儲(chǔ)大量的數(shù)據(jù)。
2.3 ContentProvider存儲(chǔ)
ContentProvider為存儲(chǔ)和獲取數(shù)據(jù)提供了統(tǒng)一的接口。ContentProvider一般使用表的形式來組織數(shù)據(jù),每一個(gè)ContentProvider都對(duì)外擁有一個(gè)公共的URL,Android設(shè)備上的任何程序都可以通過這個(gè)URL來訪問或?qū)?shù)據(jù)進(jìn)行操作,實(shí)現(xiàn)了應(yīng)用程序之間的數(shù)據(jù)共享[2]。用戶一般可以通過ContentProvider類所提供的query(),insert(),update(),getType等方法去訪問數(shù)據(jù)。嚴(yán)格意義上來說,ContentProvider并不是一種數(shù)據(jù)存儲(chǔ)方式,而是一種對(duì)數(shù)據(jù)庫中數(shù)據(jù)的封裝,最終會(huì)以.db文件形式存儲(chǔ)在手機(jī)上,它的訪問方式與數(shù)據(jù)庫的訪問方式基本相似,操作起來也與數(shù)據(jù)庫相似,基本優(yōu)缺點(diǎn)與數(shù)據(jù)庫一樣,但是在Android設(shè)備中的各個(gè)應(yīng)用程序間的數(shù)據(jù)應(yīng)該是相互保密的,所以這種存儲(chǔ)方式在Android開發(fā)過程中比較少用。
2.4 SQLite數(shù)據(jù)庫存儲(chǔ)
SQLite是一個(gè)可用于嵌入式設(shè)備開發(fā)的強(qiáng)大的輕量級(jí)數(shù)據(jù)庫,支持SQL語言。它資源占用率非常低、運(yùn)行效率高,具有獨(dú)立性、隔離性、跨平臺(tái)、安全性等多種特性,特別適合于嵌入式設(shè)備開發(fā),目前已經(jīng)應(yīng)用在很多嵌入式設(shè)備開發(fā)領(lǐng)域中。在使用SQLite時(shí),最常用到兩個(gè)類:SQLiteDatabase和SQLiteOpenHelper。
SQLiteDatabase是Android的核心類之一,該類封裝了一系列數(shù)據(jù)庫操作的API,對(duì)數(shù)據(jù)庫進(jìn)行增、刪、改、查等操作,進(jìn)而完成對(duì)數(shù)據(jù)庫的創(chuàng)建、刪除。
除了SQLiteDatabase類外,Android平臺(tái)還給開發(fā)者提供了一個(gè)強(qiáng)大的輔助類SQLiteOpenHelper。SQLiteOpenHelper是一個(gè)抽象類,通過它可以很好的對(duì)數(shù)據(jù)庫進(jìn)行創(chuàng)建和數(shù)據(jù)庫的版本更新,可以通過繼承SQLiteOpenHelper類,實(shí)現(xiàn)它的兩個(gè)抽象方法,onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version),其中onCreate()一般是用來檢查數(shù)據(jù)庫是否存在和創(chuàng)建數(shù)據(jù)庫、創(chuàng)建表的,而onUpgrade()多數(shù)用來檢查和更新數(shù)據(jù)庫的版本。
3 “愛自己”APP的數(shù)據(jù)庫設(shè)計(jì)
由于本次創(chuàng)新項(xiàng)目的“愛自己”健康醫(yī)療APP需要能夠?qū)崿F(xiàn)本地和遠(yuǎn)程的歷史數(shù)據(jù)查詢功能,因此謹(jǐn)慎設(shè)計(jì)一個(gè)合理的數(shù)據(jù)庫很有必要。結(jié)合上文的簡述和比較,在Android開發(fā)中,數(shù)據(jù)存儲(chǔ)主要有四大存儲(chǔ)方式:File文件存儲(chǔ),Shared Preferences存儲(chǔ),ContentProvider存儲(chǔ)以及SQLite數(shù)據(jù)庫存儲(chǔ)。其中文件存儲(chǔ)主要是用輸入輸出流控制,如果想對(duì)文件更加方便地訪問控制,直接使用流是最好的選擇。Shared Preferences存儲(chǔ)是Android中最簡單的數(shù)據(jù)存儲(chǔ)方式,主要處理key-value鍵值對(duì)數(shù)據(jù),通常Shared Preferences將數(shù)據(jù)文件寫在手機(jī)內(nèi)存私有的目錄中,并且以xml文件的格式存儲(chǔ)。ContentProvider存儲(chǔ)是Android系統(tǒng)中定義的應(yīng)用程序與其他應(yīng)用程序共享數(shù)據(jù)的橋梁,設(shè)備上的程序都通過ContentProvider的URI供其他應(yīng)用程序使用。Android存儲(chǔ)方案的核心是SQLite數(shù)據(jù)庫,它是專門為嵌入式設(shè)備而設(shè)計(jì)的輕量級(jí)的數(shù)據(jù)庫,執(zhí)行簡單地SQL語句甚至比MySQL和Postgresql還快,Android系統(tǒng)對(duì)于操作SQLite數(shù)據(jù)庫提供了很多java工具類,從而方便我們進(jìn)行Android平臺(tái)數(shù)據(jù)存儲(chǔ)功能應(yīng)用開發(fā)[3]。而此次的“愛自己”APP要設(shè)計(jì)的軟件數(shù)據(jù)存儲(chǔ)部分就是使用Android SQLite數(shù)據(jù)庫進(jìn)行數(shù)據(jù)存儲(chǔ)功能設(shè)計(jì)的。
“愛自己”APP要實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的需求主要有:對(duì)于用戶的注冊(cè)信息存儲(chǔ)、用戶的健康數(shù)據(jù)測量的數(shù)據(jù)存儲(chǔ)和對(duì)應(yīng)用戶的健康數(shù)據(jù)反饋的數(shù)據(jù)存儲(chǔ)。根據(jù)這個(gè)需求,設(shè)計(jì)了數(shù)據(jù)庫personinfo.db,主要包含四張表,由于Android平臺(tái)下的SQLite數(shù)據(jù)庫并不是全部都支持外鍵功能,因此,在這四張數(shù)據(jù)表的設(shè)計(jì)過程中都沒有用到外鍵。四張表分別包含有用戶信息表,用戶攝食記錄表,食物所對(duì)應(yīng)的卡路里表,用戶健康狀況反饋表。其中用戶信息表主要是記錄包含了用戶的個(gè)人信息,用戶攝食記錄表主要是記錄了對(duì)應(yīng)用戶的攝入各種食物的信息,食物所對(duì)應(yīng)的卡路里表主要是記錄了各種食物的卡路里量值,用戶健康狀況反饋表主要是記錄了系統(tǒng)根據(jù)對(duì)應(yīng)用戶的健康狀況給出的建議的信息。4張表的具體信息如下:
在“愛自己”的整個(gè)數(shù)據(jù)存儲(chǔ)設(shè)計(jì)實(shí)現(xiàn)上使用SQLite創(chuàng)建數(shù)據(jù)庫主要是通過繼承SQLite OpenHelper類來完成創(chuàng)建以及各種數(shù)據(jù)庫的操作。
4 結(jié)論
整個(gè)社會(huì)信息化程度的不斷加深,基于Android智能設(shè)備的應(yīng)用程序的不斷更新與發(fā)展,算法與數(shù)據(jù)依舊是一個(gè)計(jì)算機(jī)程序運(yùn)行的核心。一個(gè)完整的應(yīng)用程序開發(fā)中選擇一個(gè)與之相匹配的數(shù)據(jù)存儲(chǔ)方式,便會(huì)極大地提高整個(gè)程序軟件的總體運(yùn)行性能?!皭圩约骸笔且豢罹C合型的APP,無論是實(shí)時(shí)數(shù)據(jù)還是歷史數(shù)據(jù),它都有對(duì)數(shù)據(jù)進(jìn)行快速分析和處理的功能,在其數(shù)據(jù)庫設(shè)計(jì)的過程中仍然存在著不足,但隨著智能設(shè)備傳感器的不斷普及,它對(duì)傳感器的調(diào)用也讓用戶對(duì)實(shí)時(shí)數(shù)據(jù)和歷史數(shù)據(jù)都有一個(gè)深刻的認(rèn)識(shí),能在使用時(shí)充分結(jié)合兩者而達(dá)到靈活轉(zhuǎn)換的目的。相信隨著智能時(shí)代的到來,算法和數(shù)據(jù)仍然是這一時(shí)代智能設(shè)備發(fā)展的一個(gè)主流研究。
參考文獻(xiàn):
[1] 傳智播客高教產(chǎn)品研發(fā)部.Android移動(dòng)應(yīng)用基礎(chǔ)教程[M]. 中國鐵道出版社,2015.
[2] 朱桂英.Android開發(fā)應(yīng)用從入門到精通[M].中國鐵道出版社,2011.
[3] 張永瑞.基于Android及Java Web平臺(tái)的個(gè)人健康信息管理系統(tǒng)[M].2014.
[4] 彭艷,楊歐.Android平臺(tái)的數(shù)據(jù)存儲(chǔ)技術(shù)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2012(5).