iOS经典讲解之利用单例类封装对SQLite数据库增、删、查、改的操作

#import <Foundation/Foundation.h>
#import <sqlite3.h>
#import "LanOuStudent.h"
@interface SQLiteManager : NSObject
// 创建单例类 进行对数据库操作方法的封装
+ (SQLiteManager *)shareManager;
// 如果你要使用数据库的话 要引入一个框架 libsqllite3.0.dylib 框架
// 使用的话需要引入头文件
// 打开数据库 sqlite3 *表示数据库 返回打开的数据库
- (sqlite3 *)openDB;
// 关闭数据库
- (void)closeDB;
// 创建一个表
- (void)createTable;
// 插入数据
// 插入的不是model而是model的值
- (void)insertWith:(LanOuStudent *)student;
// 删除数据
- (void)deleteStudentWithAge:(NSInteger)age;
//更新数据 根据名字修改年龄
- (void)updateStudentName:(NSString *)name setAge:(NSInteger)age;
- (LanOuStudent *)queryStudentWithName:(NSString *)name andAge:(NSInteger)age;
// 查询所有的学生信息
- (NSArray *)queryAllStudents;
@end
</pre><pre name="code" class="objc"><pre name="code" class="objc">
#import "SQLiteManager.h"

@implementation SQLiteManager

// 初始化方法

+ (SQLiteManager *)shareManager
{
    static SQLiteManager *manager = nil;
    if (manager == nil) {
        manager = [[SQLiteManager alloc] init];
    }
    return manager;
}

// 定义一个静态指针 负责连接数据库
// 保证数据库直到程序结束才会释放
static sqlite3 *db = nil;
// 打开数据库 sqlite3 *表示数据库 返回打开的数据库
- (sqlite3 *)openDB
{
    // 判断
    // 如果数据库不为空 就说明数据库存在 直接返回
    if (db != nil) {
        return db;
    }
    //不存在就创建一个
    // 获取文件路径
    NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
    // 拼接路径
    // 数据库的名称 Student.sqlite
    NSString *dbPath = [documentsPath stringByAppendingPathComponent:@"Student.sqlite"];
    // 创建数据库
    // 参数1 文件的路径 需要将OC的字符串 转化一下类型 dbPath.UTF8String
    // 参数2 数据库的地址
    // sqlite3_open()该函数 如果存在数据库就打开没有就创建
    int result = sqlite3_open(dbPath.UTF8String, &db);
    // 查看命令返回结果
    //SQLITE_OK 表示成功
    if (result == SQLITE_OK) {
        NSLog(@"创建成功");
        NSLog(@"%@", dbPath);
    } else {
        NSLog(@"创建失败 或者 打开失败");
    }
   
    return db;
   
}
// 关闭数据库
- (void)closeDB
{
    // 关闭数据库
    int result = sqlite3_close(db);
    if (result == SQLITE_OK) {
        // 如果成功了把数据库置空
        db = nil;
        NSLog(@"关闭成功");
    } else {
        NSLog(@"关闭数据库失败");
    }
}

// 创建一个表
- (void)createTable
{
    // 1、打开数据库
    db = [self openDB];
    // 2、写创建表的SQL语句
    NSString *sql = @"create table if not exists lanOuStudent(number integer primary key not NULL, name text nut NULL, age integer not NULL, gender text not NULL)";
    // 3、执行这个语句
    //char **errmsg 错误信息
    char *error = nil;
    int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, &error);
    // 4、判断是否成功
    if (result == SQLITE_OK) {
        NSLog(@"创建表成功");
    } else {
        NSLog(@"创建失败");
    }
    // 5、关闭数据库
    [self closeDB];
}

// 插入数据
// 插入的不是model而是model的值
- (void)insertWith:(LanOuStudent *)student
{
    //1、打开数据库
   db = [self openDB];
    //2、写SQL语句
    NSString *sql =[NSString stringWithFormat:@"insert into lanOuStudent(name, age, gender, number) values('%@', '%ld', '%@', '%ld')", student.name, student.age, student.gender, student.number];
    //3、执行SQL语句
    int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, nil);
    //4、判断是否成功
    if (result == SQLITE_OK) {
        NSLog(@"插入成功");
    } else {
        NSLog(@"插入失败");
    }
    //5、关闭数据库
    [self closeDB];
}

// 删除数据
- (void)deleteStudentWithAge:(NSInteger)age
{
    //1、打开数据库
    db = [self openDB];
    // 2、写sql语句
    NSString *sql = [NSString stringWithFormat:@"delete from lanOuStudent where age > '%ld'", age];
    // 3、执行语句
    int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, nil);
    //4、判断是否成功
    if (result == SQLITE_OK) {
        NSLog(@"删除成功");
    } else {
        NSLog(@"删除失败");
    }
    // 关闭数据库
    [self closeDB];
}

//更新数据 根据名字修改年龄
- (void)updateStudentName:(NSString *)name setAge:(NSInteger)age
{
    // 1、打开数据库
    db = [self openDB];
    //2、写sql语句
    NSString *sql = [NSString stringWithFormat:@"update lanOuStudent set age = '%ld' where name = '%@'", age, name];
    //3、执行sql语句
    int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, nil);
    //4、判断是否执行成功
    if (result == SQLITE_OK) {
        NSLog(@"更新成功");
    } else {
        NSLog(@"更新失败");
    }
    // 5、关闭数据库
    [self closeDB];
}

