objective-c - 基础篇 - 数据库网络 - sqlite的链接+增删改查

这篇博客详细介绍了如何在 Objective-C 中链接并操作 SQLite 数据库,包括数据库的连接、增删改查的基本步骤。文章通过示例代码演示了创建表、插入数据、删除数据、更新数据和查询数据的过程,涵盖了固态语句、拼接语句和使用预处理语句的方法。

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

一、sqlite的链接+增删改查(XCODE7.1+ IOS9)

注:sqlite数据库的链接+增删改查中需要注意的地方有:

大前提:需要导入数据库 库。点击项目 》》BuildPhases 》》Link Binary With Libraies 》》点击+号》》Add Other..》》按 shift+command+G 》》输入//usr//lib》》选择 libsqlite3.dylib 》》之后在 文件里加上

#import<sqlite3.h>这样才可以访问到sql语句。

 一:要访问数据库,前提是获得项目的路径。获得之后就是在路径下使用

         stringByAppendingPathComponent添加一个数据库文件。

二:数据库的操作流程是:1:打开数据库。 2:操作数据库。 3:关闭数据库。

三:打开数据库:1:定义一个起着标示作用的sqlite3对象指针。  2:使用sqlite3_open打开数据库,这里需要注意的                                一点是:int result =sqlite3_open(filePath.UTF8String, &db);//&db 是指针, 需要把filePath转为C                              语言的 CAHR。3:使用 result == SQLITE_OK来判断是否打开成功。

四:操作数据库:1:创建表 2:增 3:删 4:改 5:查

五:创建表:1:char * sql ="create table if not exists t_student(name text, age integer)"; 这里必须使用 if not exists来判断数据库中是否已经存在该表。2:使用result =sqlite3_exec(db, sql,NULL,NULL, &err);来执行语句。

六:增删改查:都有三种书写数据库操作语句的方法。这里用增来举例。其他大同小异。

 1:固态的增加语句:char * addsql  = "insert into t_student(name, age) values('张三', 22)";  

2:拼接的语句:NSString * addsql = [NSString stringWithFormat:@"insert into t_student(name, age) values('%@', %@)", name, age]; 

3:使用层数的语句:

   sqlite3_stmt * addstmt; //定义一个二维表格

    char * addsql ="insert into t_student(name, age) values(?, ?)";  //使用 ?占位符

    result = sqlite3_prepare_v2(db,addsql,  -1, &addstmt,NULL);     //使用sqlite3_prepare_v2这个预处理语句

    if (result ==SQLITE_OK) {

        //绑定参数

        int nameresult =sqlite3_bind_text(addstmt, 1, [name UTF8String], -1,NULL);  //这里的1就是代表addsql语       句中的第一个问号.并且需要把name转为C语言的CHAR

        if (nameresult ==SQLITE_OK) {

            NSLog(@"name绑定成功");

        }

        int ageresult =sqlite3_bind_int(addstmt, 2, [age intValue]); //这里的1 就是代表addsql语句中的第一个问号.

        if (ageresult ==SQLITE_OK) {

            NSLog(@"age绑定成功");

        }

    }

    if (sqlite3_step(addstmt) !=SQLITE_DONE) {

        NSLog(@"插入失败");

    }

    sqlite3_finalize(addstmt);  //最后是释放层数所占用的资源。

七:关闭数据库

  sqlite3_close(db);


八:代码

#import "ViewController.h"

#import <sqlite3.h>

@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

}


- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


