ios开发系列之Sqlite3的增删改查相关操作

1,打开数据库,不存在就会创建一个

sqlite3_open([[self getFilePath] UTF8String],&database)//如果返回值为`SQLITE_OK` 则打开数据库成功 ,否则失败

数据库的增删改查都是基于打开数据库成功的前提下进行sqlite3_exec操作的

sqlite3_exec(database,[sqlStr UTF8String],NULL,NULL,nil)//如果返回值为SQLITE_OK,则操作成功,否则失败

,而且每一次操作结束后都要关闭数据库连接

sqlite3_close(database);//关闭数据库连接

2,创建一个数据表

CREATE TABLE 表名 (字段名1 字段类型,字段名2 字段类型,...... ), (字段名也就是列名)

其中字段类型有
(1).数据类型 :常用的有TEXT(字符串,单引号或双引号来环绕文本值,如果是数值,则不需要使用引号),INTEGER(整型),FLOAT/DOUBLE(单/双精度浮点型),BOOLEAN(布尔型),具体的可以Google一下sql中的数据类型
(2).PRIMARY KEY 主键,也是唯一的标识符
(3).AUTOINCREMENT 自动增长
(4).NOT NULL 非空
(5).UNIQUE 唯一的
(6).DEFAULT 给字段添加默认值约束
(7).FOREIGN KEY 外键,关联表

3.增加数据(插入数据)

(1)插入一行新数据,需要值和字段名对应添加

INSERT INTO 表名 (字段名1,字段名2,....)VALUES (值1,值2,....); 

像下面这种方法是默认全部字段添加

INSERT INTO 表名 VALUES (值1,值2,...)

(2)给表添加新的一列 ,(并没有给每行赋值)

ALTER TABLE 表名 ADD 字段名  字段类型 

4.删除数据

(1)根据WHERE条件删除

 DELETE FROM 表名 WHERE 条件

其中条件运算符= ,>,>=,<,=< ,!=(或者<>),BETWEEN(在某个范围内,前闭后闭),LIKE(含有特定字符,用下划线_代表一个任意字符,%代表任意一串字符),OR 相当于或,只需要一个条件成立, AND,相当于且,需要全部条件成立
如:①查询含有x的字符串 like '%x%' ②查询第二位有x得字符串 like '_x%'

(2)删除表

DROP TABLE 表名

5.修改数据

UPDATE 表名 SET 字段名1 = 新值1,字段名2 = 新值2,...... WHERE 条件

6.查询数据

(1)根据条件查询

SELECT 字段名1,字段名2,...... FROM 表名 WHERE 条件 

可以用 * 代表所有的字段名,进行整个表的查询:

SELECT * FROM 表名

数据库中提供了内置函数: MAX(求最大值),MIN(求最小值),AVG(求平均值),SUM(求和),

(2)根据指定的列,对结果集进行排序,默认按照升序:

SELECT 字段名 FROM 表名  ORDER BY 字段名 条件(DESC(降序) 或者 ASC(升序))

(3)查询不重复的数据

SELECT DISTINCT 字段名 FROM 表名  

在对数据库进行增删改查时,需要用到对应格式的C语言字符串,
首先,将NSString转换为 const char 的方法为 [sqlStr UTF8String], 将const char转换为NSString的方法有 [NSString stringWithUTF8String:cChar]或者[[NSString alloc]initWithUTF8String:cChar]
然后,我们在动态进行操作时需要动态获取对应的值,这时我们的sql语句就不是固定不变的了,需要动态改变,

7.动态操作的方法有:

(1)拼接字符串的方法

这种方法比较简单,将不变的和变化的通过[NSString stringWithFormat:]方法拼接起来,就ok了

(2)使用 ? 作为值的占位符,然后准备语句,绑定数据.

具体步骤如下:
①创建操作语句,变化的值用?代替
比如

NSString * sqlStr = @"UPDATE contactTable SET name = ?,phoneNumber = ? WHERE contactID = ?";

②声明一个缓冲区

 sqlite3_stmt * stmt = nil;

③准备语句,

 sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &stmt, nil)

如果返回值为SQLITE_OK 则进行绑定操作,否则使用sqlite3_finalize(stmt); 来销毁前面被sqlite3_prepare创建的准备语句,以防止内存泄露。
④绑定数据操作

  sqlite3_bind_text(stmt, 1, [c.name UTF8String], -1, NULL);
  sqlite3_bind_text(stmt, 2, [c.phoneNumber UTF8String], -1, NULL);
  sqlite3_bind_int(stmt, 3, c.contactID);

⑤如果sqlite3_step(stmt) 返回值等于SQLITE_DONE 则表明操作成功.(在查询数据库操作中使用

 while(sqlite3_step(stmt) == SQLITE_ROW){ 
         //通过sqlite3_column_数据类型 来获取对应列(索引从0开始)的值
 }

).

