数据库

本文介绍了一个基于Objective-C的数据库处理类,实现数据的增删改查功能,包括创建表、插入数据、更新数据和删除数据,并通过单例模式确保数据库操作的线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.  创建一个继承于NSObject的类   :  DataBaseHandler

DataBaseHandler.h中

{

    sqlite3 * dbPoint;//指针指向的是本地数据库文件

   

}

//作为一个数据处理的类,其对象最好为一个单例

+ (DataBaseHandler *)shareInstance;

 

//开启数据库

- (void)openDB;

 

//关闭数据库

- (void)closeDB;

 

 

//创建表

- (BOOL)creatTable;

 

//插入数据

- (BOOL)insertTableWithName:(NSString *)name age:(int)age number:(int)number;

 

 

//删除数据

- (BOOL)deleteTableWithName:(NSString *)name;

 

 

//更新数据

- (BOOL)updateName:(NSString *)scorceName toName:(NSString *)targetName;

 

 

//查询数据

- (NSArray *)selectTable;

 

 

 

 

 

 

 

 

 

DataBaseHandler.m

   

+ (DataBaseHandler *)shareInstance

{

   

    static DataBaseHandler * handler= nil;

 

    //保证线程安全的情况下进行一次

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        handler = [[DataBaseHandler alloc] init];

       

        //第一次执行的时候打开数据库  创建单例

        [handler openDB];

       

       

 

    });

 

    return handler;

 

}

 

#warning //开启数据库

- (void)openDB

{

    //1.拼接一个数据库文件的地址

    NSArray * arrPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

   

    //沙盒中的documents文件夹

    NSString * documentPath = [arrPath lastObject];

    NSLog(@"%@",documentPath);

    //拼接处地址

    NSString * dbPointPath =  [documentPath stringByAppendingPathComponent:@"lanou.db"];

    NSLog(@"%@",dbPointPath);

 

    //参数1: 数据库的文件路径

    //参数2: sqlite3 指针的地址&dbPoint   属性

    //[dbPointPath UTF8String] NSString转成constchar * 类型

    int result = sqlite3_open([dbPointPath UTF8String], &dbPoint);

   

    //对数据库结果进行判断

    if (result == SQLITE_OK) {

       

        NSLog(@"打开成功");

       

    }

    else

    {

        NSLog(@"打开失败");

       

    }

   

   

   

}

 

- (void)closeDB

{

    int result = sqlite3_close(dbPoint);

   

    if (result == SQLITE_OK) {

       

        NSLog(@"关闭数据库成功");

       

    }else

    {

        NSLog(@"关闭数据库失败");

    }

   

}

 

 

- (BOOL)creatTable

{

   

   

    //注意两个单引号

    NSString * sqlStr = [NSString stringWithFormat:@"create tableStudent (name text,age int,number int primary key)"];

   

    char * error = nil;

   

    int result = sqlite3_exec(dbPoint, [sqlStr UTF8String], NULL, NULL, &error);

   

    if (result == SQLITE_DONE) {

        return YES;

       

    }

   

    return NO;

   

   

  

   

   

    //1.数据库的替身缓冲地带  确保更新完成之后会自动的更新数据库

    //作用 :存储所有对数据库的修改

    sqlite3_stmt * stmt = nil;

   

    //2.检查SQL语句,为执行sql语句做的准备

    //参数1:数据库指针

    //参数2:SQL语句  不需要@ 直接双引号里面填写

    //参数3:限制sql语句的长度不想限制长度写-1

    //参数4:数据库替身stmt的地址

    int result =sqlite3_prepare(dbPoint, "create table Student (name text,ageint,number int primary key)", -1, &stmt, nil);

 

    //3.判断检查的结果

    if (result == SQLITE_OK) {

       

       

        //4.执行sql语句

       int sqlResult = sqlite3_step(stmt);

       

       

        //判断sqlResult

        if (sqlResult == SQLITE_DONE ) {

            //stmt 数据保存到数据库指针释放掉

            sqlite3_finalize(stmt);

            return YES;

           

        }

  

    }

   

    //如果检查sql语句失败,stmt指针释放掉

    sqlite3_finalize(stmt);

   

    return  NO;

 

}

 

 

 

