@interface LanOuStudent : NSObject
//名字
@property (nonatomic,retain)NSString *name;
//年齡
@property (nonatomic,assign)NSInteger age;
//性別
@property (nonatomic,retain)NSString *gender;
//學號
@property (nonatomic,assign)NSInteger number;
//圖片的data
@property (nonatomic,retain)NSData *data;
@implementation LanOuStudent
- (void)dealloc{
[_name release];
[_gender release];
[_data release];
[super dealloc];
}
#import <sqlite3.h>
#import "LanOuStudent.h"
@interface SQLiteManager : NSObject
//使用SQLite數據庫步驟
//1.引入libsqlite3.0 框架
//2.在數據庫操作類中 引入<sqlite3.h>頭文件
//注:咱們使用的方法 都在這個類中
//單例的初始化方法
+ (SQLiteManager *)shareManager;
- (void)insertTableWithStudent:(LanOuStudent *)student;
//刪除數據(根據一個條件刪除)
- (void)deleteWithAge:(NSInteger )age;
//更新數據(根據一個條件來更新)
- (void)updateAge:(NSInteger)age byName:(NSString *)name;
//查詢數據 (根據條件查詢)
- (LanOuStudent *)selectStudentWithName:(NSString *)name age:(NSInteger)age;
// 查詢所有(返回一個數組)
- (NSArray *)selectAllStudents;
@implementation SQLiteManager
//單例的初始化方法
+ (SQLiteManager *)shareManager
{
// 靜態區指針
static SQLiteManager *manager = nil;
if (manager == nil) {
manager = [[SQLiteManager alloc] init];
//調用創建表的方法
[manager createTable];
}
return manager;
}
//需要在靜態區定義一個指針指向數據庫 (讓這個指針指向對象 從程序開始到結束 一直存在 程序結束後 被系統自動釋放)
static sqlite3 *db = nil;
//打開數據庫
- (sqlite3 *)openDB
{
// 判斷數據庫是否存在 如果存在 直接返回
if (db != nil) {
return db;
}else
{
// 不存在 則創建一個並打開
//獲取當前documents的路徑
NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//拼接數據庫文件路徑(拼接的數據庫文件的名字)
NSString *dbPath = [documents stringByAppendingPathComponent:@"Student.sqlite"];
NSLog(@"%@",dbPath);
//創建或者打開數據庫
//參數1 文件的路徑(需要把oc的字符串 轉化成c語言的) dbPath.UTF8String把oc的轉化成c語言
//參數2 數據庫的地址
//接收一下返回值 判斷是否打開成功
int result = sqlite3_open(dbPath.UTF8String, &db);
//SQLITE_OK 可以查表得到錯誤
if (result == SQLITE_OK) {
NSLog(@"打開成功");
}else
{
NSLog(@"打開失敗");
}
return db;
}
}
//關閉數據庫
- (void)closeDB
{
int result = sqlite3_close(db);
//判斷是否關閉成功
if (result == SQLITE_OK) {
NSLog(@"關閉成功");
//把數據庫的指針 重置爲空
db = nil;
}else
{
NSLog(@"關閉失敗");
}
}
//創建一張表
- (void)createTable
{
//注意:一定在操作時 先打開數據庫
//操作完畢 關閉數據庫
//打開數據庫
db = [self openDB];
//1.寫SQL語句
NSString *sql = @"create table IF NOT EXISTS lanOuStudent(number integer primary key not null,name text not null,gender text not null,age integer not null,data blob not null)";
//2.執行sql語句
//準備與執行語句的操作
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"建表成功");
}else
{
NSLog(@"建表失敗");
}
//關閉數據庫
[self closeDB];
}
// 插入數據
- (void)insertTableWithStudent:(LanOuStudent *)student
{
//打開數據庫
db = [self openDB];
//寫SQL語句
NSString *sql = @"insert into LanOuStudent (number,name,gender,age,data) values (?,?,?,?,?)";
//創建一個跟隨指針(指令集)
sqlite3_stmt *stmt = nil;
//執行SQL語句
//預執行函數 需要用跟隨指針 綁定問號 然後一步一步執行(可以判斷SQL是否正確)
int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK) {
// 綁定問號(根據SQL語句 來決定綁定的順序)
// 注意:綁定的順序 從1開始
// 參數2 綁定的順序
// 參數3 要插入的值
sqlite3_bind_int(stmt, 1, (int)student.number);
sqlite3_bind_text(stmt, 2, student.name.UTF8String, -1, NULL);
sqlite3_bind_text(stmt, 3, student.gender.UTF8String, -1, NULL);
sqlite3_bind_int(stmt, 4, (int)student.age);
// 綁定二進制數據
// [student.data bytes] 相當於獲取到data數據的內容
// (int)[student.data length] 相當於獲取到data數據的長度
sqlite3_bind_blob(stmt, 5, [student.data bytes], (int)[student.data length], NULL);
//執行綁定的語句
sqlite3_step(stmt);
NSLog(@"插入成功");
}else
{
NSLog(@"插入失敗");
}
//不管插入是否成功 都要釋放跟隨指針
sqlite3_finalize(stmt);
//關閉數據庫
[self closeDB];
}
/*
//如果有data數據進行插入的話
//sqlite3_exec 這個函數 會把data數據轉化成字符串存入數據庫
//如果插入的數據沒有data數據的話 直接用sqlite3_exec 函數 插入數據就行 不用綁定了
NSString *sql = @"insert into LanOuStudent (number,name,gender,age) values ('%ld','%@','%@','%ld')"
- (void)text:(LanOuStudent *)student
{
NSString *sql = @"insert into LanOuStudent (number,name,gender,age) values ('%ld','%@','%@','%ld')";
NSString *sqlNew = [NSString stringWithFormat:@"insert into LanOuStudent (number,name,gender,age) values ('%ld','%@','%@','%ld')",student.number,student.name,student.gender,student.age];
}
*/
//刪除數據(根據一個條件刪除)
- (void)deleteWithAge:(NSInteger )age
{
#pragma mark -- 不綁定刪除 需要拼接SQL語句
//打開數據庫
// [self openDB];
// //寫SQL語句
// NSString *sql = [NSString stringWithFormat:@"delete from lanOuStudent where age > '%ld'",age];
// //SQL語句
// int result = sqlite3_exec(db, sql.UTF8String , NULL, NULL, NULL);
// //判斷一下執行結果
// if (result == SQLITE_OK) {
// NSLog(@"刪除成功");
// }else
// {
// NSLog(@"刪除失敗");
// }
// //關閉數據庫
// [self closeDB];
#pragma mark -- 通過綁定刪除方法
//打開數據庫
[self openDB];
//寫SQL語句
NSString *sql = @"delete from lanouStudent where age > ?";
//創建跟隨指針
sqlite3_stmt *stmt = nil;
//預執行語句
int result = sqlite3_prepare_v2(db, sql.UTF8String , -1, &stmt, NULL);
if (result == SQLITE_OK) {
//綁定問好
sqlite3_bind_int(stmt, 1, (int)age);
//執行跟隨執行 綁定的語句
sqlite3_step(stmt);
NSLog(@"刪除成功");
}else
{
NSLog(@"刪除失敗");
}
//不管成功與否 都要釋放跟隨指針
sqlite3_finalize(stmt);
//關閉數據庫
[self closeDB];
}
//更新數據(根據一個條件來更新)
//update lanOuStudent set age = '%ld' where name = '%@'
- (void)updateAge:(NSInteger)age byName:(NSString *)name
{
//打開數據庫
[self openDB];
//寫SQL語句
NSString *sql = [NSString stringWithFormat:@"update lanouStudent set age = '%ld' where name = '%@'",age,name];
//執行語句
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"更新成功");
}else
{
NSLog(@"更新失敗");
}
//關閉數據庫
[self closeDB];
}
//查詢數據 (根據條件查詢)
//select name,imageData from lanOuStudent where name = ? and age = ?
- (LanOuStudent *)selectStudentWithName:(NSString *)name age:(NSInteger)age
{
//打開數據庫
[self openDB];
//寫SQL語句
NSString *sql = @"select * from lanouStudent where name = ? and age = ?";
//創建跟隨指針
sqlite3_stmt *stmt = nil;
//創建一個對象
LanOuStudent *student = [[LanOuStudent alloc] init];
//預執行語句
int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK) {
//綁定問號
sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);
sqlite3_bind_int(stmt, 2, (int)age);
// 查詢時 如果下一行準備好了 返回 SQLITE_ROW 這時可以繼續查詢
while (sqlite3_step(stmt) == SQLITE_ROW) {
//讀取數據
// <#int iCol#> 列數
//如果你查詢所有的字段的話 那麼這個列數 就根據你創建表的順序一樣
// 注意: 從0開始
//如果你查詢的是特定字段 那麼這個列數 就要根據你的SQL語句來寫
//也是從0開
int number = sqlite3_column_int(stmt, 0);
char *name = (char *)sqlite3_column_text(stmt, 1);
char *gender = (char *)sqlite3_column_text(stmt, 2);
int age = sqlite3_column_int(stmt, 3);
//讀取二進制數據
NSData *data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 4) length:sqlite3_column_bytes(stmt, 4)];
//賦值model
//[NSString stringWithUTF8String:<#(nonnull const char *)#>]; 把c語言字符串轉化成oc字符串
student.name = [NSString stringWithUTF8String:name];
student.gender = [NSString stringWithUTF8String:gender];
student.number = number;
student.age = age;
student.data = data;
}
NSLog(@"成功");
}else
{
NSLog(@"失敗");
}
//釋放跟隨指針
sqlite3_finalize(stmt);
//關閉數據庫
[self closeDB];
//自動釋放 對象
return [student autorelease];
}
// 查詢所有(返回一個數組)
// select * from lanOuStudent
- (NSArray *)selectAllStudents
{
//打開數據庫
[self openDB];
//寫SQL語句
NSString *sql = @"select * from lanouStudent";
//創建一個可變數組備用
NSMutableArray *array = [NSMutableArray array];
//創建跟隨指針
sqlite3_stmt *stmt = nil;
//預執行語句
int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK) {
while (sqlite3_step(stmt) == SQLITE_ROW) {
LanOuStudent *student = [[LanOuStudent alloc] init];
//讀取數據
int number = sqlite3_column_int(stmt, 0);
char *name = (char *)sqlite3_column_text(stmt, 1);
char *gender = (char *)sqlite3_column_text(stmt, 2);
int age = sqlite3_column_int(stmt, 3);
NSData *data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 4) length:sqlite3_column_bytes(stmt, 4)];
//賦值model
student.number = number;
student.name = [NSString stringWithUTF8String:name];
student.gender = [NSString stringWithUTF8String:gender];
student.age = age;
student.data = data;
//添加到數組
[array addObject:student];
NSLog(@"成功");
}else
{
NSLog(@"失敗");
}
//釋放跟隨對象
sqlite3_finalize(stmt);
//關閉數據庫
[self closeDB];
return array;
}
// Do any additional setup after loading the view.
SQLiteManager *manager = [SQLiteManager shareManager];
//插入數據
LanOuStudent *student = [[LanOuStudent alloc] init];
student.name = @"王龍";
student.gender = @"男";
student.age = 11;
student.number = 1;
student.data = UIImagePNGRepresentation([UIImage imageNamed:@"21.jpg"]);
//插入數據
[manager insertTableWithStudent:student];
//刪除數據
//[manager deleteWithAge:15];
//更新數據
[manager updateAge:18 byName:@"王龍"];
//按要求查詢
//LanOuStudent *stu = [manager selectStudentWithName:@"王龍" age:18];
//查詢你所有
NSArray *array = [manager selectAllStudents];