iOS中实现SQLite的增、删、改、查

SQLite :轻量级数据库,与其他数据库管理系统不同,其安装和运行非常简单,我们以创建Student类为例 通过SQLite数据库实现对Student实例变量的增,删,改,查等操作

Student类

#import <Foundation/Foundation.h>
@interface Student : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)NSString *gender;
@property(nonatomic,assign)int age;
@property(nonatomic,assign)int Stu_ID;
-(instancetype)initWithName:(NSString *)name
                        age:(int)age
                     gender:(NSString *)gender
                     stu_ID:(int)stu_ID;
@end

#import "Student.h"
@implementation Student
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
}
//重写description
-(NSString *)description{
    return [NSString stringWithFormat:@"%@,%@,%d,%d",_name,_gender,_age,_Stu_ID];
}
//初始化
-(instancetype)initWithName:(NSString *)name age:(int)age gender:(NSString *)gender stu_ID:(int)stu_ID{
    if (self = [super init]) {
        _name = name;
        _age = age;
        _gender = gender;
        _Stu_ID = stu_ID;
    }return self;
}
@end

SQLite创建Database 声明和实现基本的方法 代码如下:

#import <Foundation/Foundation.h>
@class Student;

@interface Database : NSObject

//创建单例
+(instancetype)sharedDataBase;
-(void)openDB;
-(void)closeDB;
//添加
-(void)insertStudent:(Student *)stu;
//删除
-(void)deleteStudent:(int )stu_ID;
//修改
-(void)updataStudentWithGender:(NSString *)gender andStu_ID:(int)stu_ID;
//选择全部
-(NSArray *)selectAll;
//选择学生单个
-(Student *)selectStudentWithStu_ID:(int)stu_ID;
@end

Database.m 以下对数据操作的各个方法做了较为详细的介绍

#import "Database.h"
#import <sqlite3.h>
#import "Student.h"
@implementation Database
static Database *dataBase = nil;
+(instancetype)sharedDataBase{
    //加锁
    @synchronized(self) {
        if (nil == dataBase) {
            dataBase = [[Database alloc]init];
            [dataBase openDB];//打开数据库
        }
    }
    return dataBase;
}
#pragma mark--------//创建数据库对象
static sqlite3 *db = nil;
-(void)openDB{
    //如果数据库已经打开 则不需要执行后面的操作 直接return
    if (db!= nil) {
        return;
    }
    //创建保存数据库的路径
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
    documentPath = [documentPath stringByAppendingString:@"/LOClass.sqlite"];
    NSLog(@"%@",documentPath);
    //如果改数据库存在 则直接打开 否则 自动创建一个数据库
    int result = sqlite3_open([documentPath UTF8String], &db);
    if (result == SQLITE_OK) {
//        NSLog(@"数据库成功打开");
        //建表
        NSString *sql = @"CREATE TABLE Class43 (Stu_ID INTEGER PRIMARY KEY NOT NULL UNIQUE, name TEXT NOT NULL, gender TEXT NOT NULL DEFAULT M, age INTEGER NOT NULL);";
        //执行语句
        sqlite3_exec(db, [sql UTF8String], NULL, NULL, NULL);
    }else{
        NSLog(@"%d",result);
    }
}
//关闭数据库
-(void)closeDB{
    int result = sqlite3_close(db);
    if (result == SQLITE_OK) {
        NSLog(@"数据库关闭成功");
        //当关闭数据库的时候将数据库置为nil 是因为打开数据库的时候需要使用nil做判断 循环的理论
        db = nil;  //数据库是在静态去
    }else{
        NSLog(@"数据库关闭失败%d",result);
    }
}
//插入单个student对象
-(void)insertStudent:(Student *)stu{
    // 1 打开数据库
    [self openDB];
    // 2 创建跟随指针(也叫伴随指针)
    sqlite3_stmt *stmt = nil;
    // 3 准备SQL语句  问好就是占位  ?????
    NSString *sqlString = @"insert into Class43 (Stu_ID, name, gender, age) values (?, ?, ?, ?)";
    // 4 验证SQL语句的正确性
    int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
    // 5 绑定
    if (result == SQLITE_OK) {
        NSLog(@"数据库添加成功");
        //一旦SQL语句没有问题就要开始绑定数据替换 ?
        #pragma mark ---第一个参数是跟随指针 第二个参数是 ?的顺序 是从1开始的-第三个是要绑定的值--
        sqlite3_bind_int(stmt, 1, stu.Stu_ID);
        sqlite3_bind_text(stmt, 2, [stu.name UTF8String], -1, NULL);
        sqlite3_bind_text(stmt, 3, [stu.gender UTF8String], -1, NULL);
        sqlite3_bind_int(stmt, 4, stu.age);
    //6 单步执行 将伴随指针传进去
        sqlite3_step(stmt);
    }else{
        NSLog(@"数据库添加失败%d",result);
    }
    //7 释放跟随指针占用的内存
    sqlite3_finalize(stmt);
}
//删除学生对象
-(void)deleteStudent:(int)stu_ID{
    [self openDB];
    sqlite3_stmt *stmp = nil;
    NSString *sqlString = @"delete from Class43 where Stu_ID = ?";
    int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmp, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"数据库是删除成功");
        //开始绑定
        sqlite3_bind_int(stmp, 1, stu_ID);
        sqlite3_step(stmp);
    }else{
        NSLog(@"数据库删除失败");
    }
    sqlite3_finalize(stmp);
}
//更新学生信息 在此根据学号改变学生性别
-(void)updataStudentWithGender:(NSString *)gender andStu_ID:(int)stu_ID{
    [self openDB];
    sqlite3_stmt *stmt = nil;
    NSString *sql = @"update Class43 set gender = ? where Stu_ID = ?";
    int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"修改成功");
        sqlite3_bind_text(stmt, 1,[gender UTF8String], -1, nil);
        sqlite3_bind_int(stmt, 2, stu_ID);
        sqlite3_step(stmt);
    }else{
        NSLog(@"修改失败");
    }
    sqlite3_finalize(stmt);
}
//查询所有数据库中
-(NSArray *)selectAll{
    [self openDB];
    sqlite3_stmt *stmt = nil;
    NSString *sql = @"select * from Class43";
    int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"查询全部成功");
        //创建可变数组用来存放查询到的学生
        NSMutableArray *muArray = [NSMutableArray array];
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            //根据SQL语句将搜索到的符合条件的值取出来
            //0 代表数据库表的第一列
            int stu_id =sqlite3_column_int(stmt, 0);
            NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
            NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
            int age = sqlite3_column_int(stmt, 3);
            //将取出来的信息 赋值给学生的Model
            Student *stu = [[Student alloc]initWithName:name age:age gender:gender stu_ID:stu_id];
            //将学生添加到可变数组里面
            [muArray addObject:stu];
        }
        sqlite3_finalize(stmt);
        return muArray;
    }else{
        NSLog(@"查询全部失败%d",result);
    }
    sqlite3_finalize(stmt);
    return nil;
}
//根据学生的学号来进行查询单个学生对象
-(Student *)selectStudentWithStu_ID:(int)stu_ID{
    [self openDB];
    sqlite3_stmt *stmt = nil;
    NSString *str = @"select * from Class43 where Stu_ID =?";
    int result = sqlite3_prepare_v2(db, [str UTF8String], -1, &stmt, NULL);
    if (result == SQLITE_OK) {
        NSLog(@"查询单个学生完成");
        sqlite3_bind_int(stmt, 1, stu_ID);
        Student *stu = [Student new];
        while (sqlite3_step(stmt)== SQLITE_ROW) {
            int stu_id = sqlite3_column_int(stmt, 0);
            NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
            NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
            int age = sqlite3_column_int(stmt, 3);
            stu.Stu_ID = stu_id;
            stu.name = name;
            stu.age = age;
            stu.gender = gender;
            sqlite3_finalize(stmt);
            return stu;
        }
    }
    else{
        NSLog(@"查询数据库单个学生失败%d",result);
    }
    sqlite3_finalize(stmt);
    return nil;
}
@end

