iOS-數據持久化-第三方框架FMDB的使用

FMDB簡單介紹

一、簡單說明

1.什么是FMDB

FMDB是iOS平臺的SQLite數據庫框架

FMDB以OC的方式封裝了SQLite的C語言API

?

2.FMDB的優點

使用起來更加面向對象,省去了很多麻煩、冗余的C語言代碼

對比蘋果自帶的Core Data框架,更加輕量級和靈活

提供了多線程安全的數據庫操作方法,有效地防止數據混亂

?

3.FMDB的github地址

https://github.com/ccgus/fmdb

?

二、核心類

FMDB有三個主要的類

(1)FMDatabase

一個FMDatabase對象就代表一個單獨的SQLite數據庫

用來執行SQL語句

?

(2)FMResultSet

使用FMDatabase執行查詢后的結果集

?

(3)FMDatabaseQueue

用于在多線程中執行多個查詢或更新,它是線程安全的

?

三、打開數據庫

通過指定SQLite數據庫文件路徑來創建FMDatabase對象

FMDatabase *db = [FMDatabase databaseWithPath:path];

if (![db open]) {

? ? NSLog(@"數據庫打開失敗!");

}

?

文件路徑有三種情況

(1)具體文件路徑

  如果不存在會自動創建

?

(2)空字符串@""

  會在臨時目錄創建一個空的數據庫

  當FMDatabase連接關閉時,數據庫文件也被刪除

?

(3)nil

  會創建一個內存中臨時數據庫,當FMDatabase連接關閉時,數據庫會被銷毀

?

四、執行更新

在FMDB中,除查詢以外的所有操作,都稱為“更新”

create、drop、insert、update、delete等

?

使用executeUpdate:方法執行更新

- (BOOL)executeUpdate:(NSString*)sql, ...

- (BOOL)executeUpdateWithFormat:(NSString*)format, ...

- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments

?

示例

[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]

?

五、執行查詢

查詢方法

- (FMResultSet *)executeQuery:(NSString*)sql, ...

- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...

- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments

?

示例

// 查詢數據

FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];

?

// 遍歷結果集

while ([rs next]) {

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

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

? ? double score = [rs doubleForColumn:@"score"];

}

?

六、代碼示例

1.新建一個項目,導入libsqlite3庫,并在項目中包含主頭文件

2.下載第三方框架FMDB

  

3.示例代碼

  YYViewController.m文件

復制代碼
 1 //2 //  YYViewController.m3 //  04-FMDB基本使用4 //5 //  Created by apple on 14-7-27.6 //  Copyright (c) 2014年 wendingding. All rights reserved.7 //8 9 #import "YYViewController.h"
