资讯专栏INFORMATION COLUMN

IOS开发之sqlite编码

LiuZh / 3038人阅读

摘要:如果等于常量,则表示成功打开数据库一个打开的数据库实例数据库文件的路径必须以字符串而非传入关闭数据库三执行不返回数据的语句执行创表语句用来存储错误信息代码解析可以执行任何语句,比如创表更新插入和删除操作。

SQLite3 一、导入sqlite3库和头文件

在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入主头文件

#import 
二、创建、打开、关闭数据库

1.创建或打开数据库

// 数据库放入沙盒中 
// ~/Library/Application Support/iPhone Simulator/
// path为:~/Documents/person.db
sqlite3 *db = NULL;
int result = sqlite3_open([path UTF8String], &db);

2.代码解析:

sqlite3_open()将根据文件路径打开数据库,如果不存在,则会创建一个新的数-据库。如果result等于常量SQLITE_OK,则表示成功打开数据库

sqlite3 *db:一个打开的数据库实例

数据库文件的路径必须以C字符串(而非NSString)传入

3.关闭数据库:sqlite3_close(db);

三、执行不返回数据的SQL语句 执行创表语句
char *errorMsg = NULL;  // 用来存储错误信息

char *sql = "create table if not exists t_person(id integer primary key autoincrement, name text, age integer);";

int result = sqlite3_exec(db, sql, NULL, NULL, &errorMsg);
代码解析:

sqlite3_exec()可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据

sqlite3_exec()还可以执行的语句:

①开启事务:begin transaction;
②回滚事务:rollback;
③提交事务:commit;

四、带占位符插入数据
char *sql = "insert into t_person(name, age) values(?, ?);";

sqlite3_stmt *stmt;

if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {

    sqlite3_bind_text(stmt, 1, "母鸡", -1, NULL);

    sqlite3_bind_int(stmt, 2, 27);

}

if (sqlite3_step(stmt) != SQLITE_DONE) {

    NSLog(@"插入数据错误");

}

sqlite3_finalize(stmt);

•代码解析:
usqlite3_prepare_v2()返回值等于SQLITE_OK,说明SQL语句已经准备成功,没有语法问题
usqlite3_bind_text():大部分绑定函数都只有3个参数
①第1个参数是sqlite3_stmt *类型
②第2个参数指占位符的位置,第一个占位符的位置是1,不是0
③第3个参数指占位符要绑定的值
④第4个参数指在第3个参数中所传递数据的长度,对于C字符串,可以传递-1代替字符串的长度
⑤第5个参数是一个可选的函数回调,一般用于在语句执行后完成内存清理工作
usqlite_step():执行SQL语句,返回SQLITE_DONE代表成功执行完毕
usqlite_finalize():销毁sqlite3_stmt *对象

五、查询数据
char *sql = "select id,name,age from t_person;";

sqlite3_stmt *stmt;

if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {

    while (sqlite3_step(stmt) == SQLITE_ROW) {

        int _id = sqlite3_column_int(stmt, 0);

        char *_name = (char *)sqlite3_column_text(stmt, 1);

        NSString *name = [NSString stringWithUTF8String:_name];

        int _age = sqlite3_column_int(stmt, 2);

        NSLog(@"id=%i, name=%@, age=%i", _id, name, _age);

    }

}

sqlite3_finalize(stmt);

•代码解析
usqlite3_step()返回SQLITE_ROW代表遍历到一条新记录
usqlite3_column_*()用于获取每个字段对应的值,第2个参数是字段的索引,从0开始

完整示例:

//
//  IWViewController.m
//  sqlite编码学习
//
//  Created by kaiyi on 16-6-27.
//  Copyright (c) 2016年 kaiyi. All rights reserved.
//

#import "IWViewController.h"
#import 

@interface IWViewController ()
{
    sqlite3 *_db;   // db代表着整个数据库
}
- (IBAction)insert;
- (IBAction)update;
- (IBAction)delete;
- (IBAction)select;

@end

@implementation IWViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 0.获得沙盒中的数据库文件名
    NSString *filename = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"student.sqlite"];
    
    // 1.创建(打开)数据库,(如果数据库文件不存在,会自动创建)
    // 将OC类型转为C语言类型,filename.UTF8String
    int result = sqlite3_open(filename.UTF8String, &_db);
    if(result == SQLITE_OK)
    {
        NSLog(@"成功打开数据库");
        
        // 2.创表
        const char *sql = "create table if not exists student_tbl (id integer primary key autoincrement, name text, age integer)";
        
        char *errorMesg = NULL;
        int result = sqlite3_exec(_db, sql, NULL, NULL, &errorMesg);
        
        if(result == SQLITE_OK)
        {
            NSLog(@"创建表student_tbl成功");
            
        }
        else
        {
            NSLog(@"创建表student_tbl失败:%s", errorMesg);
        }
        
        
    }
    else
    {
        NSLog(@"打开数据库失败");
        
    }
}