#warning //插入

- (BOOL)insertTableWithName:(NSString *)name age:(int)age number:(int)number

{

   

    //注意两个单引号

    NSString * sqlStr = [NSString stringWithFormat:@"insert into Studentvalues ('%@',%d,%d)",name,age,number];

   

    char * error = nil;

   

    int result = sqlite3_exec(dbPoint, [sqlStr UTF8String], NULL, NULL, &error);

   

    if (result == SQLITE_DONE) {

        return YES;

       

    }

   

    return NO;

   

 

    //1.替身

    sqlite3_stmt * stmt = nil;

   

    //注意NULL

    int result =sqlite3_prepare(dbPoint, "insert into Student values(?,?,?)", -1, &stmt, NULL);

   

    //3.给问号 ? 绑定参数和数据

    //参数1 : 替身

    //参数2 : 给哪个位置的 ?绑定  第一个元素1

    //参数3: 提供的数据

    sqlite3_bind_text(stmt, 1, [name UTF8String], -1, NULL);

 

    sqlite3_bind_int(stmt, 2, age);

   

    sqlite3_bind_int(stmt, 3, number);

   

   

    //4.sql检查无误

    if (result == SQLITE_OK) {

       

        //5.执行

        if (sqlite3_step(stmt) == SQLITE_DONE) {

            //6.释放

            sqlite3_finalize(stmt);

            return YES;

           

        }

    }

    sqlite3_finalize(stmt);

    return NO;

 

}

 

 

#warning //更新

- (BOOL)updateName:(NSString *)scorceName toName:(NSString *)targetName

{

   

    //注意两个单引号

    NSString * sqlStr = [NSString stringWithFormat:@"update Student setname = '%@' where name = '%@'",scorceName,targetName];

   

    char * error = nil;

   

    int result = sqlite3_exec(dbPoint, [sqlStr UTF8String], NULL, NULL, &error);

   

    if (result == SQLITE_DONE) {

        return YES;

       

    }

   

    return NO;

   

 

    //1.替身

    sqlite3_stmt * stmt = nil;

   

    //注意NULL

    int result =sqlite3_prepare(dbPoint, "update Student set name = ? wherename = ?", -1, &stmt, NULL);

   

    //3.给问号 ? 绑定参数和数据

    //参数1 : 替身

    //参数2 : 给哪个位置的 ?绑定  第一个元素1

    //参数3: 提供的数据

    sqlite3_bind_text(stmt, 1, [scorceName UTF8String], -1, NULL);

 

    sqlite3_bind_text(stmt, 2, [targetName UTF8String], -1, NULL);

   

    //4.sql检查无误

    if (result == SQLITE_OK) {

       

        //5.执行

        if (sqlite3_step(stmt) == SQLITE_DONE) {

            //6.释放

            sqlite3_finalize(stmt);

            return YES;

           

        }

    }

    sqlite3_finalize(stmt);

    return NO;

 

}

 

 

 

 

 

 

#warning 删除    改进  除了查询之外的方法都可以简化

 

- (BOOL)deleteTableWithName:(NSString *)name

{

   

    //注意两个单引号

    NSString * sqlStr = [NSString stringWithFormat:@"delete from Studentwhere name = '%@'",name];

   

    char * error = nil;

   

    int result = sqlite3_exec(dbPoint, [sqlStr UTF8String], NULL, NULL, &error);

   

    if (result == SQLITE_DONE) {

        return YES;

       

    }

   

    return NO;

   

   

   

   

#warning 原来的复杂算法

    sqlite3_stmt * stmt = nil;

   

    int result =sqlite3_prepare(dbPoint, "delete from Student where name =?", -1, &stmt, NULL);

   

    sqlite3_bind_text(stmt, 1, [name UTF8String ], -1, NULL);

   

   

    //4.Sql检查无误

    if (result == SQLITE_OK) {

       

        //5.执行

        if (sqlite3_step(stmt) == SQLITE_DONE) {

           

            //6.保存/释放

            sqlite3_finalize(stmt);

            return YES;

           

        }

    }

   

    sqlite3_finalize(stmt);

    return NO;

 

   

}