10 #import "FMDB.h"
11 
12 @interface YYViewController ()
13 @property(nonatomic,strong)FMDatabase *db;
14 @end
15 
16 @implementation YYViewController
17 
18 - (void)viewDidLoad
19 {
20     [super viewDidLoad];
21     //1.獲得數據庫文件的路徑
22     NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
23     NSString *fileName=[doc stringByAppendingPathComponent:@"student.sqlite"];
24     
25     //2.獲得數據庫
26     FMDatabase *db=[FMDatabase databaseWithPath:fileName];
27     
28     //3.打開數據庫
29     if ([db open]) {
30         //4.創表
31         BOOL result=[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
32         if (result) {
33             NSLog(@"創表成功");
34         }else
35         {
36             NSLog(@"創表失敗");
37         }
38     }
39     self.db=db;
40 
41 }
42 
43 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
44 {
45     [self delete];
46     [self insert];
47     [self query];
48 }
49 
50 //插入數據
51 -(void)insert
52 {
53     for (int i = 0; i<10; i++) {
54         NSString *name = [NSString stringWithFormat:@"jack-%d", arc4random_uniform(100)];
55         // executeUpdate : 不確定的參數用?來占位
56         [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", name, @(arc4random_uniform(40))];
57         //        [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);" withArgumentsInArray:@[name, @(arc4random_uniform(40))]];
58         
59         // executeUpdateWithFormat : 不確定的參數用%@、%d等來占位
60         //        [self.db executeUpdateWithFormat:@"INSERT INTO t_student (name, age) VALUES (%@, %d);", name, arc4random_uniform(40)];
61     }
62 }
63 
64 //刪除數據
65 -(void)delete
66 {
67     //    [self.db executeUpdate:@"DELETE FROM t_student;"];
68     [self.db executeUpdate:@"DROP TABLE IF EXISTS t_student;"];
69     [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
70 }
71 
72 //查詢
73 - (void)query
74 {
75     // 1.執行查詢語句
76     FMResultSet *resultSet = [self.db executeQuery:@"SELECT * FROM t_student"];
77     
78     // 2.遍歷結果
79     while ([resultSet next]) {
80         int ID = [resultSet intForColumn:@"id"];
81         NSString *name = [resultSet stringForColumn:@"name"];
82         int age = [resultSet intForColumn:@"age"];
83         NSLog(@"%d %@ %d", ID, name, age);
84     }
85 }
86 
87 @end
復制代碼

打印查看結果:

提示:

如果ID設置為逐漸,且設置為自動增長的話,那么把表中的數據刪除后,重新插入新的數據,ID的編號不是從0開始,而是接著之前的ID進行編號。

注意:

  不要寫成下面的形式,不要加'',直接使用%@,它會自動認為這是一個字符串。

?--------------------------------------------------------------------------------------------------------------------------------------------------------------

FMDB數據庫隊列

一、代碼示例

1.需要先導入FMDB框架和頭文件,由于該框架依賴于libsqlite庫,所以還應該導入該庫。

2.代碼如下:

復制代碼
 1 //2 //  YYViewController.m3 //  05-FMDB數據庫隊列4 //5 //  Created by apple on 14-7-28.6 //  Copyright (c) 2014年 wendingding. All rights reserved.7 //8 9 #import "YYViewController.h"
10 #import "FMDB.h"
11 
12 @interface YYViewController ()
13 @property(nonatomic,strong)FMDatabaseQueue *queue;
14 @end
15 
16 @implementation YYViewController
17 
18 - (void)viewDidLoad
19 {
20     [super viewDidLoad];
21     
22     //1.獲得數據庫文件的路徑
23     NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
24     NSString *fileName=[doc stringByAppendingPathComponent:@"person.sqlite"];
25     
26     //2.獲得數據庫隊列
27     FMDatabaseQueue *queue=[FMDatabaseQueue databaseQueueWithPath:fileName];
28 //    FMDatabase *db=[FMDatabase databaseWithPath:fileName];
29     
30     //3.打開數據庫
31     [queue inDatabase:^(FMDatabase *db) {
32          BOOL result=[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
33         if (result) {
34             NSLog(@"創表成功");
35         }else
36         {
37             NSLog(@"創表失敗");
38         }
39     }];
40     self.queue=queue;
41     
42 }
43 
44 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
45 {
46     //插入數據
47 //    [self.queue inDatabase:^(FMDatabase *db) {
48 //        [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
49 //    }];
50     
51     //查詢數據
52     [self.queue inDatabase:^(FMDatabase *db) {
53         // 1.執行查詢語句
54         FMResultSet *resultSet = [db executeQuery:@"SELECT * FROM t_person"];
55 
56         // 2.遍歷結果
57         while ([resultSet next]) {
58             int ID = [resultSet intForColumn:@"id"];
59             NSString *name = [resultSet stringForColumn:@"name"];
60             int age = [resultSet intForColumn:@"age"];
61             NSLog(@"%d %@ %d", ID, name, age);
62         }
63     }];
64 
65 }
66 
67 @end
復制代碼

先插入數據,之后查詢結果,打印如下:

3.代碼說明

有了一個隊列對象,它的內部自動就擁有一個數據庫對象,且數據庫的操作是線程安全的。
二、事務
事務,沒有事務的話會出現問題。
舉例:銀行的例子
張三和李四賬戶都有1000塊錢,如果張三要轉賬給李四,需要執行兩條SQL語句,考慮到安全性,要求這兩條魚具要么全部執行成功,要不全部執行失敗。
事務:把多條語句放到同一個事務中,要么全部成功,要不全部失敗(如果中途出現問題,那么會自動回滾)。事務的執行具有原子性。
事務代碼處理:
把多條語句添加到一個事務中去執行:
復制代碼
1    //插入數據
2     [self.queue inDatabase:^(FMDatabase *db) {
3         [db beginTransaction];
4         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
5         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];
6         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];
7         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @25];
8         [db commit];
9     }];
復制代碼

如果中途出現問題,那么會自動回滾,也可以選擇手動回滾。

復制代碼
 1     //插入數據2     [self.queue inDatabase:^(FMDatabase *db) {3         [db beginTransaction];4         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];5         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];6         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];7         [db rollback];8         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @25];9         [db commit];
10     }];
復制代碼

