從J2EE到IOS,反向學習IOS“數據庫”

? JAVA,從客戶端到服務器端方向看,JAVA開發服務器端需要做的事情:1.接收數據 2.組織數據 3.調用邏輯層接口存儲數據 4.反饋結果。

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

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

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

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

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

sqlite3_open() ? //打開數據庫

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

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

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

sqlite3_column()//結果的列信息

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

sqlite3_close() ? //關閉庫

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

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

//獲取數據庫文件路徑 ?

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

NSString *documentsDirectory = [paths objectAtIndex:0];

self.databaseFilePath = [documentsDirectory stringByAppendingPathComponent:kDatabaseName];

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

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

sqlite3 *database;

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

sqlite3_close(database);

//創建數據庫表,學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);

}

//執行查詢

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);

}

//關閉數據庫

sqlite3_close(database);

?


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


1.第一步連接數據庫

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

2.第二步打開數據庫

if(![db open]) return;

3.第三步執行更新

[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去實現自己的業務邏輯吧。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容