iOS數(shù)據(jù)庫FMDB--增刪改查(模糊查詢)詳細(xì)介紹

簡介:

很早就想整理一下數(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

圖 1

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

2、創(chuàng)建數(shù)據(jù)庫路徑和表格,如圖 2

圖 2

解析:單引號‘’中為表格的字段名,逗號后面為字段所屬類型,字段類型是整形就用interger,字符串就用text。

注意:主鍵要想實現(xiàn)自動增長,不能是text類型。

我們看到,在沙盒中已經(jīng)建好了表名為:JLcharacterModel 的數(shù)據(jù)庫。如圖3

圖 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ù),因為安全問題,將部分信息遮擋,敬請諒解)

圖 4

注意!請注意:

?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

圖 5

這時候你會發(fā)現(xiàn),表格是空的?。。。。hat ?

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

圖 6

注釋:圖 6 信息顯示不全。

2)DELETE

DELETE 語句用于刪除表中的行。

語法:DELETE FROM 表名稱 WHERE 列名稱 = 值,刪除所有行:DELETE FROM 表名 或者DELETE * FROM 表名。

現(xiàn)在我們刪除itemid為Shoe0101、Shoe0102這兩行~ 代碼如圖 7。

圖 7

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

圖 8

已經(jīng)刪除成功~

3)UPDATE

Update 語句用于修改表中的數(shù)據(jù)。

語法:更新某行的一列:UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值。更新某行的若干列:UPDATE 表名稱 SET 列名稱1 = 新值1 ,列名稱2 = 新值2 WHERE 列名稱 = 某值。

將idNew為10000103的那一行 name改為靜林是真的瓜子,status改為U,看代碼:如圖 9。

圖 9

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

圖 10

到這里就非常完美了~~

4)SELECT

SELECT 語句用于從表中選取數(shù)據(jù)。結(jié)果被存儲在一個結(jié)果表中(稱為結(jié)果集)。

語法:SELECT 列名稱 FROM 表名稱 或者 SELECT * FROM 表名稱。

再次提示:星號(*)是選取所有列的快捷方式。SQL 語句對大小寫不敏感。SELECT 等效于 select。

在講update的時候已經(jīng)寫了一些select的語句了。通過條件查詢,圖 11看代碼~

圖 11

注意:獲取結(jié)果集列順序的時候,一定要取對類型,比如banner類型是字符串就要用stringForColumnIndex,整形就要使用intForColumnIndex,長整型就要使用longForColumnIndex,類型取不對,會導(dǎo)致返回的結(jié)果不對,切記!

查詢itemid為Shoe0103的結(jié)果,通過斷點,我們可以知道返回了一個帶有屬性的model,如圖12:

圖 12

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

圖 13

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

圖 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 謝謝~~

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

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

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