#import <Foundation/Foundation.h>
#import <sqlite3.h>//2.引入sqlite3頭文件
//3.定義靜態的數據庫指針
.
static sqlite3 *dbPoint = nil;
@interface SqlDB : NSObject
+(sqlite3 *)openDB;
@end
sqlite 的方法
sqlite3 *db, 數據庫句柄,跟文件句柄FILE很類似
sqlite3_stmt *stmt, 這個相當於ODBC的Command對象,用於保存編譯好的SQL語句
sqlite3_open(), 打開數據庫,沒有數據庫時創建。
sqlite3_exec(), 執行非查詢的sql語句
Sqlite3_step(), 在調用sqlite3_prepare後,使用這個函數在記錄集中移動。
Sqlite3_close(), 關閉數據庫文件
還有一系列的函數,用於從記錄集字段中獲取數據,如
sqlite3_column_text(), 取text類型的數據。
sqlite3_column_blob(),取blob類型的數據
sqlite3_column_int(), 取int類型的數據
下面給大家演示下我自己寫的增刪改查:
打開數據庫:
#import "SqlDB.h"
@implementation SqlDB
+(sqlite3 *)openDB{
//如果數據庫存在,就直接返回,不用在走下面的代碼了。
if (dbPoint) {
return dbPoint;
}
//Document路徑
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
path = [NSString stringWithFormat:@"%@/db",path];
NSLog(@"\npath ==== %@",path);
//判斷數據庫是否存在,若存在就不拷貝,反之拷貝。
if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
//獲得將要拷貝的文件路徑,bundle路徑
NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"DataBase" ofType:@"sqlite"];
NSLog(@"\nsourcePath === %@",sourcePath);
NSError *error = nil;
[[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:path error:&error];
if (error) {
NSLog(@"error ==== %@",error);
}
}
//創建數據庫的指針對象
sqlite3_open([path UTF8String], &dbPoint);
return dbPoint;
}
@end
我爲增刪改查寫了類
<pre name="code" class="objc">#import <Foundation/Foundation.h>
@class SqlModel;
@interface NovelDataBase : NSObject
+(NSArray *)selectAllNovel;
+ (SqlModel *)selectWithId:(NSInteger)num;
+ (void)insertWithModel:(SqlModel *)model;
+ (void)updateWithModel:(NSInteger)num bookName:(NSString *)name;
+ (void)deleteWithModel:(NSInteger)num;
@end
查詢數據庫某一張表所有信息:
<pre name="code" class="objc">+(NSArray *)selectAllNovel{
NSMutableArray *results = [NSMutableArray array];
sqlite3 *db = [SqlDB openDB];//獲得數據庫指針
sqlite3_stmt *stmt = nil;//創建一個數據庫的替身
//數據庫查詢語句
NSString *sqlStr = [NSString stringWithFormat:@"select nv_id,nv_author,nv_bookName,nv_score from Novel"];
//替身放我數據庫得到的結果
//檢驗你的sql語句是否正確
//通過sql語句進行查詢,並且將查詢結果賦值給替身
int result = sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &stmt, NULL);
//判斷查詢結果是否正確,如果result的值是SQLITE_OK,則表明準備好statement,接下來執行查詢:
if (result == SQLITE_OK) {
//while循環把數據一條一條取出來
while (sqlite3_step(stmt) == SQLITE_ROW) {
//區第一列的數據,第一個參數是替身,第二個參數是對應sql語句列
int nid = sqlite3_column_int(stmt, 0);
const unsigned char *nauthor = sqlite3_column_text(stmt, 1);
const unsigned char *nbooName = sqlite3_column_text(stmt, 2);
float nscore = sqlite3_column_double(stmt, 3);
NSString *bookName = [NSString stringWithUTF8String:(const char *)nbooName];
NSString *author = [NSString stringWithUTF8String:(const char *)nauthor];
SqlModel *model = [SqlModel sqlModelNId:nid NBookName:bookName NAuthor:author NScore:nscore];
[results addObject:model];
}
}
//在返回數組執勤我們要把替身幹掉。
sqlite3_finalize(stmt);
return results;
}
根據id查找所有信息:
<pre name="code" class="objc">+ (SqlModel *)selectWithId:(NSInteger)num{
//NSMutableArray *results = [NSMutableArray array];
sqlite3 *db = [SqlDB openDB];
sqlite3_stmt *stmt = nil;
NSString *sqlStr = [NSString stringWithFormat:@"select nv_id,nv_author,nv_bookName,nv_score from Novel where nv_id=%d",num];
int result = sqlite3_prepare(db, [sqlStr UTF8String], -1, &stmt, NULL);
if (result == SQLITE_OK) {
if (sqlite3_step(stmt) == SQLITE_ROW) {
NSInteger nid = sqlite3_column_int(stmt, 0);
const unsigned char *nauthor = sqlite3_column_text(stmt, 1);
const unsigned char *nbooName = sqlite3_column_text(stmt, 2);
float nscore = sqlite3_column_double(stmt, 3);
NSString *bookName = [NSString stringWithUTF8String:(const char *)nbooName];
NSString *author = [NSString stringWithUTF8String:(const char *)nauthor];
SqlModel *model = [SqlModel sqlModelNId:nid NBookName:bookName NAuthor:author NScore:nscore];
//[results addObject:model];
return model;
}
}
sqlite3_finalize(stmt);
return nil;
}
插入:
#pragma mark insert
+ (void)insertWithModel:(SqlModel *)model{
sqlite3 *db = [SqlDB openDB];
//sqlite3_stmt *stmt = nil;
NSString *sqlStr = [NSString stringWithFormat:@"insert into Novel (nv_id,nv_author,nv_bookName,nv_score)values(%d,'%@','%@',%f)",model.nId,model.nAuthor,model.nBookName,model.nScore];
int result = sqlite3_exec(db, [sqlStr UTF8String], NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"Success");
}
}
修改或更新:
<pre name="code" class="objc">#pragma mark update
+ (void)updateWithModel:(NSInteger)num bookName:(NSString *)name{
sqlite3 *db = [SqlDB openDB];
//sqlite3_stmt *stmt = nil;
NSString *sqlStr = [NSString stringWithFormat:@"update Novel set nv_bookName='%@' where nv_id = %d",name,num];
int result = sqlite3_exec(db, [sqlStr UTF8String], NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"Update Success");
}
}
刪除:
<pre name="code" class="objc">#pragma mark delete
+ (void)deleteWithModel:(NSInteger)num {
sqlite3 *db = [SqlDB openDB];
//sqlite3_stmt *stmt = nil;
NSString *sqlStr = [NSString stringWithFormat:@"delete from Novel where nv_id=%d",num];
int result = sqlite3_exec(db, [sqlStr UTF8String], NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"Delete Success");
}
}