数据库SQLite

创建一个单例对象,数据库写在单例文件里,有数据库的开闭,数据信息的增,删,改,查.

首先需要引入libsqlite3.0.dylib文件,方法: TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮查找添加即可


需要创建一个类,这里创建了一个学生类,声明属性:姓名,学号,性别,年龄几个属性


单例文件里写法

.h文件里声明

#import <Foundation/Foundation.h>
#import "Student.h"
@interface DataBaseHandle : NSObject

#pragma mark--------创建(获取)单例对象
+(instancetype)sharedInstance;

#pragma mark--------创建或者打开数据库
-(void)openDB;

//****************数据库管理的一些操作(增,删,改,查)***********************//
#pragma mark-------插入一个学生的信息
-(void)insertStudent:(Student *)student;
#pragma mark-------通过学号,删除一个学生的信息
-(void)deleteStudentByNumber:(NSInteger)number;
#pragma mark-------通过学号,修改一个学生的信息
-(void)updateStudent:(Student *)student ByNumber:(NSInteger)number;
#pragma mark-------根据年龄和学号,查询一个学生的信息
-(Student *)queryStudentByNumber:(NSInteger)number Age:(int)age;
#pragma mark-------查询所有学生的信息
-(NSArray *)queryAllStudents;

#pragma mark--------关闭数据库
-(void)closeDB;

@end

.m文件里实现声明的方法

#import "DataBaseHandle.h"
#import <sqlite3.h>
@implementation DataBaseHandle

static DataBaseHandle * dataBaseHandle = nil;
#pragma mark--------创建(获取)单例对象
+(instancetype)sharedInstance
{
    @synchronized(self){
        if (nil == dataBaseHandle) {
            dataBaseHandle = [[DataBaseHandle alloc]init];
            
        }
        return dataBaseHandle;
    }
}

#pragma mark--------创建或者打开数据库
//声明一个指向数据库对象的指针(代指数据库对象)
static sqlite3 *db = nil;
-(void)openDB
{
    //如果数据库存在
    if (nil != db) {
        NSLog(@"当前数据库不为空!");
        return ;
    }
    //如果数据库不存在
    //1.存放数据库的路径和文件
    NSString * path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
    //拼接路径建立存放数据库的文件
    NSString *dbPath = [path stringByAppendingPathComponent:@"students.txt"];
    //    NSString *name = @"xiaoli";
    //    [name writeToFile:dbPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"%@",dbPath);
    //2.根据路径创建并打开数据库
    int result = sqlite3_open(dbPath.UTF8String, &db);
    NSLog(@"%d",result);
    //3.判断数据库是否打开或创建成功
    if (result == SQLITE_OK) {
        //4.准备创建数据库中的表
        NSString * createTabelSQL = @"create table Students(name TEXT,number INTEGER PRIMARY KEY,sex TEXT,age INTEGER)";
        //5.执行SQL语句
        char *error = nil;
        int result1 = sqlite3_exec(db, createTabelSQL.UTF8String, NULL, NULL, &error);
        NSLog(@"%d",result1);
        //6.判断SQL语句是否执行成功
        if (result1 == SQLITE_OK) {
            NSLog(@"数据库表创建或打开成功!");
        }else{
            NSLog(@"数据库表创建或打开失败!");
        }
    }
}

//****************数据库管理的一些操作(增,删,改,查)***********************//
#pragma mark-------插入一个学生的信息
-(void)insertStudent:(Student *)student
{
    //1.打开数据库
    [self openDB];
    //2.准备插入操作的SQL语句(insert into 表名(字段1,字段2,....) values(值1,值2,.....))
    NSString *insertSQL = [NSString stringWithFormat:@"insert into Students(name,number,sex,age) values('%@','%ld','%@','%ld')",student.name,student.number,student.sex,student.age];
    //3.执行SQL语句
    char * error = nil;
    int result = sqlite3_exec(db, insertSQL.UTF8String, NULL, NULL, &error);
    NSLog(@"%d",result);//输出为1,则说明SQL语句有问题
    NSLog(@"%s",error);
    //4.判断SQL语句是否执行成功
    if (result == SQLITE_OK) {
        NSLog(@"数据插入成功!");
    }else{
        NSLog(@"数据插入失败!");
    }
    //5.关闭数据库
    [self closeDB];
}
#pragma mark-------通过学号,修改一个学生的信息
-(void)updateStudent:(Student *)student ByNumber:(NSInteger)number
{
    //1.打开数据库
    [self openDB];
    //2.执行更新操作的SQL语句(update 表名 set 字段='值'....where 字段='值')
    NSString * updateSQL = [NSString stringWithFormat:@"update Students set name='%@',number='%ld',sex='%@',age='%ld' where number='%ld'",student.name,student.number,student.sex,student.age,number];
    //3.执行SQL语句
    char * error = nil;
    int result = sqlite3_exec(db, updateSQL.UTF8String, NULL, NULL, &error);
    NSLog(@"%d,%s",result,error);
    //4.判断SQL语句是否执行成功
    if (result == SQLITE_OK) {
        NSLog(@"更新成功!");
    }else{
        NSLog(@"更新失败!");
    }
    //5.关闭数据库
    [self closeDB];
}
#pragma mark-------通过学号,删除一个学生的信息
-(void)deleteStudentByNumber:(NSInteger)number
{
    //1.打开数据库
    [self openDB];
    //2.执行删除的SQL语句(delete from 表名 where 字段名 = '值'...)
    NSString * deleteSQL = [NSString stringWithFormat:@"delete from Students where number = '%ld'",number];
    //3.执行SQL语句
    char *error = nil;
    int result = sqlite3_exec(db, deleteSQL.UTF8String, NULL, NULL, &error);
    NSLog(@"%d,%s",result,error);
    //4.判断SQL语句是否执行成功
    if (result == SQLITE_OK) {
        NSLog(@"删除成功!");
    }else{
        NSLog(@"删除失败!");
    }
    //关闭数据库
    [self closeDB];
}

