從J2EE到IOS,反向?qū)W習IOS“數(shù)據(jù)庫”

? JAVA,從客戶端到服務器端方向看,JAVA開發(fā)服務器端需要做的事情:1.接收數(shù)據(jù) 2.組織數(shù)據(jù) 3.調(diào)用邏輯層接口存儲數(shù)據(jù) 4.反饋結(jié)果。

? ?IOS ,從服務器端到客戶端方向看, IOS開發(fā)客戶端需要做的事情:1.接收數(shù)據(jù) 2.組織數(shù)據(jù) 3.調(diào)用邏輯層接口 4.展示數(shù)據(jù)。

? ?用戶:從手機到人, 人需要做的事情:1.接收數(shù)據(jù)(比如打開簡書應用獲取數(shù)據(jù)) 2.組織數(shù)據(jù)(分類關(guān)注應用) 3.調(diào)用邏輯層接口(打開一片文章思考內(nèi)容) 4.存儲數(shù)據(jù)(記憶部分)。

? ? 這樣類比來看,我們與別人交換數(shù)據(jù),所做的事情過程都是相似的,JAVA做的事情,IOS也都要做一遍,所以我的學習路線是從數(shù)據(jù)為圓心,由內(nèi)到外反向的學習IOS之路,入門就比較快一些。

? ? 先說數(shù)據(jù)存儲,服務器端存儲方式多種多樣,大體分為內(nèi)存存儲和硬盤存儲,這都歸功于計算機組成就是這樣的,我們?nèi)ル娔X城攢機器,張口就來的幾要素CPU,內(nèi)存,硬盤,顯卡,網(wǎng)卡。程序的代碼就在這里面轉(zhuǎn)來轉(zhuǎn)去,驅(qū)動著這些元素的數(shù)據(jù)交換,所以所存儲的模式肯定逃不出內(nèi)存和硬盤去。映射到編程中的概念就是內(nèi)存緩存和持久化緩存。JAVA服務器端流行的框架hibernate正是SSH中的H君,因為想要對比來形容一下IOS,所以這里不解釋hibernate細節(jié)了,提到的名詞度娘都能找到,谷歌就更別說了,簡單說,它用ORMapping的方式封裝了JDBC,用面向?qū)ο蟮乃季S在操作數(shù)據(jù)庫。

? ? ? ORMapping用對象和表的關(guān)系形容,就是類名對應表名,對象的一個屬性對應表中的一列,一個對象對應表的一行數(shù)據(jù),既然服務器有hibernate,我在初學OC的時候想,那IOS都用什么存儲呢,通過度娘了解到了幾種手機端存儲數(shù)據(jù)庫的方式 :首先手機端的數(shù)據(jù)庫大多用sqlite存儲數(shù)據(jù),特點就是輕量簡單,我想,你數(shù)據(jù)庫再輕量簡單,既然是關(guān)系型數(shù)據(jù)庫,基本的操作也都不能少吧,ANSI SQL規(guī)范你得遵守吧,先不想IOS的sqlite的API怎么寫,先回想一下JDBC數(shù)據(jù)庫操作的的過程,JDBC可是JAVA程序員面試時候必聊的內(nèi)容哦,加載驅(qū)動->連接庫->打開庫->創(chuàng)建Statement->根據(jù)sql執(zhí)行語句->ResultSet接收結(jié)果->while result ?has next 方式去解析每一行數(shù)據(jù)->關(guān)閉結(jié)果集->關(guān)閉數(shù)據(jù)庫。這個時候再去搜一下ios sqlite的關(guān)鍵字,去看里面文章的幾個名詞:

sqlite3_open() ? //打開數(shù)據(jù)庫

sqlite3_prepare()//是類似JAVA的PreparedStatement,準備語句對象

sqlite3_stmt //stmt ?也能猜到是PreparedStatement的縮寫了

sqlite3_step() ? ?//執(zhí)行查詢語句

sqlite3_column()//結(jié)果的列信息

sqlite3_finalize()//析構(gòu),刪除編譯后的statement

sqlite3_close() ? //關(guān)閉庫

然后繼續(xù)搜到了一個簡單的操作庫的過程,地址是這里http://blog.sina.com.cn/s/blog_bf9843bf0101g043.html

對比一下JDBC的寫法,理解起來容易多了。

