徐志揚(yáng),楊玉志,查曉俊,陳健,趙興群
1. 南京鼓樓醫(yī)院 臨床醫(yī)學(xué)工程處,江蘇 南京 210000;2. 東南大學(xué) 生物科學(xué)與醫(yī)學(xué)工程學(xué)院,江蘇 南京 210008
隨著醫(yī)療行業(yè)發(fā)展,醫(yī)療設(shè)備已經(jīng)成為醫(yī)院醫(yī)療、科研、教學(xué)必不可少的基礎(chǔ)和保障[1-3],對(duì)醫(yī)療設(shè)備的管理質(zhì)量直接影響醫(yī)院的經(jīng)濟(jì)效益。醫(yī)院設(shè)備管理部門工作主要集中在以下幾個(gè)方面:采購(gòu)計(jì)劃擬定、調(diào)研招標(biāo)、驗(yàn)收培訓(xùn)、維修保養(yǎng)、計(jì)量巡檢、盤點(diǎn)質(zhì)控、租用報(bào)廢[4-5],設(shè)備管理軟件也會(huì)根據(jù)這些工作內(nèi)容有針對(duì)性的設(shè)計(jì)相應(yīng)模塊實(shí)現(xiàn)日常工作需求。
越來越多的設(shè)備管理軟件已從原先PC端移植到移動(dòng)端,目的是能夠?qū)崿F(xiàn)便捷、實(shí)時(shí)[6]的查詢、登記等工作。目前移動(dòng)端必須接入無(wú)線網(wǎng)絡(luò)或4G網(wǎng)絡(luò)才能實(shí)現(xiàn)與設(shè)備管理系統(tǒng)的后臺(tái)服務(wù)器相連,而目前多數(shù)醫(yī)院不能實(shí)現(xiàn)每個(gè)角落都能覆蓋無(wú)線網(wǎng)絡(luò),為了能真正實(shí)現(xiàn)全方位、隨時(shí)隨地的便捷操作體驗(yàn),附帶緩存功能的存儲(chǔ)方式可以提供一些解決思路。
SharedPreferences儲(chǔ)存技術(shù)是Android提供用來存儲(chǔ)簡(jiǎn)單配置信息的一種機(jī)制[7],適用于存儲(chǔ)一些鍵值對(duì)[8]如用戶名、密碼員工信息等,不經(jīng)常改變且不作為查詢工作重點(diǎn)的數(shù)據(jù)緩存均可已使用。SharedPreferences實(shí)際上是一個(gè)接口如圖1所示。
完成存儲(chǔ)功能需實(shí)現(xiàn)接口中Editor、OnSharedPreferen cesChangedListener兩方法。存儲(chǔ)的信息以XML文件的形式保存在/data/data/PACKAGE_NAME/shared_prefs目錄下。實(shí)現(xiàn)服務(wù)器地址存儲(chǔ)關(guān)鍵代碼如下:

操作簡(jiǎn)單但存儲(chǔ)效率低,多數(shù)用于用戶對(duì)軟件系統(tǒng)的設(shè)置存儲(chǔ)。

圖1 SharePreferences結(jié)構(gòu)圖
該存儲(chǔ)技術(shù)主要適用于下載圖片、音頻、資源包等數(shù)據(jù)量相對(duì)較大的文件。保存方式基本上有兩種選擇:一種是手機(jī)內(nèi)部?jī)?chǔ)存ROM[9],另一種是外部?jī)?chǔ)存(SD卡、TF卡等)。在使用時(shí)應(yīng)注意,外部存儲(chǔ)對(duì)數(shù)據(jù)的保護(hù)較少,所以一些重要的沒有加密的數(shù)據(jù)不建議保存到外部存儲(chǔ)中,例如員工的基本信息等。File實(shí)際上是Android中的類,它是將JAVA中IO流包裝后的一種應(yīng)用,IO流結(jié)構(gòu)圖如圖2所示。

圖2 IO流結(jié)構(gòu)圖
File類是對(duì)文件系統(tǒng)的中的文件以及文件夾進(jìn)行對(duì)象的封裝。可以通過對(duì)象的思想來操作文件以及文件夾。在使用時(shí)需要import java.io.*包,使用ROM或SD卡進(jìn)行數(shù)據(jù)存儲(chǔ)時(shí)需要在AndroidMainfset.xml文件中進(jìn)行權(quán)限的配置:

該存儲(chǔ)方式,可以先將工作中常用的圖片、文件數(shù)據(jù)離線緩存在手機(jī)中,如醫(yī)療設(shè)備的SOP,使用手冊(cè)、常見故障說明,即使在沒有網(wǎng)絡(luò)的角落里工程師也能查看設(shè)備的相關(guān)信息。
SQLite是一個(gè)嵌入式SQL數(shù)據(jù)庫(kù)引擎。與大多數(shù)其他SQL數(shù)據(jù)庫(kù)不同,SQLite沒有單獨(dú)的服務(wù)器進(jìn)程。SQLite直接讀寫普通磁盤文件,它遵守ACID的關(guān)聯(lián)式數(shù)據(jù)庫(kù)管理,即使在網(wǎng)絡(luò)、電力、系統(tǒng)崩潰時(shí)也會(huì)實(shí)現(xiàn)其原子性(Atomic)、一致性(Consistent)、隔離性(Isolated)和持久性(Durable)的可序列化事務(wù)[10]。占用空間極小,在嵌入式設(shè)備中應(yīng)用廣泛。SQLite具有以下幾種常用的數(shù)據(jù)類型。
NULL:這個(gè)值為空值。
TEXT:值為文本字符串,使用數(shù)據(jù)庫(kù)編碼存儲(chǔ),方式:TUTF-8,UTF-16BE、UTF-16-LE)。
VARCHAR(n):長(zhǎng)度不固定且其最大長(zhǎng)度為n的字串,n不能超過4000。
CHAR(n):長(zhǎng)度固定為n的字串,n不能超過254。
INTEGER:值被標(biāo)識(shí)為整數(shù),依據(jù)值的大小可以依次被存儲(chǔ)為 1,2,3,4,5,6,7,8。
REAL:所有值都是浮動(dòng)的數(shù)值,被存儲(chǔ)為8字節(jié)的IEEE浮動(dòng)標(biāo)記序號(hào)。
BLOB:值是BLOB數(shù)據(jù)塊,以輸入的數(shù)據(jù)格式進(jìn)行存儲(chǔ),與輸入數(shù)據(jù)完全相同,不改變格式。
DATA:包含了年份、月份、日期。
TIME:包含了小時(shí)、分鐘、秒。
為了方便使用SQLite數(shù)據(jù)庫(kù)可以借助一些第三方基于Android數(shù)據(jù)庫(kù)框架如LitePal,Litepal是一款開源的數(shù)據(jù)庫(kù)框架,采用對(duì)象關(guān)系映射(ORM)模式,將SQLite數(shù)據(jù)庫(kù)功能進(jìn)行封裝,可以不用寫一行SQL語(yǔ)句就可以完成創(chuàng)建表、增刪改查的操作[11]。并且很輕量級(jí),jar包不到100 K,幾乎零配置。在具體使用Litepal前需在項(xiàng)目的assets目錄下面新建一個(gè)litepal.xml文件:

</litepal>用于聲明數(shù)據(jù)庫(kù)名稱和版本號(hào)。在新建的數(shù)據(jù)庫(kù)類中完成數(shù)據(jù)類型配置后,就可以使用java語(yǔ)言進(jìn)行數(shù)據(jù)庫(kù)操作,關(guān)鍵代碼如下:

可以看出這類數(shù)據(jù)庫(kù)離線緩存非常適合管理軟件主要信息的存儲(chǔ),設(shè)備信息其實(shí)就是一張張關(guān)系型數(shù)據(jù)網(wǎng)絡(luò),設(shè)備名稱、編碼、品牌、型號(hào)、使用科室、購(gòu)置價(jià)格、開機(jī)時(shí)間、故障次數(shù)等等都可以以一定的數(shù)據(jù)類型緩存在內(nèi)存中占用空間很小的SQLite數(shù)據(jù)庫(kù)內(nèi)。包括一些文字型工作記錄在沒有網(wǎng)絡(luò)時(shí)也可以離線保存至數(shù)據(jù)庫(kù),待系統(tǒng)聯(lián)網(wǎng)后上傳到網(wǎng)絡(luò)服務(wù)器或云端,操作者不需要擔(dān)心自身工作記錄是否受到環(huán)境網(wǎng)絡(luò)的影響。
緩存與持久儲(chǔ)存區(qū)別在于緩存文件并不能保證持久。與PC端相似,網(wǎng)絡(luò)緩存儲(chǔ)存在RAM中,內(nèi)存低的時(shí)候,Android系統(tǒng)會(huì)優(yōu)先刪除這些緩存文件,而持久存儲(chǔ)的文件在卸載應(yīng)用時(shí)才被刪除的。所以網(wǎng)絡(luò)緩存適用于在同一時(shí)間段內(nèi)多次訪問相同網(wǎng)絡(luò)信息,信息內(nèi)容數(shù)據(jù)量不大,無(wú)需實(shí)時(shí)監(jiān)聽的情況。Google推出的網(wǎng)絡(luò)通信框架Volley,特別適合處理數(shù)據(jù)量小的網(wǎng)絡(luò)操作,Volley內(nèi)部實(shí)現(xiàn)流程如圖3所示[12-13]。