上面的代碼。前三條插入語句是作廢的。

事務處理的另一種方式:

1    [self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
2         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @22];
3         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @23];
4         [db executeUpdate:@"INSERT INTO t_person (name, age) VALUES (?, ?);",@"wendingding", @24];
5     }];

說明:先開事務,再開始事務,之后執行block中的代碼段,最后提交事務。

轉載于:https://www.cnblogs.com/LifeTechnologySupporter/p/5016938.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397149.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397149.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397149.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電腦word文檔打不開怎么辦_word怎么轉pdf?兩個值得學習的高效轉換法

word怎么轉pdf&#xff1f;兩個值得學習的高效轉換法word怎么轉pdf&#xff1f;pdf格式是我們經常能夠使用到的格式&#xff0c;因為pdf格式在傳遞的過程中能更好地避免文件出現亂碼打不開或誤觸導致文件被修改的情況。那如果想要把word文件轉換成pdf格式以避免閱讀word時文件被…

sql server常用函數、常用語句

一、常用函數 1.字符串函數 &#xff1a; charindex(:,abc:123) --尋找一個字符在一段字符串中起始的位置 len(zhangsan) --獲取一段字符串的長度 left(Ly,君子之耀,2) --從一段字符串左邊返回指定長度的字符 right(char_expr,int_expr) --返回字符串右邊int_expr個字符 …

python 矩陣乘法 跳過nan_python – Numpy:當一些向量元素等于零時,矩陣向量乘法不會跳過計算嗎?...

我最近一直致力于一個項目,其中我的大部分時間花費在密集矩陣A和稀疏向量v上(見here).在我嘗試減少計算時,我注意到A.dot(v)的運行時間不受v的零條目數的影響.為了解釋為什么我希望在這種情況下改進運行時,讓result A.dot.v使得j 1的結果[j] sum_i(A [i,j] * v [j])… v.sha…

[轉]Responsive Tables Demo

本文轉自&#xff1a;http://elvery.net/demo/responsive-tables/ A quick and dirty look at some techniques for designing responsive table layouts. This was put together in haste (and with the aid of Twitter Bootstrap) for What Do You Know Brisbane hosted by W…

Scala函數式對象-有理數

有理數類的表示 實現規范&#xff1a;支持有理數的加減乘除&#xff0c;并支持有理數的規范表示 1.定義Rational 首先&#xff0c;考慮用戶如何使用這個類&#xff0c;我們已經決定使用“Immutable”方式來使用Rational對象&#xff0c;我們需要用戶在定義Rational對象時提供分…

2020雙十一實時大屏_2020拼多多雙十一,拼多多雙十一活動

2020拼多多雙十一&#xff0c;拼多多雙十一活動&#xff0c;2020拼多多雙十一&#xff0c;拼多多雙十一活動2020拼多多雙十一&#xff0c;拼多多雙十一活動拼多多雙11來了全球狂歡節先領券再購物低價風暴 震撼來襲沒有最低 只有更低拼多多優惠券商城拼多多優惠商城&#xff0c;…

dataTables本地刷新數據解決只能初始化一次問題

2019獨角獸企業重金招聘Python工程師標準>>> dataTables的表格只能初始化一次&#xff0c;這樣如果需要動態改變表格數據的話就需要寫多個表格&#xff0c;這樣很顯然不是一個好的解決方案。 dataTables Api提供了刷新數據解決方案&#xff1a; 這里大概說一下案例&…

安裝Ubuntu版本linux過程中沒有提示設置root用戶密碼問題的解決辦法

原來ubunto不提倡設置root用戶&#xff0c;系統安裝成功后&#xff0c;root密碼是隨機的&#xff0c;那么在這種情況下如何得到root權限吶&#xff0c;具體方法如下&#xff1a; 終端中輸入&#xff1a;sudo passwd root 此時重新設置原登錄用戶的密碼。 設置成功后在終端繼續輸…

linux命令headtail

一、head語法head [-n -k ]... [FILE]...//k是數字默認是顯示開頭前10行。head /etc/passwd顯示開頭前5行head -5 /etc/passwdhead -n 5 /etc/passwd&#xff08;注意和以下的有-的差別&#xff09;head -n 5 /etc/passwd 除最后k行外&#xff0c;顯示剩余所有內容。head -n -5…

用-force –opengl 指令_蘋果新系統ios14新功能匯總 輕點背面等小技巧怎么用