//獲取數(shù)據(jù)庫文件路徑 ?

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

self.databaseFilePath = [documentsDirectory stringByAppendingPathComponent:kDatabaseName];

注: 取沙盒document文件夾下的數(shù)據(jù)庫的路徑,這里想說的是,看起來三行很多,第一眼看到我就想,一個個的都是啥啊,其實,這種寫法算是固定寫法,所以固定寫法不用記憶,用的時候搜“IOS取沙盒路徑寫法”之類的關(guān)鍵字都能找到吧,找到了時候封裝一個方法就用去了,在初學的時候想快速做出東西來完成任務,可不能陷入一行行摳語法的思維里,知道我能通過一個固定寫法拿到一個路徑即可,JAVA也是一樣的,F(xiàn)ile操作的寫法是固定的,當了解java的IO全貌后,有時間再回來看File的流棧就好理解了,再去摳細節(jié)作為知識點的補充去學,包括后面的數(shù)據(jù)庫操作,都是固定寫法,變的只是sql語句和結(jié)果集,我們目的是要最少的時間完成工作任務,看到產(chǎn)品展示出的結(jié)果,產(chǎn)品都能迭代,學習也能迭代。

//以IOS的方式打開數(shù)據(jù)庫,固定寫法!貼過來。

sqlite3 *database;

if (sqlite3_open([self.databaseFilePath UTF8String] , &database) != SQLITE_OK) {

sqlite3_close(database);

//創(chuàng)建數(shù)據(jù)庫表,學JAVA的SQL肯定要學習的。

NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FIELDS (TAG INTEGER PRIMARY KEY, FIELD_DATA TEXT);";

char *errorMsg;

if (sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {

sqlite3_close(database);

}

//執(zhí)行查詢

NSString *query = @"SELECT TAG, FIELD_DATA FROM FIELDS ORDER BY TAG";

sqlite3_stmt *statement;

if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {

while (sqlite3_step(statement) == SQLITE_ROW) {

int tag = sqlite3_column_int(statement, 0);

char *rowData = (char *)sqlite3_column_text(statement, 1);

}

sqlite3_finalize(statement);

}

//關(guān)閉數(shù)據(jù)庫

sqlite3_close(database);

?


? 在搜索sqlite的時候,又發(fā)現(xiàn)了大家都推薦的FMDB框架,看一下用法,更加像JDBC,命名也比較好看,所以壓根就沒用sqlite,直接FMDB了,寫起來方便,用的時候架子搭上,寫熟悉的SQL就是了。這里順便說一下我對第三方開源框架的想法,我接觸過一些同事都喜歡自己去造輪子,什么東西都希望自己親自寫,覺得這樣能夠?qū)W習技術(shù),提升自己的能力。理由是第三方有很多東西不穩(wěn)定,維護起來困難,不如自己寫痛快。但是我的理解是用成熟的第三方開源框架不僅能事半功倍,還能更加迅速的學到別人的先進思想,而且框架用的人越多,文檔越全面,出現(xiàn)問題解決的途徑越多。想象一下,自己造的輪子上線后,在自己工作交接給下一任的時候,就知道別人會多么痛苦了,那時候一定會面臨交接倉促,無文檔,只有上帝和你知道這段代碼中隱藏的的邏輯。當在解決成熟框架問題的時候閱讀源碼后提升的能力不比自己完全寫一遍提升的少。說到這里,F(xiàn)MDB寫法是這樣的:


1.第一步連接數(shù)據(jù)庫

FMDatabase?*db?=?[FMDatabase databaseWithPath:PATH];

2.第二步打開數(shù)據(jù)庫

if(![db open]) return;

3.第三步執(zhí)行更新

[db executeUpdate:@"CREATE TABLE PersonList (Name text, Age integer, Sex integer, Phone text, Address text, Photo blob)"];

3.查詢是這么寫的

FMResultSet *rs = [db executeQuery:@"SELECT Name, Age, FROM PersonList where id = ?", 19999];

while([rs next]) {

NSString *name = [rs stringForColumn:@"Name"];

int age = [rs intForColumn:@"Age"];

}

[rs close];

[db close];

寫過JDBC的都能看明白這些吧,理解起來很順,迅速搭好框架,剩下的時間去組織復雜的SQL去實現(xiàn)自己的業(yè)務邏輯吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容