iOS sqlite3數據庫操作
一、前言
sqlite3數據庫是一種輕量型的數據庫,系統中已經默認安裝了,可以通過終端來查看:
首先進入模擬器的沙盒目錄中,我們在Documents目錄下創建一個sql文件,然后使用sqlite3來訪問這個文件。在終端中,可 以使用sql語句來對表進行操作,這里就不在贅述了,下面主要介紹使用代碼來對表進行操作。
二、使用代碼對數據庫進行增、刪、改、查。
2.1 導入頭文件
首先在工程下的BuildPHases下找到LinkBinary....什么的,然后點擊下面的加號,添加sql的庫,我們選擇添加的是第二個搜索結果。
然后再用到數據庫的類中導入即可
#import <sqlite3.h>
由于OC里面有關數據庫的操作都是基于C語言的,所以有可能不會提示。
2.2 正式使用
1. 打開數據庫
-(void)open{
//filename:數據庫的具體路徑
//ppdb:數據庫實例的地址
NSString * filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"db.sql"];
int status = sqlite3_open(filePath.UTF8String, &_db);
if(status == SQLITE_OK){
//打開成功
NSLog(@"打開成功");
}else{
NSLog(@"打開失敗");
}
}
首先我們在Documents目錄下需要創建一個名為 db.sql 的文件,所以我們拼接出這個文件的路徑。然后使用 sqlite_open的方法,這個方法接受兩個參數,一個是數據庫的具體的路徑,第二個是數據庫實例的地址。在之前已提過OC中的數據庫的操作都是基于C語言的,所以兩個參數的都是C語言中的類型,需要轉化。這個方法調用之后,會將數據庫實例的地址放入我們定義的屬性變量 db 中(注意這個屬性變量也是C語言類型的指針,所以用assign來修飾),這個方法返回一個狀態值,表示數據打開成功與否。
2. 創建表
-(void)createTable{
//1.創建sql語句
NSString * sql = @"create table student (id integer primary key autoincrement,name text,age integer)";
//2.執行語句
int status = sqlite3_exec(self.db, sql.UTF8String,NULL, NULL, NULL);
if (status == SQLITE_OK) {
NSLog(@"創建表成功");
}else{
NSLog(@"創建表失敗");
}
}
使用sqlite3_exec()方法來執行一個sql語句,它接受五個參數,第一個參數就是這個數據庫的實例,第二個就是執行的sql語句,第三個參數是一個函數指針,就是sql語句執行成功之后執行的回調函數,相當于OC中的block,第四個參數是一個任意類型的指針表示第一個需要回調的參數,最后一個參數表示的錯誤信息。這個方法返回一個狀態值,表示創建表是否成功。
3. 向表中插入,刪除,更改數據
-(void)insert{
NSString * sql = @"insert into student(name,age) values('Jack',20)";
if(sqlite3_exec(self.db,sql.UTF8String, NULL, NULL, NULL)==SQLITE_OK){
NSLog(@"插入數據成功");
}else{
NSLog(@"插入數據失敗");
}
}
我們向數據庫中插入一條數據,也是通過哦 sqlite3_exec()函數來完成,完成后可以通過訪問沙盒路徑下的sql文件來查看數據是否已經被插入表中。同理刪除,更改數據只是sql語句的不同,這里不再贅述。
4. 查詢數據
-(void)select{
//1.定義查詢語句
NSString * sql = @"select * from student";
//2.準備查詢語句(預處理) 將數據緩存到另外一個地方去->stmt
sqlite3_stmt * stmt = NULL;
if (sqlite3_prepare(self.db, sql.UTF8String, -1, &stmt, NULL)==SQLITE_OK) {
NSLog(@"預處理成功");
//3.一條條讀數據
while (sqlite3_step(stmt)==SQLITE_ROW) {
char * name = (char *) sqlite3_column_text(stmt, 1);
int age = (int) sqlite3_column_int(stmt, 2);
NSData * data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:sqlite3_column_bytes(stmt, 3)];
UIImage * imag = [UIImage imageWithData:data];
NSLog(@"%s,%d,%@",name,age,imag);
}
}else{
NSLog(@"預處理失敗");
}
//釋放開辟的內存空間
sqlite3_finalize(stmt);
}
查詢語句相對上面的三種操作來說稍微復雜一些,我們一步步來說,首先是定義查詢語句,然后是對sql語句進行預處理,在預處理的過程中,我們定義了一個 sqlite3_stmt類型的變量 stmt,這里有點像 servlet中的PreparedStatement,定義這個變量的原因是將查詢所得的數據放到這個變量中。然后調用 sqlite3_prepare()這個方法,這個方法接受五個參數,前兩個參數不再贅述,第三個參數指的是sql語句的長度,我們傳-1表示計算機自己計算sql語句的長度,第四個參數就是 stmt的地址,這個函數將查詢到的結果集放入這個地址指向的空間中,最后一個參數指向未執行的SQL語句。然后循環讀取stmt中的數據,通過 sqlite3_step(stmt) 來判斷stmt是否遍歷結束了,然后通過 sqlite3_column_xxxx() 來獲取相應的數據,如果獲取的數據包含圖片,視頻等數據,需要將查詢的結果轉換為二進制, 通過sqlite3_column_bytes() 來計算這個字段(圖片,視頻)字段的字節數。最后使用 sqlite3_finalize()方法來釋放掉這個指針指向的空間。
5. 插入圖片,視頻,音頻數據
-(void)multipleInsert{
UIImage * image = [UIImage imageNamed:@"1"];
NSData * imgeData = UIImagePNGRepresentation(image);
NSLog(@"%@",imgeData);
//占位符 ?
NSString * sql = @"insert into student(name,age,icon) values(?,?,?)";
//預處理
sqlite3_stmt * stmt = NULL;
if(sqlite3_prepare(self.db, sql.UTF8String,-1,&stmt, NULL)==SQLITE_OK){
NSLog(@"預處理成功");
//綁定數據
sqlite3_bind_text(stmt, 1,"Harry",-1, NULL);
sqlite3_bind_int(stmt, 2, -1);
sqlite3_bind_blob(stmt, 3,imgeData.bytes,(int)imgeData.length, NULL);
//將綁定的數據保存到數據庫中
if(sqlite3_step(stmt)==SQLITE_DONE){
NSLog(@"保存成功");
}else{
NSLog(@"保存失敗");
}
}else{
NSLog(@"預處理失敗");
}
//釋放開辟的內存空間
sqlite3_finalize(stmt);
}
這里以插入圖片數據為例,首先我們將圖片轉化為二進制數據,然后定義sql語句,這里使用使用占位符來表示對應字段的值,因為圖片的二進制數據很多,不能直接拼接進去。接著進行預處理,預處理成功之后,通過 sqlite3_bind_xxxx()方法來將不同類型的數據綁定到對應占位符上,然后 調用 sqlite3_step(stmt) 方法來進行具體操作,這個方法返回一個狀態值,表示所進行的操作是否成功。同樣 需要釋放stmt的空間。
智能推薦
IOS學習筆記15——SQLite數據庫
SQLite是MySQL的簡化版,更多的運用與移動設備或小型設備上。SQLite的優點是具有可移植性,它不需要服務器就能運行,同時,它也存在一些缺陷,首先,沒有提供簡單的數據庫創建方式,必須手工創建數據庫,其次,SQLite沒有面向對象接口,必須使用依賴于C語言代碼的API。相對于OC,這套API既不那么優雅,也更難使用。當相比于用文件進行存儲,還是更推薦使用SQLite進行數據存儲。 下面來看下...
iOS基礎-SQLite數據庫--基礎總結
孤舟蓑笠翁,獨釣寒江雪!<海星星> 數據庫管理系統 SQL: SQL 是Structured Query Language(結構化查詢語言)的縮寫,SQL是專為數據庫而建立的操作命令集,是一種功能齊全的數據庫語言. 常見的數據庫: My SQL : MySQL是一個精巧的SQL數據庫管理系統優點:免費,輕量級 Oracle : 甲骨文公司的一款關系數據庫管理系統.系統可移植性好,使用方...
iOS數據庫的使用(三):sqlite多線程
引言 首先,sqlite支持多線程,但是是有條件的支持,也就是同一個連接不能在多線程中使用,不同連接才可以在多線程中使用。這個是最宏觀的sqlite多線程準則。 另外,sqlite的文件鎖是粗顆粒的,也就是以數據庫文件為維度加鎖,涉及到5種鎖狀態。5中鎖狀態可以使用一句話來總結:sqlite在普通情況(非普通情況就是shared-cache+wal模式)下支持并發讀取操作,但是不支持并發寫入操作,...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
猜你喜歡
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...