- (IBAction)insert
{
    for(int i = 0; i< 30; i++)
    {
        // 名字、年龄随机
        NSString *name = [NSString stringWithFormat:@"jack-%d", arc4random()%100];
        int age = arc4random()%100;
        
        // 查询SQL为字符串拼接
        NSString *sql = [NSString stringWithFormat:@"insert into student_tbl (name, age) values("%@", %d);", name, age];
        char *errorMesg = NULL;
        int resutl = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errorMesg);
        if(resutl == SQLITE_OK)
        {
            NSLog(@"成功添加数据");
            
        }
        else
        {
            NSLog(@"添加数据失败:%s", errorMesg);
            
        }

        
    }
    
  }

- (IBAction)update {
}

- (IBAction)delete {
}

- (IBAction)select {
    
    // SQL 注入漏洞
    /**
     *   登陆
     *   1.用户输入账号和密码
     *   账号: 123" or 1 = 1" or "" =  ";
     *   密码: 123456
     *
     */
    // $sql = "select * from user_tbl where username=’username" and password="pwd"";
    // $sql = select * from user_tbl where username=’123" or 1 = 1" or "" =  "" and password="pwd";
    // 1.定义SQL语句(通过占位符,可以判断输入的内容合法)
    const char *sql = "select * from student_tbl where name = ?;";
    
    // 2.定义一个stmt存放结果集
    sqlite3_stmt *stmt = NULL;
    
    // 3.检测sql语法的合法性
    int result = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);
    if(result == SQLITE_OK)
    {
         NSLog(@"查询语句合法");
        
        // 设置占位符的内容
        sqlite3_bind_text(stmt, 1, "jack", -1, NULL);
        
        // 4.执行SQL语句
        // int stepResult = sqlite3_step(stmt);
       
        while (sqlite3_step(stmt) == SQLITE_ROW){  // 真的查询到一行数据
            // 获得这行对应的数据
            
            // 获得第0列的ID
            int sid = sqlite3_column_int(stmt, 0);
            
            // 获得第一列的name
            const unsigned char *sname = sqlite3_column_text(stmt, 1);
            
            // 获得第二列的age
            int sage = sqlite3_column_int(stmt, 2);
            
            NSLog(@"%d %s %d", sid, sname, sage);
        }
        
    }
    else
    {
      NSLog(@"查询语句非法");
    }
    
}

@end

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16322.html

相关文章

  • IOS开发sqlite编码

    摘要:如果等于常量,则表示成功打开数据库一个打开的数据库实例数据库文件的路径必须以字符串而非传入关闭数据库三执行不返回数据的语句执行创表语句用来存储错误信息代码解析可以执行任何语句,比如创表更新插入和删除操作。 SQLite3 一、导入sqlite3库和头文件 在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入主头文件 showImg(https://seg...

    URLOS 评论0 收藏0
  • IOS开发sqlite封装

    摘要:下面将做一个简单的学生表单本地查询数据的界面,输入学生姓名可以查出相匹配的数据,本示例将对进行工具类封装,对学生进行模型数据封装注学生表包含学生,姓名,年龄三个字段。所以,以后的项目中可以使用框架,也可以自己进行封装工具类操作数据。 上一节实现了最基本的增删改查,所有操作数据库的方法都写在控制器里,这样会有一个问题,如果修改CURD(增删改查)操作方法会非常麻烦,这一节我们对CURD进...

    Achilles 评论0 收藏0
  • IOS开发sqlite封装

    摘要:下面将做一个简单的学生表单本地查询数据的界面,输入学生姓名可以查出相匹配的数据,本示例将对进行工具类封装,对学生进行模型数据封装注学生表包含学生,姓名,年龄三个字段。所以,以后的项目中可以使用框架,也可以自己进行封装工具类操作数据。 上一节实现了最基本的增删改查,所有操作数据库的方法都写在控制器里,这样会有一个问题,如果修改CURD(增删改查)操作方法会非常麻烦,这一节我们对CURD进...

    hankkin 评论0 收藏0
  • IOS开发sqlite框架FMDB

    摘要:基本操作方法开启事务回滚事务提交事务示例封装好的事务操作事务回滚 FMDB框架用来操作sqlite非常方便,下面将详细介绍该用法 一. 什么是FMDB? FMDB是iOS平台的SQLite数据库框架FMDB以OC的方式封装了SQLite的C语言API FMDB的优点 使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码. 对比苹果自带的Core Data框架,更加轻量级和灵活 提供...

    王军 评论0 收藏0
  • ios学习一定要知道这几中本地化存储方式

    摘要:文件文件是将某些特定的类,通过文件的方式保存在目录中。存储时使用方法。遵循协议协议声明了两个方法,这两个方法都是必须实现的。所以,请使用,它是线程安全的。这意味着你从多线程同时调用调用方法,也会按它接收的块的顺序来执行。 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据。在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案:...

    pepperwang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<