下面我们在ViewController.m 中实现数据的 增 删 改 查 的功能

#import "ViewController.h"
#import "Database.h"
#import "Student.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
   // [[Database sharedDataBase]openDB];
    
}

- (IBAction)add:(id)sender {
    NSLog(@"增加");
    Student *stu = [Student new];
    stu.name = @"刘高见";
    stu.gender = @"男";
    stu.Stu_ID = 1;
    stu.age = 18;
    
    Student *stu1 = [[Student alloc]initWithName:@"王" age:21 gender:@"女" stu_ID:2];
    Student *stu2 = [[Student alloc]initWithName:@"刘" age:21 gender:@"男" stu_ID:3];

    Student *stu3 = [[Student alloc]initWithName:@"赵" age:21 gender:@"女" stu_ID:4];

    Student *stu4 = [[Student alloc]initWithName:@"谢" age:21 gender:@"男" stu_ID:5];
    Database *database =[Database sharedDataBase];
    [database insertStudent:stu];
    [database insertStudent:stu1];
    [database insertStudent:stu2];
    [database insertStudent:stu3];
    [database insertStudent:stu4];
}
- (IBAction)delete:(id)sender {
//    NSLog(@"删除");
    [[Database sharedDataBase]deleteStudent:3];
}
- (IBAction)selectAll:(id)sender {
//    NSLog(@"查询所有");
    for (Student *stu in [[Database sharedDataBase]selectAll]) {
        NSLog(@"%@",stu);
    }
}
- (IBAction)selectSingle:(id)sender {
//    NSLog(@"查询单个");
    Student *stu =[Student new];
    stu = [[Database sharedDataBase]selectStudentWithStu_ID:1];
    NSLog(@"%@",stu);

}
- (IBAction)updata:(id)sender {
//    NSLog(@"修改");
    Database *database = [Database sharedDataBase];
    [database updataStudentWithGender:@"女" andStu_ID:5];
    NSLog(@"%@",[[Database sharedDataBase]selectStudentWithStu_ID:5]);
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end

以上就是本文的全部内容 期待大家的批评指导~~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容