#pragma mark-------根据年龄和学号,查询一个学生的信息
-(Student *)queryStudentByNumber:(NSInteger)number Age:(int)age
{
    //1.打开数据库
    [self openDB];
    //2.SQL语句(select *from 表名 where number = ? and age = ?)
    NSString * querySQL = @"select * from Students where number = ? and age = ?";
    //3.创建一个跟随指针(指向存储执行SQL语句结果的空间)
    sqlite3_stmt *stmt = NULL;
    //4.执行SQL语句
    int result = sqlite3_prepare_v2(db, querySQL.UTF8String, -1, &stmt, NULL);
    //5.判断SQL语句是否执行成功
    if (result == SQLITE_OK) {
        //6.值的绑定(绑定'?'值),注意第二个参数是指SQL语句第几个'?'下标,是从1开始的.
        sqlite3_bind_int(stmt, 1, (int)number);
        sqlite3_bind_int(stmt, 2, age);
        Student *stu = [[Student alloc] init];
        if (sqlite3_step(stmt) == SQLITE_ROW) {
            //7.通过stmt获取字段中的值
            //①.获取数据库表中的第0列(name)字段的值
            stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 0)];
            //②.获取数据库表中的第1列(number)字段的值
            stu.number = sqlite3_column_int(stmt, 1);
            //③.获取数据库表中的第2列(sex)字段的值
            stu.sex = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
            //④.获取数据库表中的第3列(age)字段的值
            stu.age = sqlite3_column_int(stmt, 3);
        }
        //8.结束stmt跟随
        sqlite3_finalize(stmt);
        //9.关闭数据库
        [self closeDB];
        //10.返回查询到的数据
        NSLog(@"查询成功!");
        return stu;
    }else{
        NSLog(@"查询失败!");
        //11.关闭数据库
        [self closeDB];
        return nil;
    }
}
#pragma mark-------查询所有学生的信息
-(NSArray *)queryAllStudents
{
    //1.打开数据库
    [self openDB];
    //2.查询操作的SQL语句(select * from 表名);
    NSString * queryAllSQL = @"select * from Students";
    //3.创建跟随指针
    sqlite3_stmt *stmt =NULL;
    //4.执行SQL语句
    int result = sqlite3_prepare_v2(db, queryAllSQL.UTF8String, -1, &stmt, NULL);
    //5.判断SQL语句是否执行成功
    if (result == SQLITE_OK) {
        //6.创建一个数据,用来存放每一个学生对象
        NSMutableArray *studentArray = [NSMutableArray array];
        //7.使用跟随指针获取每一个学生的信息.
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            //8.获取数据库中,每一个字段值,并把每个字段值封装到Student对象中
            Student *stu = [[Student alloc]init];
            //①.获取数据库表中,第0列(name)字段中的值
            stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 0)];
            //②.获取数据库列表中,第1列字段(number)中的值
            stu.number = sqlite3_column_int(stmt, 1);
            //③.获取数据库列表中,第1列字段(sex)中的值
            stu.sex = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
            //③.获取数据库列表中,第1列字段(age)中的值
            stu.age = sqlite3_column_int(stmt, 3);
            //9.将每一个封装好的student对象存入数据
            [studentArray addObject:stu];
        }
        //10.结束stmt跟随
        sqlite3_finalize(stmt);
        //11.关闭数据库
        [self closeDB];
        //12.返回数组
        NSLog(@"查询所有成员成功!");
        return studentArray;
    }else{
        //13.如果SQL语句执行失败
        [self closeDB];
        NSLog(@"查询所有成员失败!");
        return nil;
    }
    
}


#pragma mark--------关闭数据库
-(void)closeDB
{
    //1.执行关闭数据库的方法
    int result = sqlite3_close(db);
    //2.判断是否关闭成功
    if (result == SQLITE_OK) {
        NSLog(@"关闭成功!");
        db = nil;
    }else{
        NSLog(@"关闭失败!");
    }
}

具体用法这里简单举几个例子:

在需要使用的地方使用:

DataBaseHandle * handle = [DataBaseHandle sharedInstance];
    //打开或创建
    [handle openDB];
    //关闭
    [handle closeDB];
    
    //创建一个学生对象
    Student * stu = [[Student alloc] init];
    stu.name = @"张三";
    stu.number = 1;
    stu.sex = @"男";
    stu.age = 20;
    //创建一个学生对象
    Student * stu2 = [[Student alloc] init];
    stu2.name = @"王五";
    stu2.number = 2;
    stu2.sex = @"男";
    stu2.age = 26;
    //插入一个学生的信息
    [handle insertStudent:stu];
    [handle insertStudent:stu2];
    //更新number为1的学生的姓名=李四,age=21,sex=女
    stu.name = @"李四";
    stu.age = 21;
    stu.sex = @"女";
    [handle updateStudent:stu ByNumber:1];
    //根据学号number删除一个学生的信息
    [handle deleteStudentByNumber:1];
    
    //查询学生
    Student *stu1 = [handle queryStudentByNumber:1 Age:20];
    NSLog(@"stu1 = %@",stu1);
    
    //查询数据库中所有学生的信息
    NSArray *array = [handle queryAllStudents];
    NSLog(@"array = %@",array);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值