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