iOS 資料庫SQLite
SQLite介紹SQLite是一款輕型的嵌入式資料庫,安卓和iOS開發使用的都是SQLite資料庫。它的特點:它佔用資源非常的低,在嵌入式裝置中,可能只需要幾百K的記憶體就夠了。它的處理速度比MySQL、PostgreSQL這兩款著名的資料庫都還快。它是C語言架構的,跨平台性強。
要在iOS中使用SQLite3,需要在Xcode匯入libsqlite3的庫
下面是結合SQL陳述式完成資料庫操作,使用到的是上面定義的方法:
建立表:create table 表名稱(欄位1,欄位2,……,欄位n,[表級約束])[TYPE=表類型];插入記錄:insert into 表名(欄位1,……,欄位n) values (值1,……,值n);刪除記錄:delete from 表名 where 條件運算式;修改記錄:update 表名 set 欄位名1=值1,……,欄位名n=值n where 條件運算式;查看記錄:select 欄位1,……,欄位n from 表名 where 條件運算式;
1,開啟資料庫
使用的C語言函數如下:
/* 開啟資料庫 */int sqlite3_open( const char *filename, /* 資料庫路徑(UTF-8) */ sqlite3 **pDb /* 返回的資料庫控制代碼 */);
2,查詢資料庫
使用的C語言函數:
/* 執行有返回結果的SQL語句 */int sqlite3_prepare_v2( sqlite3 *db, /* 資料庫控制代碼 */ const char *zSql, /* SQL語句(UTF-8) */ int nByte, /* SQL語句最大長度,-1表示SQL支援的最大長度 */ sqlite3_stmt **ppStmt, /* 返回的查詢結果 */ const char **pzTail /* 返回的失敗資訊*/);
3,插入資料
使用的C語言函數:
/* 執行有返回結果的SQL語句 */int sqlite3_prepare( sqlite3 *db, /* 資料庫控制代碼 */ const char *zSql, /* SQL語句(UTF-8) */ int nByte, /* SQL語句最大長度,-1表示SQL支援的最大長度 */ sqlite3_stmt **ppStmt, /* 返回的查詢結果 */ const char **pzTail /* 返回的失敗資訊*/);
4.刪除資料庫
使用的C語言函數:
/* 執行沒有返回的SQL語句 */int sqlite3_exec( sqlite3 *db, /* 資料庫控制代碼 */ const char *sql, /* SQL語句(UTF-8) */ int (*callback)(void*,int,char**,char**), /* 回調的C函數指標 */ void *arg, /* 回呼函數的第一個參數 */ char **errmsg /* 返回的錯誤資訊 */);
5, 關閉資料庫
使用的C語言函數:
/* 關閉資料庫 */int sqlite3_close(sqlite3 *db);
下面來個小例子:
這裡請求資料是微博的使用者名稱和id 定義一個模型
DataModel.h
#import @interface DataModel : NSObject@property (nonatomic, copy) NSString *screen_name;@property (nonatomic, copy) NSString *avatar_hd;- (instancetype)initWithDictionary:(NSArray *)dictionary;@end
DataModel.m
#import "DataModel.h"@implementation DataModel- (instancetype)initWithDictionary:(NSDictionary *)dictionary { if (self = [super init]) { // 當有很多屬性 一個一個的寫 太麻煩了, // 一句話搞定 [self setValuesForKeysWithDictionary:dictionary]; } return self;}// 一般情況下 請求資料回來,裡麵包含很多資料,要一個一個的寫,寫錯了一個就報錯// 請求資料回來有很多,但你又用不上,就寫上這個方法- (void)setValue:(id)value forUndefinedKey:(NSString *)key { // 列印的是 你沒用到的key NSLog(@"%@",key);}@end
在定義一個處理資料庫的類 DataBase
DataBase.h
#import /** 匯入DataModel*/#import "DataModel.h"@interface DataBase : NSObject/** 開啟資料庫*/+ (void)openDB;/** 查*/+ (NSArray *)find;/** 插*/+ (BOOL)insertModel:(DataModel *)dataModel;+ /** 刪除*/+ (BOOL)deleteModel:(DataModel *)dataModel;@end
DataBase.m
#import "DataBase.h"// 匯入#import @implementation DataBase// 建立一個資料庫物件static sqlite3 *db;#pragma mark - 開啟資料庫+ (void)openDB { // 將匯入的資料庫移動到 Documents 檔案夾下 // 首先要在外面建立一個資料庫 把資料庫匯入工程裡面 "這一步 一定要做" // 拿到資料庫的路徑 // 這裡 WeiBo 是建立資料庫的名稱 (千萬不要搞錯) NSString *originPath = [[NSBundle mainBundle] pathForResource:@"WeiBo" ofType:@"sqlite"]; // Documents 檔案夾下的路徑 然後進行拼接 NSString *targetPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"collection.sqlite"]; NSFileManager *manager = [NSFileManager defaultManager]; if (![manager fileExistsAtPath:targetPath]) { [manager moveItemAtPath:originPath toPath:targetPath error:nil]; } char *filename = (char *)[targetPath UTF8String]; // 開啟資料庫 int result = sqlite3_open(filename, &db); if (result == SQLITE_OK) { NSLog(@"資料庫開啟成功"); } else { NSLog(@"資料庫開啟失敗"); }}#pragma mark - 查+ (NSArray *)find { NSMutableArray *mArray = [NSMutableArray array]; // 開啟資料庫 [self openDB]; // 聲明一個陳述 sqlite3_stmt *stmt = nil; // 查表 // 這裡 weiBo 是建立資料庫下的表名稱 (千萬不要搞錯) const char *sql = "select *from weiBo"; // 將sql 文本轉成一個 語句對象 int result = sqlite3_prepare_v2(db, sql, -1, &stmt, nil); if (result == SQLITE_OK) { NSLog(@"準備查詢成功"); while (sqlite3_step(stmt) == SQLITE_ROW) { // 提取資料 const char *screen_name = (const char *)sqlite3_column_text(stmt, 0); const char *avatar_hd = (const char *)sqlite3_column_text(stmt, 1); DataModel *dataModel = [[DataModel alloc] init]; dataModel.screen_name = [NSString stringWithCString:screen_name encoding:4]; dataModel.avatar_hd = [NSString stringWithCString:avatar_hd encoding:4]; //"NSNumber 類型 " [NSNumber numberWithInteger:[[NSString stringWithCString:deal_id encoding:4] integerValue]]; [mArray addObject:dataModel]; } } return mArray;}#pragma mark - 插+ (BOOL)insertModel:(DataModel *)dataModel { // 開啟資料庫 [self openDB]; sqlite3_stmt *stmt = nil; // 這裡 weiBo 是建立資料庫下的表名稱 (千萬不要搞錯) const char *sql = "insert into weiBo(screen_name, avatar_hd) values(?, ?)"; // 將 sql 文本轉換成一個 語句對象 int result = sqlite3_prepare(db, sql, -1, &stmt, nil); if (result == SQLITE_OK) { //將要插入的資料插入到資料庫 sqlite3_bind_text(stmt, 1, [dataModel.screen_name UTF8String], -1, nil); sqlite3_bind_text(stmt, 2, [dataModel.avatar_hd UTF8String], -1, nil); //[NSNumber] sqlite3_bind_text(stmt, 1, [[NSString stringWithFormat:@"%@",model.comment_num] UTF8String], -1, nil); if (sqlite3_step(stmt) == SQLITE_DONE) { flag = YES; } } return flag;}#pragma mark - 刪 + (BOOL)deleteModel:(DataModel *)dataModel { BOOL flag = NO; // 開啟資料庫 [self openDB]; // 這裡 weiBo 是建立資料庫下的表名稱 (千萬不要搞錯) NSString *sql = [NSString stringWithFormat:@"delete from weiBo where screen_name = %@", dataModel.screen_name]; int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, nil); if (result == SQLITE_OK) { NSLog(@"刪除成功"); flag = YES; } else { NSLog(@"刪除失敗"); } return flag;}@end
建立資料庫
(用Firefox瀏覽器)
1,SQLite Manager下載
2,建立資料庫有幾種方法(這理就不一一介紹了) 我的是Firefox瀏覽器裡面的資料庫
開啟瀏覽器 –> 工具 –> 找到SQLite Manager
3,點擊:SQLite Manager 頁面是這樣
4,建立資料庫
5,案頭 把它拖到工程中
6,建立資料庫的表(表裡面建立欄位 可以理解為屬性)
7,表建立成功後