8.比较完整的代码

#pragma mark - 创建或打开数据库
- (BOOL)createDatabase{
    if(sqlite3_open([getFilePath() UTF8String], &db) == SQLITE_OK){
        NSLog(@"创建数据库或者打开数据库---成功");
        return YES;
    }else{
        NSLog(@"创建数据库或者打开数据库---失败");
        return NO;
    }
}
#pragma mark - 创建表
- (void)createTable{
    if ([self createDatabase]) {
        NSLog(@"---------数据库打开成功");
        NSString * sqlStr = @"CREATE TABLE IF NOT EXISTS contactTable (contactID INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,phoneNumber TEXT)";
        if(sqlite3_exec(db, [sqlStr UTF8String], NULL, NULL, nil) == SQLITE_OK){
            NSLog(@"创建表格成功");
        }else{
            NSLog(@"创建表格失败");
        }
    }else{
        NSLog(@"---------数据库打开失败");
    }
    sqlite3_close(db);
}
#pragma mark - 插入数据到数据库
- (void)insertDataIntoDb:(Contact *)c{

    if ([self createDatabase]) {
        //1 拼接字符串
//        NSString * sqlStr = @"INSERT INTO contactTable(name,phoneNumber) VALUES (";
//        NSString * sql = [NSString stringWithFormat:@"%@%@,%@)",sqlStr,c.name,c.phoneNumber];
//        if(sqlite3_exec(db, [sql UTF8String], NULL, NULL, nil) == SQLITE_OK){
//            NSLog(@"数据插入成功");
//        }else{
//            NSLog(@"数据插入失败");
//        }
        //2 使用 ? 作为要插入值的占位符
        NSString * sqlStr = @"INSERT INTO contactTable(name,phoneNUmber) VALUES (?,?)";
        sqlite3_stmt * stmt = nil;//创建缓冲区
        if(sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &stmt, nil) == SQLITE_OK){
            //绑定要插入的数据
            sqlite3_bind_text(stmt, 1, [c.name UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 2, [c.phoneNumber UTF8String], -1, NULL);
            if (sqlite3_step(stmt) == SQLITE_DONE) {
                NSLog(@"*********插入数据成功");
            }
        }else{
            sqlite3_finalize(stmt);
        }
    }
    sqlite3_close(db);
}
#pragma mark - 从数据库中删除数据
- (void)deleteDataFromDb:(Contact *)c{
    if ([self createDatabase]) {
        NSString * sqlStr = @"DELETE FROM contactTable WHERE contactID = ";
        NSString * sql = [NSString stringWithFormat:@"%@%d",sqlStr,c.contactID];
        if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, nil) == SQLITE_OK) {
            NSLog(@"删除成功");
        }else{
            NSLog(@"删除失败");
        }
    }
    sqlite3_close(db);
}
#pragma mark - 修改数据库中的数据
- (void)updateDataFromDb:(Contact *)c{
    if ([self createDatabase]) {
        NSString * sqlStr = @"UPDATE contactTable SET name = ?,phoneNumber = ? WHERE contactID = ?";
        sqlite3_stmt * stmt = nil;
        if(sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &stmt, nil) == SQLITE_OK){
            //绑定要插入的数据
            sqlite3_bind_text(stmt, 1, [c.name UTF8String], -1, NULL);
            sqlite3_bind_text(stmt, 2, [c.phoneNumber UTF8String], -1, NULL);
            sqlite3_bind_int(stmt, 3, c.contactID);
            if (sqlite3_step(stmt) == SQLITE_DONE) {
                NSLog(@"*********修改数据成功");
            }
        }else{
            sqlite3_finalize(stmt);
        }
    }
    sqlite3_close(db);
}
#pragma mark - 查询数据
- (NSMutableArray *)getAllContact{
    NSMutableArray * array = [[NSMutableArray alloc]init];
    if ([self createDatabase]) {
        //打开数据库成功准备查询
        NSString * sqlStr = @"SELECT * FROM contactTable";
        sqlite3_stmt * stmt = nil;
        if(sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &stmt, nil) == SQLITE_OK){
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                int contactID = sqlite3_column_int(stmt, 0);
                NSString * name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)] ;
                NSString * phoneNumber = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 2)];
                Contact * c = [Contact createContactWithProperty:contactID name:name phoneNumber:phoneNumber]; //这是自定义类Contact(继承于NSObject)中的自定义方法,返回一个Contact类型的对象.Contact有3个属性 int contactID,NSString * name , *phoneNumber;
                [array addObject:c];
            }
        }
    }
    return [array autorelease];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值