#warning //查询   显示所有的

- (NSArray *)selectTable

{

    sqlite3_stmt * stmt = nil;

   

    int result = sqlite3_prepare(dbPoint, "select * fromStudent", -1, &stmt, NULL);

   

    if (result == SQLITE_OK) {

       

        //数组用来存储结果

        NSMutableArray * arr = [NSMutableArray array];

       

        while (sqlite3_step(stmt) == SQLITE_ROW)

        {

           

            //获取每行的数据

            const unsigned char * nameChar = sqlite3_column_text(stmt, 0);

           

            NSString * name = [NSString stringWithUTF8String:(const char *)nameChar];//产生第一条数据

           

            int age =  sqlite3_column_int(stmt, 1);

            

            int number = sqlite3_column_int(stmt, 2);

           

            NSString * str = [NSString stringWithFormat:@"姓名:%@,年龄:%d,学号: %d",name,age,number];

           

            NSLog(@"%@",str);

           

            [arr addObject:str];

           

        }

        sqlite3_finalize(stmt);

        return arr;

         

    }

    sqlite3_finalize(stmt);

    return [NSMutableArray array];    

}

在线代码格式化

http://tool.oschina.net/codeformat/json

1. 用户与身体信息管理模块 用户信息管理: 注册登录:支持手机号 / 邮箱注册,密码加密存储,提供第三方快捷登录(模拟) 个人资料:记录基本信息(姓名、年龄、性别、身高、体重、职业) 健康目标:用户设置目标(如 “减重 5kg”“增肌”“维持健康”)及期望周期 身体状态跟踪: 体重记录:定期录入体重数据,生成体重变化曲线(折线图) 身体指标:记录 BMI(自动计算)、体脂率(可选)、基础代谢率(根据身高体重估算) 健康状况:用户可填写特殊情况(如糖尿病、过敏食物、素食偏好),系统据此调整推荐 2. 膳食记录与食物数据库模块 食物数据库: 基础信息:包含常见食物(如米饭、鸡蛋、牛肉)的名称、类别(主食 / 肉类 / 蔬菜等)、每份重量 营养成分:记录每 100g 食物的热量(kcal)、蛋白质、脂肪、碳水化合物、维生素、矿物质含量 数据库维护:管理员可添加新食物、更新营养数据,支持按名称 / 类别检索 膳食记录功能: 快速记录:用户选择食物、输入食用量(克 / 份),系统自动计算摄入的营养成分 餐次分类:按早餐 / 午餐 / 晚餐 / 加餐分类记录,支持上传餐食照片(可选) 批量操作:提供常见套餐模板(如 “三明治 + 牛奶”),一键添加到记录 历史记录:按日期查看过往膳食记录,支持编辑 / 删除错误记录 3. 营养分析模块 每日营养摄入分析: 核心指标计算:统计当日摄入的总热量、蛋白质 / 脂肪 / 碳水化合物占比(按每日推荐量对比) 微量营养素分析:检查维生素(如维生素 C、钙、铁)的摄入是否达标 平衡评估:生成 “营养平衡度” 评分(0-100 分),指出摄入过剩或不足的营养素 趋势分析: 周 / 月营养趋势:用折线图展示近 7 天 / 30 天的热量、三大营养素摄入变化 对比分析:将实际摄入与推荐量对比(如 “蛋白质摄入仅达到推荐量的 70%”) 目标达成率:针对健
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值