簡介:
很早就想整理一下數(shù)據(jù)庫的使用了,剛好最近接觸較多,加之可以安排出空余的時間,所以瓜子我貢獻(xiàn)出自己喝咖啡的時間整理一下FMDB的使用,以下是對FMDB的介紹以及基本使用 --- insert、delete、update、select。其中select講了兩種比較重要的方式---ID查詢、模糊查詢。
在iOS中,主要有5種數(shù)據(jù)緩存的策略:
1、plist
2、歸檔
3、偏好設(shè)置
4、沙盒文件
5、"SQLite數(shù)據(jù)庫"?
其中,"SQLite數(shù)據(jù)庫" 是最常用的數(shù)據(jù)緩存方式,在開發(fā)中,在無網(wǎng)絡(luò)的狀態(tài)下,數(shù)據(jù)庫常常發(fā)揮著非常大的作用!
系統(tǒng)提供的數(shù)據(jù)存儲方式的弊端 :
1)不方便操作大量的數(shù)據(jù)
- 系統(tǒng)提供的數(shù)據(jù)存儲方式都是覆蓋存儲的,新的數(shù)據(jù)會覆蓋舊的數(shù)據(jù).而且當(dāng)數(shù)據(jù)量非常大時,如果要添加新的數(shù)據(jù),必須先把舊數(shù)據(jù)全部加載到內(nèi)存中
2)不方便查找大量的數(shù)據(jù)
- 當(dāng)數(shù)據(jù)量非常龐大時,要查詢其中某些數(shù)據(jù),就非常困難。
而數(shù)據(jù)庫可以輕松解決以上弊端~
存儲方式:(類比于Excel表格)
"Excel" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "SQLite"
- 創(chuàng)建Excel文件 ? ? ? ? ? ? ? ? ? - 創(chuàng)建一個數(shù)據(jù)庫文件
- 創(chuàng)建表 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?- 創(chuàng)建表
- 確定表頭 ? ? ? ? ? ? ? ? ? ? ? ? ? ?- 創(chuàng)建數(shù)據(jù)庫的字段名(Excel表頭),并指定數(shù)據(jù)類型
- 對Excel表進(jìn)行數(shù)據(jù)操作 ? ?- 對數(shù)據(jù)庫進(jìn)行增刪改查
FMDB的使用流程:
簡單介紹:FMDB 是一個操作數(shù)據(jù)庫的第三方框架,并且支持多線程環(huán)境下的操作,也是需要手動導(dǎo)入'libsqlite3.0.tbd'庫,以O(shè)C的方式封裝了SQLite的C語言API。方便靈活并且線程安全。
"FMDatabase" : 單線程;"FMDatabaseQueue" : 多線程;"FMResultSet" : 查詢的結(jié)果集。
1、創(chuàng)建數(shù)據(jù)庫單例對象(一個數(shù)據(jù)庫可以存在多個表)
2、創(chuàng)建數(shù)據(jù)庫儲存路徑
3、創(chuàng)建表
4、對表格進(jìn)行增刪改查等操作
上代碼:
1、創(chuàng)建數(shù)據(jù)庫單例對象,如圖1

注意:創(chuàng)建單例的原因是保證數(shù)據(jù)庫隊列只創(chuàng)建一次,全局只有一個串行隊列,這樣操作數(shù)據(jù)更安全。
2、創(chuàng)建數(shù)據(jù)庫路徑和表格,如圖 2


解析:單引號‘’中為表格的字段名,逗號后面為字段所屬類型,字段類型是整形就用interger,字符串就用text。
注意:主鍵要想實現(xiàn)自動增長,不能是text類型。
我們看到,在沙盒中已經(jīng)建好了表名為:JLcharacterModel 的數(shù)據(jù)庫。如圖3

3、進(jìn)行數(shù)據(jù)庫操作 ---增刪改查
提示:建表,增刪改 操作都是方法 "[_db executeUpdate]"或者"[_db executeStatements]",查詢是另外的方法 "[_db executeQuery]" ?。星號(*)是選取所有列的快捷方式。SQL 語句對大小寫不敏感。SELECT 等效于 select。
1 ) INSERT INTO?
INSERT INTO 語句用于向表格中插入新的行。
語法:INSERT INTO 表名稱 VALUES (值1, 值2,....)
也可以向指定的列插入數(shù)據(jù):INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
將數(shù)據(jù)寫入表格,如圖4(以下數(shù)據(jù)來源于卓浦士科技所屬的app ---足球技能分析大師TropsX的云端數(shù)據(jù),因為安全問題,將部分信息遮擋,敬請諒解)

