劉慶
摘? ?要:移動互聯(lián)網(wǎng)的發(fā)展成為當下越來越熱門的話題,各類移動APP應用隨著中國經(jīng)濟飛速發(fā)展而快速增長。移動APP應用離不開數(shù)據(jù)的存儲,在IOS開發(fā)中,數(shù)據(jù)存儲可以使用文件或數(shù)據(jù)庫的方式。而一般的歸檔、plist文件、偏好設置都是存儲為文件。本文主要論述了在IOS平臺下,基于XCODE集成開發(fā)環(huán)境,Objective-c編程語言中,IOS應用開發(fā)中本地和遠程數(shù)據(jù)庫訪問的方式和步驟,詳細描述了SQLite關系關系型數(shù)據(jù)庫的連接、數(shù)據(jù)讀取操作的方法和功能函數(shù)的調(diào)用實現(xiàn)。同時以項目的登陸功能為例,通過對接口文件的使用,實現(xiàn)對于遠程服務器數(shù)據(jù)庫的訪問與連接。
關鍵詞:IOS? 數(shù)據(jù)訪問? APP
中圖分類號:TP311? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?文獻標識碼:A? ? ? ? ? ? ? ? ? ? ? ? 文章編號:1674-098X(2020)06(c)-0116-02
1? 引言
當我們在做PC端的應用開發(fā)的時候,常見的數(shù)據(jù)庫連接方式有:DAO、ADO、ODBC、JDBC等。通過服務器端的數(shù)據(jù)支持提供前端的數(shù)據(jù)應用,可以根據(jù)數(shù)據(jù)訪問量的大小調(diào)整在線訪問或是離線訪問,可以設置訪問的并發(fā)性等。但是移動設備硬件資源有限,移動APP通常會在設備本地存儲一些數(shù)據(jù),這可以為程序執(zhí)行更良好的性能或離線訪問提供支持。在iOS上,移動APP可以將信息輸出或存儲到Plist文件、SQLite數(shù)據(jù)庫文件中。
屬性列表(Plist,Property List)是一種結構化的二進制格式文件,包含了內(nèi)嵌鍵值對的可執(zhí)行bundle的基本配置信息。Plist文件主要用于存儲App的用戶設置及配置信息,例如,游戲類App經(jīng)常會在Plist文件中存儲游戲等級和分數(shù)信息。一般來說,App會將存儲用戶數(shù)據(jù)的Plist文件保存在“[App home目錄]/documents/”目錄下。Plist文件可以是XML格式或二進制格式。
SQLite是一種自包含、可嵌入、0配置的SQL數(shù)據(jù)庫引擎的跨平臺C庫文件。它的表、觸發(fā)器和視圖整個數(shù)據(jù)庫都包含在一個硬盤文件中。SQLite數(shù)據(jù)庫提供了所有標準的SQL結構,包括select、insert、update和delete。APP一般會將其保存在“[App home目錄]/documents/”目錄下。由于SQLite的輕便、穩(wěn)定和小巧,它已成為一個在iOS設備上存儲數(shù)據(jù)的優(yōu)秀解決方案。
下面我們將詳細論述,在IOS中移動APP如何實現(xiàn)本地數(shù)據(jù)和遠程數(shù)據(jù)的訪問。
2? 本地數(shù)據(jù)庫的訪問
在一些小程序中,需要保存程序運行中的數(shù)據(jù),為了方便處理,在ios中一般會將數(shù)據(jù)庫捆綁在程序中,我們稱之為本地數(shù)據(jù)庫訪問。
為了更好的描述本地訪問數(shù)據(jù)庫的方式,我們以SQLite提供本地數(shù)據(jù)庫為例,SQLite是一個小型的關系型數(shù)據(jù)庫。當我們在本機創(chuàng)建好了數(shù)據(jù)庫,并把數(shù)據(jù)庫的文件保存為db_file.sqlite3。這時我們將在ios中實現(xiàn)對數(shù)據(jù)的讀寫存儲,首先需要先在Xcode中將libsqlite3.dylib庫文件添加到項目中,然后再將已創(chuàng)建好的db_file.sqlite3數(shù)據(jù)庫文件引入到項目中。
不管是哪種平臺,對數(shù)據(jù)庫中的數(shù)據(jù)進行操作的方法思路都相似,具體方法步驟如下。
2.1 連接并打開數(shù)據(jù)庫
在訪問SQLite數(shù)據(jù)庫文件,需要SQLite庫中相應的方法支持,要添加導入語句:#import “sqlite3.h”
定義一個變量database變量,用來存放數(shù)據(jù)庫連接。
@property(nonatomic) sqlite3 *database;
定義方法sqliteDBFilePath,獲取數(shù)據(jù)庫文件的路徑。
- (NSString *) sqliteDBFilePath
{
return[[[NSBundle mainBundle]esourcePath]
stringByAppendingPathComponent :@" db_file.sqlite3"];
}
定義方法initDatabaseConnection,初始化數(shù)據(jù)庫連接,打開連接,并返回數(shù)據(jù)庫連接,存放在database中。
- (void) initDatabaseConnection
{
if (sqlite3_open([[self sqliteDBFilePath] UTF8String], &database) != SQLITE_OK)
{
sqlite3_close(database);
NSAssert1(0, @"Failed to open database with message '%s'.", sqlite3_errmsg(database));
}
}
2.2 讀取操作數(shù)據(jù)
對數(shù)據(jù)表的數(shù)據(jù)進行讀寫,首先定義sql語句,例如從表中讀取出所有的數(shù)據(jù),可以定以定義字符串,然后將該sql語句編譯為sqlite內(nèi)部的一個結構體。
const char *sql = "SELECT * FROM tb_table1 ";
sqlite3_prepare_v2(kBookDatabase, sql, -1, &fetchBookIndexesStatement, NULL);
調(diào)用sqlite3_step方法執(zhí)行sql語句,將結果進行相應的處理。
sqlite3_step(fetchBookIndexesStatement)
2.3 關閉數(shù)據(jù)庫
當數(shù)據(jù)庫訪問結束后,及時的關閉數(shù)據(jù)庫,釋放數(shù)據(jù)庫占用過的資源。
- (void) closeDatabase
{
if (sqlite3_close(database) != SQLITE_OK)
{
NSAssert1(0, @"Error: failed to close database with message '%s'.", sqlite3_errmsg(database));
}
}
3? 遠程數(shù)據(jù)庫服務器的訪問
本地數(shù)據(jù)庫的訪問僅供用戶本機上的數(shù)據(jù)保存與訪問,現(xiàn)在我們更多的是訪問網(wǎng)絡數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)的共享。一般來講,我們的項目包含前臺和后臺部分。后臺是數(shù)據(jù)庫服務器,前臺則是我們用戶程序。我們通過前臺的應用程序訪問后臺數(shù)據(jù),實現(xiàn)用戶交互、數(shù)據(jù)的共享。用戶程序是如何訪問遠程服務器中的數(shù)據(jù)?
3.1 遠程數(shù)據(jù)庫服務器的接口信息
首先需知道服務器的網(wǎng)絡地址,在此假定服務器地址為:server:http://182.114.11.2,我們以用戶登錄功能為例。從系統(tǒng)的數(shù)據(jù)庫開發(fā)文檔中,獲取有關登陸功能需要訪問的數(shù)據(jù)表接口文件。
接口文件詳細列明了服務器訪問的地址,訪問時需要給出的參數(shù),訪問后的結果。
3.2 連接服務器
根據(jù)接口中的類型post定義一個方法,在項目開發(fā)中,定義文件都是分類存儲,對于接口數(shù)據(jù)庫的類,我們單獨定義了一個RequestAPI類,其中的方法主要是用來訪問和連接服務器。
+ (void)postURL:(NSString *)request withParameters:(NSDictionary *)parameter success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure {
NSString *server ="http://182.114.11.2";
NSString *url = [NSString stringWithFormat:@"%@%@", server, request];
NSString *decodedURL = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
[[AppAPIClient sharedJSONClient] POST:decodedURL parameters:parameter progress:nil success:^(NSURLSessionDataTask *operation, id responseObject) {
success(responseObject);
} failure: ^(NSURLSessionDataTask *operation, NSError *error) {
failure(error);
}];
}
3.3 數(shù)據(jù)訪問結果
首先定義功能接口url。
NSString *request = @"/login";
其次定義接口中的入?yún)?。其中調(diào)用的[Utilities uniqueVendor]是用來獲取手機的設備號。
NSDictionary *parameters = @{@"deviceId" : [Utilities uniqueVendor], @"deviceType" : @7001, @"userName" : _usernameTF.text, @"password" : encodedPwd};
調(diào)用RequestAPI類中的postURL方法連接數(shù)據(jù)庫
[RequestAPI postURL:request withParameters:parameters success:^(id responseObject) {
//判斷連接訪問數(shù)據(jù)庫后的結果。根據(jù)接口文件中列明的成功返回值為8001
if ([responseObject[@"resultFlag"] integerValue] == 8001) {
……
}
4? 結語
在IOS中常見的數(shù)據(jù)存儲形式有plist格式文件存儲、沙盒存儲、文件存儲、數(shù)據(jù)庫存儲,在本文中,主要描述數(shù)據(jù)庫存儲中的本地和遠程訪問方式,對兩者在數(shù)據(jù)庫連接、數(shù)據(jù)讀寫操作等方法和函數(shù)的調(diào)用,功能的實現(xiàn)進行了描述。
參考文獻
[1] 崔璨,王朋嬌,段婷婷.基于iOS系統(tǒng)的MOOC學習APP優(yōu)化策略研究[J].軟件導刊,2017,16(9):10-13,18.
[2] 趙雙久.數(shù)據(jù)庫訪問技術在VB編程開發(fā)中的應用[J].電腦知識與技術,2019,15(31):11-12.
[3] 段世娟.數(shù)據(jù)庫訪問技術在VB編程開發(fā)中的應用[J].電子技術與軟件工程,2019(15):120-121.
[4] 李清平,孟祥芳,宋國順.基于iOS系統(tǒng)的天氣App程序開發(fā)與應用[J].軟件工程,2017,20(11):41-43.
[5] 邱博. 面向iOS平臺的多數(shù)據(jù)庫訪問模式研究[D]. 2014.
[6] 陳旭. 軟件開發(fā)中數(shù)據(jù)庫設計理論及設計方式研究[J]. 信息與電腦, 2016, 361(15):148-149.