// 查询数据
// 根据名字和年龄查询学生
- (LanOuStudent *)queryStudentWithName:(NSString *)name andAge:(NSInteger)age
{
    //1、打开数据库
    db = [self openDB];
    //2、写sql语句
    NSString *sql = [NSString stringWithFormat:@"select * from lanOuStudent where name = '%@' and age = '%ld'", name, age];
    // 3、创建跟随指针 保存sql语句
    sqlite3_stmt *stmt = nil;
    //4、执行语句
    //<#int nByte#>表示sql语句的长度 -1代表无限长
    //<#const char **pzTail#> 截取未执行的部分的语句
    int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
    //5、判断是否执行成功
    if (result == SQLITE_OK) {
        NSLog(@"查询执行成功");
       
        //6、绑定查询信息 绑定查询条件
        // 查询的条件是啥类型的 就选bind_类型
        // 参数2 查询条件的顺序 从1开始
        //<#const char *#>参数三 填查询条件 字段名
        //<#int n#>参数四 长度
        //<#void (*)(void *)#>参数5绑定后执行的函数
        sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL); // 绑定的条件1
        sqlite3_bind_int(stmt, 2, -1); // 绑定条件2
       
    // 7、开始查询
        //sqlite3_step(stmt) == SQLITE_ROW如果这条语句可以被找到 就返回SQLITE_ROW
        while (sqlite3_step(stmt) == SQLITE_ROW) {
           
            //8、获取数据
            // 参数2<#int iCol#>在数据库的表中的列数 列数从0开始 需要打开数据库看一下在第几列
           
            char *name = (char *)sqlite3_column_text(stmt, 1);
            char *gender = (char *)sqlite3_column_text(stmt, 3);
            int age = sqlite3_column_int(stmt, 2);
            int number = sqlite3_column_int(stmt, 0);
           
        // 9、给对象赋值
            LanOuStudent *student = [[LanOuStudent alloc] init];
            //把c语言字符串转会OC字符串
            student.name = [NSString stringWithUTF8String:name];
            student.age = age;
            student.gender = [NSString stringWithUTF8String:gender];
            student.number = number;
           
        // 10、释放跟随指针
            sqlite3_finalize(stmt);
           
            // 关闭数据库
            [self closeDB];
            // 11、返回数据 并释放对象
            return [student autorelease];
        }
       
    } else {
        NSLog(@"查询执行失败");
    }
   
    //12、关闭数据库
    [self closeDB];
    return nil;
}

// 查询所有的学生信息
- (NSArray *)queryAllStudents
{
    //1、打开数据库
    db = [self openDB];
    // 2、写sql语句
    NSString *sql = @"select * from lanOuStudent";
    //3、创建一个跟随指针 来保存sql语句
    sqlite3_stmt *stmt = nil;
    //4、执行语句
    int result = sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL);
    //5、判断是否执行成功
    if (result == SQLITE_OK) {
       
        //6、不用绑定查询 创建一个数组保存查询好的model
        NSMutableArray *array = [NSMutableArray array];
        //7、开始查询
        while (sqlite3_step(stmt) == SQLITE_ROW) {
           
            // 8、获取数据
           
            char *name = (char *)sqlite3_column_text(stmt, 1);
            char *gender = (char *)sqlite3_column_text(stmt, 3);
            int age = sqlite3_column_int(stmt, 2);
            int number = sqlite3_column_int(stmt, 0);
            // 9、创建model并赋值
            LanOuStudent *student = [[LanOuStudent alloc] init];
            student.name = [NSString stringWithUTF8String:name];
            student.gender = [NSString stringWithUTF8String:gender];
            student.age = age;
            student.number = number;
        //10、把model装进数组中
            [array addObject:student];
            //11、释放学生对象
            [student release];
           
        }
       
        //12、释放跟随指针
        sqlite3_finalize(stmt);
        // 13、关闭数据库
        [self closeDB];
       
        // 返回数组
        return array;
       
    } else {
        NSLog(@"--查询失败");
    }
   
    [self closeDB];
    return nil;  
}
@end
 
 

#import <Foundation/Foundation.h>
@interface LanOuStudent : NSObject
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *gender;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, assign) NSInteger number;
@end

对封装的单例类的应用:
// 创建一个manager对象
   SQLiteManager *manage = [SQLiteManager shareManager];
      // 打开数据库
    [manage openDB];
    // 关闭数据库
    [manage closeDB];
    // 创建一个表
    [manage createTable];
    // 插入数据
    LanOuStudent *studnt = [[LanOuStudent alloc] init];
    studnt.name = @"张三";
    studnt.age = 19;
    studnt.gender = @"男";
    studnt.number = 1;
    [manage insertWith:studnt];
    [studnt release];
    LanOuStudent *studnt1 = [[LanOuStudent alloc] init];
    studnt1.name = @"李四";
    studnt1.age = 19;
    studnt1.gender = @"男";
    studnt1.number = 2;
    [manage insertWith:studnt1];
    [studnt1 release];
// 删除数据
    [manage deleteStudentWithAge:19];
    // 更新数据
    [manage updateStudentName:@"张三" setAge:23];
    // 查询数据 返回一条
   LanOuStudent *students = [manage queryStudentWithName:@"李四" andAge:19];
// 查询数据 返回多条数组
  NSArray *arr = [manage queryAllStudents];

你可能感兴趣的:(单例,sqlite,iOS数据库)