使用 SQL 資料庫的策略

Adobe AIR 1.0 以及更新的版本

應用程式存取及使用本機 SQL 資料庫的方式有許多種。應用程式設計可能會依應用程式的程式碼組織方式、執行作業的順序和時間等因素而不同。您所選擇的技巧可能對應用程式開發的簡易程度造成影響,也有機會影響在未來更新時,修改應用程式的難易度。此外,這項決定也可能影響到使用者察覺到的應用程式執行順暢度。

發佈預先填入的資料庫

當您在應用程式中使用 AIR 本機 SQL 資料庫時,應用程式會預期資料庫應具備一定的資料表、欄等結構。有些應用程式也會預期資料庫檔案中已預先填入資料。確保資料庫有適當結構的其中一個方法,就是在應用程式的程式碼中建立資料庫。當應用程式載入資料庫時,會在特定位置中檢查其資料庫檔案是否存在。如果檔案不存在,應用程式會執行一組命令,以建立資料庫檔案、建立資料庫結構,並用初始資料填入資料表中。

建立資料庫及其資料表的程式碼往往很複雜。這種程式碼通常只會在應用程式安裝週期中使用一次,但仍然會增加應用程式的大小和複雜程度。您可以將預先填入的資料庫與應用程式一起發佈,將此做為透過程式設計方式建立資料庫、結構和資料的替代方式。若要發佈預先定義的資料庫,請在應用程式的 AIR 套件中包含資料庫檔案。

與包含在 AIR 套件中的所有檔案一樣,合併的資料庫檔案會安裝在應用程式目錄中 (以 File.applicationDirectory 屬性代表的目錄)。但是,該目錄中的檔案是唯讀的。請使用來自 AIR 套件的檔案做為「範本」資料庫。使用者第一次執行應用程式時,會將原始的資料庫檔案複製至使用者的 指向應用程式儲存目錄 (或其它位置) 中,並在應用程式中使用該資料庫。

使用本機 SQL 資料庫的最佳做法

下列清單是一組建議使用的技巧,可在使用本機 SQL 資料庫時,供您用來提升應用程式的效能、安全性,並讓應用程式易於維護。

預先建立的資料庫連線

即使您的應用程式在初次載入時不執行任何陳述式,事先將 SQLConnection 物件實體化並呼叫其 open() openAsync() 方法 (例如在初始應用程式啟動之後),可避免在執行陳述式時發生延遲。請參閱 連線到資料庫

重複使用資料庫連線

如果您在應用程式執行時間一直都要存取某個特定資料庫,請保留 SQLConnection 實體的參考,並在整個應用程式執行期間重複使用該參考,而不要不斷關閉又重新開啟連線。請參閱 連線到資料庫

優先使用非同步執行模式

撰寫資料存取程式碼時,往往會因為使用同步作業經常只需要較短而較不複雜的程式碼,而想要以同步方式 (而不是以非同步方式) 執行作業。但是,如同 使用同步和非同步資料庫作業 一節中所述,同步作業可能會有很大的效能衝擊,這一點不僅可讓使用者很明顯地感受到,而且會對他們使用應用程式的體驗造成負面影響。單一作業所耗費的時間需視作業而定,尤其是其中所包含的資料量。例如,只加入單一列至資料庫的 SQL INSERT 陳述式,所耗費的時間就不如擷取數千個資料列的 SELECT 陳述式那麼多。但是,當您使用同步執行來執行多項作業時,作業通常會串聯在一起。即使每項單一作業都很短,應用程式也會凍結到所有同步作業完成為止。結果,多項作業串聯在一起所累積的時間可能會多到讓應用程式動彈不得。

請使用非同步作業做為標準手法,尤其是在包含大量資料列的作業時。有一項技巧可以讓您拆解大量 SELECT 陳述式結果集處理,請參閱 擷取部分 SELECT 結果 一節的說明。不過,這項技巧只能用於非同步執行模式。請僅在無法使用非同步程式設計達成特定功能時、已考慮過應用程式的使用者將面臨的效能代價後,以及您已測試過應用程式並瞭解應用程式效能所受到的影響後,才使用同步作業。使用非同步執行可能會涉及更複雜的程式編寫。但是,請記住,您只需要撰寫程式碼一次,而應用程式的使用者不管速度快慢都必須重複不斷地使用該程式碼。

在許多情況下,若讓每個要執行的 SQL 陳述式都使用不同的 SQLStatement 實體,多項 SQL 作業可能會一次積累過多,而就程式碼的撰寫方式來說,這使得非同步程式碼就跟同步程式碼一樣。如需詳細資訊,請參閱 瞭解非同步執行模式

使用不同的 SQL 陳述式而不變更 SQLStatement 的 text 屬性

對於在應用程式中不只執行一次的任何 SQL 陳述式,請為每個 SQL 陳述式建立不同的 SQLStatement 實體。每次執行該 SQL 命令時,就使用該 SQLStatement 實體。例如,假設您在建置包含四種不同 SQL 作業的應用程式,這些作業都要重複執行多次。在此情況下,請建立四個不同的 SQLStatement 實體,然後呼叫每個陳述式的 execute() 方法來執行該實體。請避免使用另外一種讓所有 SQL 陳述式使用單一 SQLStatement 實體的做法,在每次要執行陳述式之前重新定義其 text 屬性。

使用陳述式參數

請使用 SQLStatement 參數,絕對不要將使用者輸入連接到陳述式文字之中。使用參數可讓您的應用程式更加安全,因為這可以降低遭到 SQL 插入式攻擊的可能性,並讓您能夠在查詢中使用物件 (而不只是使用 SQL 常值)。此外,這個方法也能讓陳述式能夠更有效率地執行,因為陳述式可以重複使用而不必每次執行時都要重新進行編譯。如需詳細資訊,請參閱 在陳述式中使用參數