- (IBAction)db:(id)sender {

    //    //获得项目路径

    //    NSString * path = NSHomeDirectory();

    //    //往路径增加文件名

    //    path = [path stringByAppendingPathComponent:@"mydb1.sqlite"];

    //    NSLog(@"%@", path);

    //

    //

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

    //获得文档文件夹下的第一个元素,就是文档的路径(相当于访问NSHomeDirectory()下的Documents文件路径)---------即获取到Documents的完整路径

    NSString * documentDirectory = [paths objectAtIndex:0];

    

    

    /*-------开始写入内容到文件夹中-----------*/

    //1:就是在上面的文档路径下添加一个txt文件,注意使用的是stringByAppendingPathComponent,加的是一个路径。而不是stringByAppendingString,是因为这样就有路径的分隔符

    NSString * filePath = [documentDirectory stringByAppendingPathComponent:@"mydb2.sqlite"];

    NSLog(@"%@", filePath);

    

    sqlite3 * db; //数据库指针--其实起着标示作用。

    //打开数据库,如果没有数据库,就创建数据库文件,并且打开。如果已经存在该数据库,就直接打开数据库。

    int result = sqlite3_open(filePath.UTF8String, &db); //&db 是指针

    //判断打开是否成功

    if (result != SQLITE_OK) {

        NSLog(@"打开错误");

    }

    //操作数据库

    char * sql = "create table if not exists t_student(name text, age integer)";

    char * err;//保存错误信息

    result = sqlite3_exec(db, sql, NULL, NULL, &err);

    //判断创建是否成功

    if (result == SQLITE_OK) {

        NSLog(@"创建成功");

    }

    

    //获得文本框内容

    NSString * name = self.name.text;

    NSString * age = self.age.text;

    

    //

    

    /*方法一:普通方法

     char * addsql  = "insert into t_student(name, age) values('张三', 22)";  //固态的增加语句

     NSString * addsql = [NSString stringWithFormat:@"insert into t_student(name, age) values('%@', %@)", name, age];

     NSLog(@"%s", addsql);

     result = sqlite3_exec(db, addsql, NULL, NULL, &err);

     //判断创建是否成功

     if (result != SQLITE_OK) {

     NSLog(@"错误原因%s", err);

     }

     */

    

    //方法二:使用层数的方法

    sqlite3_stmt * addstmt;

    char * addsql = "insert into t_student(name, age) values(?, ?)";

    result = sqlite3_prepare_v2(db,addsql,  -1, &addstmt, NULL);

    BOOL bflot = NO//标示

    if (result == SQLITE_OK) {

        //绑定NAME参数

        int nameresult = sqlite3_bind_text(addstmt, 1, [name UTF8String], -1, NULL);  //这里的1 就是代表addsql语句中的第一个问号.

        if (nameresult != SQLITE_OK) {

            NSLog(@"name绑定失败");

            bflot = YES;

        }

        //绑定AGE参数

        int ageresult = sqlite3_bind_int(addstmt, 2, [age intValue]);  //这里的2 就是代表addsql语句中的第二个问号.

        if (ageresult != SQLITE_OK) {

            NSLog(@"age绑定失败");

            bflot = YES;

        }

    }

    if (bflot == NO) {   //绑定成功的时候才执行下面语句。

        if (sqlite3_step(addstmt) != SQLITE_DONE) {

            NSLog(@"插入失败");

        }

    }

    sqlite3_finalize(addstmt);

    

    //

    

    /*

     方法一:普通方法

     char * deletesql  = "delete  from  t_student where name='张三'";  //固态的增加语句

     NSLog(@"%s", deletesql);

     result = sqlite3_exec(db, deletesql, NULL, NULL, &err);

     //判断创建是否成功

     if (result != SQLITE_OK) {

     NSLog(@"错误原因%s", err);

     }*/

    

    //方法二:使用层数的方法

    sqlite3_stmt * deletestmt;

    char * deletesql = "delete  from  t_student where name=?";

    result = sqlite3_prepare_v2(db,deletesql,  -1, &deletestmt, NULL);

    //预处理

    if (result == SQLITE_OK) {

        //绑定参数

        int nameresult = sqlite3_bind_text(deletestmt, 1, "来了四", -1, NULL);  //这里的1 就是代表addsql语句中的第一个问号.直接使用张三,不需要再加@了。因为这样就直接是 C语言的语法。并且 也不用再加 单引号

        if (nameresult != SQLITE_OK) {

            NSLog(@"name绑定失败");

        }

        else  //绑定成功就可以执行语句

        {

            if (sqlite3_step(deletestmt) != SQLITE_DONE) {

                NSLog(@"删除失败");

            }

        }

    }

    else{

        NSLog(@"绑定失败");

    }

    //释放

    sqlite3_finalize(deletestmt);

    

    

    

//

    /*

     方法一:普通方法

     char * updatesql  = "update t_student set age=25 where  name='来了四'";  //固态的增加语句

     

     NSLog(@"%s", updatesql);

     result = sqlite3_exec(db, updatesql, NULL, NULL, &err);

     //判断创建是否成功

     if (result != SQLITE_OK) {

     NSLog(@"错误原因%s", err);

     }

     */

    

    //方法二:使用层数的方法

    //1:先定义一个二维表格的层数

    sqlite3_stmt * updatestmt;

    

    char * updatesql  = "update t_student set age=? where  name=?"//固态的增加语句

    result = sqlite3_prepare_v2(db, updatesql, -1, &updatestmt, NULL);

    BOOL aFlot = NO//标示

    if (result == SQLITE_OK) {

        //绑定AGE参数

        int ageresult = sqlite3_bind_int(updatestmt, 1, 8888);  //这里的1 就是代表addsql语句中的第一个问号.

        if (ageresult != SQLITE_OK) {

            NSLog(@"age绑定失败");

            bflot = YES;

        }

        //绑定NAME参数

        int nameresult = sqlite3_bind_text(updatestmt, 2, "gh", -1, NULL);  //这里的2 就是代表addsql语句中的第二个问号.

        if (nameresult != SQLITE_OK) {

            NSLog(@"name绑定失败");

            bflot = YES;

        }

        if (bflot == NO) {   //绑定成功的时候才执行下面语句。

            if (sqlite3_step(updatestmt) != SQLITE_DONE) {

                NSLog(@"更新失败");

            }

        }

    }

    else{

        NSLog(@"预处理失败");

    }

    sqlite3_finalize(updatestmt);

    

    

    

    //  -- 这里使用预处理语句--sqlite3_prepare_v2 是为了找到缓存中运行过的sql语句,增加SQL语句编译的效率

    //1:先定义一个二维表格的层数

    sqlite3_stmt * searchstmt;

    char * searchsql  = "select * from t_student";

    //2:执行预处理语句。  int nByte 也就是下面的这个 -1 是代表有多少个字节。这里的-1就是让电脑自己计算.下面的 &stmt 是代表返回的内容格式

    result = sqlite3_prepare_v2(db, searchsql, -1, &searchstmt, NULL);  //这里是预处理语句

    

    if (result == SQLITE_OK) {  //判断创建是否成功

        //3:先遍历返回的结构

        while (sqlite3_step(searchstmt) == SQLITE_ROW) {  //得到返回结构的一行

            //4:得到预处理结果。    这里做了一个强制转换,转成char * 之后这里的0 代表的是第一列,而且第一列是text类型的。

            char * name = (char *)sqlite3_column_text(searchstmt, 0);

            int age = sqlite3_column_int(searchstmt, 1);  //这里的1 代表的是第二列,而且第一列是int类型的。

            //5:把C语言的char转成 NSString

            NSString * strname = [NSString stringWithUTF8String: name]; //这里是把 char name 转换成 NSString

            NSLog(@"name = %@ age = %d", strname, age);

            

        }

    }

    else{

        NSLog(@"预处理失败");

    }

    

    //6:释放层数所占用的资源。

    sqlite3_finalize(searchstmt);

    

    //关闭数据库

    sqlite3_close(db);

    

}

@end









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值