注意!請注意:
?1)列名稱和值名稱的順序要一一對應(yīng)!例如:列名banner要對應(yīng)自己的類型text。
?2)如果列名類型是NSString,則需要加單引號 ‘’ 括住,例如:'%@',只應(yīng)用于字符串類型。
?3)對數(shù)據(jù)庫進(jìn)行操作增刪改查之前要先打開數(shù)據(jù)庫,操作完畢要關(guān)閉數(shù)據(jù)庫。這只是一種嚴(yán)謹(jǐn)?shù)膶懛?,最好這樣,否則可能會操作失敗。
打開app本地數(shù)據(jù)庫查看我們創(chuàng)建好的表格,如圖 5

這時候你會發(fā)現(xiàn),表格是空的?。。。。hat ?
仔細(xì)一看,原來是創(chuàng)建表格的表名稱寫錯了??!把 CharaterModel 改為 JLCharaterModel ,so,數(shù)據(jù)庫路徑的表名稱跟插入數(shù)據(jù)寫的表名稱一定要相同!運行程序。鐺鐺鐺~

注釋:圖 6 信息顯示不全。
2)DELETE
DELETE 語句用于刪除表中的行。
語法:DELETE FROM 表名稱 WHERE 列名稱 = 值,刪除所有行:DELETE FROM 表名 或者DELETE * FROM 表名。
現(xiàn)在我們刪除itemid為Shoe0101、Shoe0102這兩行~ 代碼如圖 7。

來看看數(shù)據(jù)庫是否已經(jīng)刪除成功,如圖8:鐺鐺鐺~

已經(jīng)刪除成功~
3)UPDATE
Update 語句用于修改表中的數(shù)據(jù)。
語法:更新某行的一列:UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值。更新某行的若干列:UPDATE 表名稱 SET 列名稱1 = 新值1 ,列名稱2 = 新值2 WHERE 列名稱 = 某值。
將idNew為10000103的那一行 name改為靜林是真的瓜子,status改為U,看代碼:如圖 9。

圖10 看看更新成功了沒有?

到這里就非常完美了~~
4)SELECT
SELECT 語句用于從表中選取數(shù)據(jù)。結(jié)果被存儲在一個結(jié)果表中(稱為結(jié)果集)。
語法:SELECT 列名稱 FROM 表名稱 或者 SELECT * FROM 表名稱。
再次提示:星號(*)是選取所有列的快捷方式。SQL 語句對大小寫不敏感。SELECT 等效于 select。
在講update的時候已經(jīng)寫了一些select的語句了。通過條件查詢,圖 11看代碼~

注意:獲取結(jié)果集列順序的時候,一定要取對類型,比如banner類型是字符串就要用stringForColumnIndex,整形就要使用intForColumnIndex,長整型就要使用longForColumnIndex,類型取不對,會導(dǎo)致返回的結(jié)果不對,切記!
查詢itemid為Shoe0103的結(jié)果,通過斷點,我們可以知道返回了一個帶有屬性的model,如圖12:

通過關(guān)鍵字查詢結(jié)果,如圖13:


我們查詢列名name有“瓜子”、expiredays == 90的結(jié)果,如圖14:

可以看到得出一個結(jié)果~~
大坑注意:
?1)模糊查詢時,需要自己拼接查詢語句,不要使用框架提供的
2)'%' 是特殊字符,此時需要使用%轉(zhuǎn)義.即 '%%'
3)自己拼接查詢語句時,就需要自己添加單引號把字符串引起來
錯誤的拼接和執(zhí)行模糊查詢的方式:FMResultSet *resultSet = [_db executeQueryWithFormat:@"select * from t_heros where name like '%%%@%%'",keyWord];
正確的拼接和執(zhí)行模糊查詢的方式:NSString *selectSQL = [NSString stringWithFormat:@"select * from t_heros where name like '%%%@%%'",keyWord];
FMResultSet *resultSet = [_db executeQuery:selectSQL];
github鏈接:https://github.com/ccgus/fmdb
參考文章:http://www.brianjcoleman.com/framework-using-fmdb-to-communicate-with-sqlite-databases/
到這里就寫完啦~希望對你有所幫助!不足之處敬請諒解并希望加以指正!QQ:1002282311 謝謝~~