//導入框架
//創建一個學生對象NSObject,在.h中寫入
@interface Student : NSObject
@property (nonatomic, retain)NSString *name;
@property (nonatomic, retain)NSString *sex;
@property (nonatomic, assign)NSInteger number;
@end
- (void)dealloc
{
[_name release];
[_sex release];
[super dealloc];
}
//創建一個數據庫名字DataBaseHandler的NSObject,在.h文件中寫入下面聲明方法
#import <Foundation/Foundation.h>
#import <sqlite3.h>
//引入學生頭文件
#import "Student.h"
//在數據庫的.h文件中寫下面代碼
@interface DataBaseHandler : NSObject
{
//數據庫指針, 指向本地的數據庫文件
sqlite3 *dbPoint;
}
//創建數據庫的單例的創建方法
//單例的創建方法
//1.類方法
+ (DataBaseHandler *)shareInstance;
//打開數據庫
- (BOOL)openDB;
//關閉數據庫
- (BOOL)closeDB;
//創建表
- (BOOL)createTable;
//添加一條學生數據
- (BOOL)insertStudent:(Student *)stu;
//查詢所有學生
- (NSMutableArray *)selectAll;
//修改(名字)
- (BOOL)updateStudent:(Student *)stu withName:(NSString *)newName;
//刪除
- (BOOL)deleteStudentWithNumber:(int)number;
//在數據庫的.m文件中寫入以下內容
#import "DataBaseHandler.h"
@implementation DataBaseHandler
//數據庫單例實現
+ (DataBaseHandler *)shareInstance
{
//當第一次執行的時候會產生一個空指針
static DataBaseHandler *handler = nil;
//對指針進行判斷, 當第一次執行的時候創建一個對象
if (handler == nil) {
handler = [[DataBaseHandler alloc] init];
}
//無論是創建的和已經存在的, 都在這裏直接return出去
return handler;
}
//打開數據庫
-(BOOL)openDB
{
//1.拼接一個數據庫文件路徑
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//在documents文件夾下拼接一個數據庫文件地址
NSString *dbPath = [docPath stringByAppendingPathComponent:@"suibian.db"];
//參數1:數據庫文件存儲的路徑(UTF8String可以直接將oc語言字符串轉成c語言字符串)
//參數2:數據庫dbPoint指針地址
//返回值:執行sqlite函數的結果(int類型)
int result = sqlite3_open([dbPath UTF8String], &dbPoint);
if (result == SQLITE_OK ) {
NSLog(@"打開成功");
return YES;
}else {
NSLog(@"打開失敗");
return NO;
}
}
//關閉數據庫
-(BOOL)closeDB
{
int result = sqlite3_close(dbPoint);
//利用封裝的方法判斷結果
return [self judgeResult:result text:@"關閉"];
}
//判斷結果的方法
- (BOOL)judgeResult:(int)result text:(NSString *)text
{
if (result == SQLITE_OK) {
NSLog(@"%@成功", text);
return YES;
}
else{
NSLog(@"%@失敗", text);
NSLog(@"錯誤編碼: %d", result);
return NO;
}
}
//創建表的方法實現
- (BOOL)createTable
{
NSString *sql = @"create table student(name text, number int primary key, sex text)";
//執行sql語句的函數
//參數1:數據庫指針
//參數2:sql語句
int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL);
return [self judgeResult:result text:@"創建表"];
}
//添加一條學生數據方法實現
- (BOOL)insertStudent:(Student *)stu
{
//拼接sql語句的時候注意:字符串要以單引號(')標記, 其他的都不標記
NSString *sql = [NSString stringWithFormat:@"insert into student values('%@', %ld, '%@')", stu.name, stu.number, stu.sex];
//執行sql語句, 判斷結果
int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL);
return [self judgeResult:result text:@"添加數據"];
}
//查詢所有學生方法實現
- (NSMutableArray *)selectAll
{
//1.創建一個數據庫的替身, 存儲對數據庫的所有操作
sqlite3_stmt *stmt = nil;
//2.準備sql語句並執行, 將結果保存在stmt中
NSString *sql = @"select * from student";
//參數1:數據庫指針
//參數2:sql語句
//參數3:限制sql語句的長度(如果是-1的話, 就是不限制)
//參數4:替身指針的地址
//作用:讓數據庫執行sql語句, 並把結果保存到stmt中
int result = sqlite3_prepare_v2(dbPoint, [sql UTF8String], -1, &stmt, NULL);
//3.創建一個可變數組, 用於存儲數據
NSMutableArray *stuArr = [NSMutableArray array];
//4.去遍歷所有的數據, 創建相應的學生對象
if (result == SQLITE_OK) {
//當sql執行成功, 遍歷數據
//循環遍歷所有的結果, 每次遍歷到一條數據, 都會返回SQLITE_ROW, 如果沒有數據了, 就不會返回SQLITE_ROW, 跳出循環
while (sqlite3_step(stmt) == SQLITE_ROW) {
//在循環體中去按例取數據
//text類型的數據取法
//參數1:替身
//參數2:第幾列
const unsigned char *nameChar = sqlite3_column_text(stmt, 0);
//將char *字符串類型轉爲NSString字符串
NSString *name = [NSString stringWithUTF8String:(const char *)nameChar];
//取int類型的數據
int number = sqlite3_column_int(stmt, 1);
//取text類型的數據
const unsigned char *sexChar = sqlite3_column_text(stmt, 2);
//將char *字符串類型轉爲NSString字符串
NSString *sex = [NSString stringWithUTF8String:(const char *)sexChar];
Student *stu = [[Student alloc] init];
//拿獲取到得數據 給學生對象賦值
stu.name = name;
stu.number = number;
stu.sex = sex;
//將學生對象添加到數組中
[stuArr addObject:stu];
[stu release];
}
}
//銷燬stmt替身, 把裏面的操作和結果寫入本地sqlite文件
sqlite3_finalize(stmt);
return stuArr;
}
//刪除數據,根據主鍵刪除
- (BOOL)deleteStudentWithNumber:(int)number
{
NSString *sql = [NSString stringWithFormat:@"delete from student where number = '%d'", number];
int result = sqlite3_exec(dbPoint, [sql UTF8String], NULL, NULL, NULL);
return [self judgeResult:result text:@"刪除數據"];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//單例的使用
DataBaseHandler *dataHandler = [DataBaseHandler shareInstance];
//打開數據庫(調用)
[dataHandler openDB];
//創建表成功
[dataHandler createTable];
//添加數據
Student *stu1 = [[Student alloc] init];
stu1.name = @"aaa";
stu1.number = 1;
stu1.sex = @"man";
[dataHandler insertStudent:stu1];
//查詢所有數據
NSMutableArray *arr = [dataHandler selectAll];
NSLog(@"%@", arr);
//刪除
[dataHandler deleteStudentWithNumber:1];
//關閉數據庫
[dataHandler closeDB];
}