在 iOS 14 以及更新系統中&#xff0c;蘋果為 iPhone X 以及更新機型帶來了“輕點背面”功能&#xff0c;可以讓用戶輕點手機背面來實現更多操作&#xff0c;并且這項功能還支持“快捷指令”。例如&#xff0c;如果您不希望應用讀取剪貼板中私密內容&#xff0c;可以利用“輕點…

PE文件格式(加密與解密3)(一)

本次的了解主要講解 PE的基本概念、MS-DOS文件頭、PE文件頭、區塊、輸入表、輸出表等。 這里我將會結合一個簡單的小程序來加深我對PE文件結構的了解。 使用學習工具&#xff1a;有StudyPE、LordPE、PEID。 學習PE建議看書。。和自己動手。。。 PE文件&#xff1a; 在WIN上&…

mysql用戶_MySQL用戶權限管理詳解

用戶權限管理主要有以下作用&#xff1a;1. 可以限制用戶訪問哪些庫、哪些表2. 可以限制用戶對哪些表執行SELECT、CREATE、DELETE、DELETE、ALTER等操作3. 可以限制用戶登錄的IP或域名4. 可以限制用戶自己的權限是否可以授權給別的用戶一、用戶授權mysql> grant all privile…

對ContentProvider中getType方法的一點理解

在上篇博客中我們介紹了自定義ContentProvider&#xff0c;但是遺漏掉了一個方法&#xff0c;那就是getType&#xff0c;自定義ContentProvider一般用不上getType方法&#xff0c;但我們還是一起來探究下這個方法究竟是干什么的&#xff1f;我們先來看看ContentProvider中對這個…

手把手教Electron+vue的使用

.現如今前端框架數不勝數&#xff0c;尤其是angular、vue吸引一大批前端開發者&#xff0c;在這個高新技術快速崛起的時代&#xff0c;自然少不了各種框架的結合使用。接下來是介紹electronvue的結合使用。 2.Electron是什么&#xff1f;&#xff1f; 對于我來說Electron相當于…

shell循環和分支

循環和分支對代碼塊的操作是構造組織shell腳本的關鍵. 循環和分支結構為腳本編程提供了操作代碼塊的工具.10.1. Loops循環就是重復一些命令的代碼塊,如果條件不滿足就退出循環.for loopsfor arg in [list]這是一個基本的循環結構.它與C的for結構有很大不同.forarg in [list]do …

mysql主從_MySQL主從原理及配置詳解

MySQL主從配置及原理&#xff0c;供大家參考&#xff0c;具體內容如下一、環境選擇&#xff1a;1.Centos 6.52.MySQL 5.7二、什么是MySQL主從復制MySQL主從復制是其最重要的功能之一。主從復制是指一臺服務器充當主數據庫服務器&#xff0c;另一臺或多臺服務器充當從數據庫服務…

引導修復 不是活動的_河南省視頻數據修復中心

河南省視頻數據修復中心 lk6afds河南省視頻數據修復中心 文件預覽我找到了我要恢復文件&#xff0c;可是&#xff0c;這個文件能能正確恢復呢。沒有用的文件不可以刪掉嗎。我們先來看看盤文件夾都是什么吧。(以下僅限于~系統)一般來說&#xff0c;剛剛安裝的電腦系統盤主要包含…

企業日志分析 五大問題需重點注意

資訊 | 安全 | 論壇 | 下載 | 讀書 | 程序開發 | 數據庫 | 系統 | 網絡 | 電子書 | 微信學院 | 站長學院 | 源碼 | QQ | 專欄 | 考試 | 系統安全| 網站安全| 企業安全| 網絡安全| 工具軟件| 殺毒防毒| 加密解密|首頁 > 安全 > 企業安全 > 正文企業安全…

sqlite換成mysql_從SQLITE的數據轉到MYSQL

接同事需求&#xff0c;要求從SQLITE的數據轉到MYSQL&#xff0c;這東西以前也沒接觸過。這里搜搜&#xff0c;那里試試&#xff0c;下面把過程列一下。主要過程分三步&#xff1a;1&#xff0c;把SQLITE表結構導出來&#xff0c;作一定的格式調整2&#xff0c;把SQLITE數據導出…

python學習筆記(一):python入門

上周六終于開始接觸心心念念的python了&#xff0c;本人學習語言算是零基礎&#xff0c;java語法比較復雜&#xff0c;所以選擇了一個語法相對還是比較簡單&#xff0c;而且現在使用也是越來越廣泛的python進行了學習。下面就言歸正傳吧 在學習python之前先來了解下現今比較流行…