圖3 Volley內(nèi)部流程圖
Volley優(yōu)點(diǎn)是內(nèi)部封裝了異步線程,可直接在主線程請(qǐng)求網(wǎng)絡(luò),Volley會(huì)檢查這個(gè)請(qǐng)求是否可以從緩存中得到,如果可以,緩存將負(fù)責(zé)讀取,解析,和分發(fā)。如果沒有緩存,則創(chuàng)建網(wǎng)絡(luò)請(qǐng)求[14](RequestQueue)將請(qǐng)求傳遞給網(wǎng)絡(luò)線程,處理返回的結(jié)果,在創(chuàng)建網(wǎng)絡(luò)請(qǐng)求的同時(shí)也會(huì)創(chuàng)建一個(gè)DiskBasedCache對(duì)象,該對(duì)象自動(dòng)將網(wǎng)絡(luò)響應(yīng)同步進(jìn)行緩存,軟件中內(nèi)置的CacheDir目錄下的volley文件夾就是DiskBasedCache硬盤緩存目錄。Volley緩存的數(shù)據(jù)其實(shí)包括字符串?dāng)?shù)據(jù)、json數(shù)據(jù)、圖片。管理軟件得到緩存數(shù)據(jù)方法也比較方便:

在實(shí)際軟件運(yùn)行時(shí)遇上前一秒有網(wǎng)絡(luò)信號(hào),后一秒就沒有時(shí),用戶請(qǐng)求同一數(shù)據(jù)就不會(huì)出現(xiàn)請(qǐng)求失敗的情況,很大程度的保證了用戶使用的流暢性。
不同的數(shù)據(jù)存儲(chǔ)方式都有各自的優(yōu)缺點(diǎn),不同特點(diǎn)的數(shù)據(jù)應(yīng)該用不同的數(shù)據(jù)存儲(chǔ)方式,以滿足軟件設(shè)計(jì)的最優(yōu)化。分析管理軟件所涉及的數(shù)據(jù)類型總結(jié)成如圖4所示。

圖4 數(shù)據(jù)類型關(guān)系表
在處理這些數(shù)據(jù)時(shí)根據(jù)數(shù)據(jù)在實(shí)際應(yīng)用中的特點(diǎn)選擇合適存儲(chǔ)方式,遵循幾點(diǎn)原則:① 影響用戶實(shí)時(shí)操作體驗(yàn)的數(shù)據(jù)盡量能實(shí)現(xiàn)離線讀寫;② 體積較小的鍵值對(duì)且不常改變的數(shù)據(jù)用SharedPreferences;③ 格式為圖片、文檔等體積較大的閱讀類數(shù)據(jù)根據(jù)用戶需求使用 files功能下載至本地,不需要下載時(shí)使用Web Cache緩存在內(nèi)存中;④ 關(guān)聯(lián)信息、鍵值對(duì)較多的數(shù)據(jù)用SQLite存取;⑤ 臨時(shí)狀態(tài)、編號(hào)等數(shù)據(jù)用可被自動(dòng)清除的Web Cache技術(shù)。數(shù)據(jù)存取應(yīng)用框架如圖5。
實(shí)際測(cè)Web Cache功能,網(wǎng)絡(luò)斷開時(shí)使用Toast提示用戶斷網(wǎng)狀態(tài),但數(shù)據(jù)顯示正常如圖6。
實(shí)際耗時(shí)對(duì)比如圖7所示,軟件需要在斷網(wǎng)后持續(xù)請(qǐng)求8 s左右時(shí)間,展示緩存內(nèi)數(shù)據(jù),8 s主要是網(wǎng)絡(luò)等待,實(shí)際從緩存中讀取數(shù)據(jù)并進(jìn)行展示,僅需271 ms,幾乎可忽略不計(jì)。

圖5 數(shù)據(jù)存取框架圖

圖6 正常聯(lián)網(wǎng)與斷網(wǎng)數(shù)據(jù)獲取后展示界面

圖7 正常聯(lián)網(wǎng)和斷網(wǎng)后數(shù)據(jù)展示耗時(shí)
隨著高速4G移動(dòng)網(wǎng)絡(luò)信號(hào)的全面覆蓋及醫(yī)院信息化建設(shè)的穩(wěn)步發(fā)展,醫(yī)院無(wú)線網(wǎng)絡(luò)也迎來了新時(shí)代,但是醫(yī)院結(jié)構(gòu)復(fù)雜,很多功能科室如放射科、手術(shù)室、層流病房等如果不添加移動(dòng)信號(hào)增強(qiáng)設(shè)備就會(huì)出現(xiàn)斷網(wǎng)現(xiàn)象,更何況有些設(shè)備管理軟件專用網(wǎng)絡(luò)還沒有能全面覆蓋。無(wú)論哪種網(wǎng)絡(luò)框架模式想要配合掃碼技術(shù)[15-16]實(shí)現(xiàn)實(shí)時(shí)、便捷的操作體驗(yàn),就必須要求管理軟件在離線時(shí)對(duì)數(shù)據(jù)有一定的處理能力。結(jié)合幾種基于Android數(shù)據(jù)讀存儲(chǔ)方法,能夠有效地提高軟件的使用率,從而發(fā)揮管理軟件對(duì)設(shè)備的全生命周期進(jìn)行了實(shí)時(shí)監(jiān)控的功能,提高醫(yī)院醫(yī)療設(shè)備的管理水平。