您的位置:首页 > 理论基础 > 计算机网络

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

2016-05-15 10:14 567 查看
一、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 =
4000
"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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: