SQLite初級操作



#import <Foundation/Foundation.h>

@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;

@end
-----------------------------------------------------------------------


#import "LanOuStudent.h"

@implementation LanOuStudent


- (
void)dealloc{
    [
_name release];
    [
_gender release];
    [
_data release];
    [
super dealloc];
}

@end

#import <Foundation/Foundation.h>
#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;
@end

-----------------------------------------------------------------------

#import "SQLiteManager.h"

@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.UTF8Stringoc的轉化成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, 4length: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];
            [student release];

        }
       
       
NSLog(@"成功");
    }
else
    {
       
NSLog(@"失敗");
    }
   
   
//釋放跟隨對象
   
sqlite3_finalize(stmt);
   
//關閉數據庫
    [
self closeDB];
   
return array;
   
}

@end
-----------------------------------------------------------------------
- (void)viewDidLoad {
    [super viewDidLoad];
   
// 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];
   
}
發佈了32 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章