热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IOS开发之sqlite编码

IOS开发之sqlite编码-SQLite3一、导入sqlite3库和头文件在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入主头文件#

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


推荐阅读
  • 有没有人用过sqlite?关于tablehasnocolumnnamedcolumn插入数据的时候报上边的错。问题是我明明有这一列。直接在sqlitedevoloper里执 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Python使用SQLite1.sqlite3的安装python2.5.x以上版本默认自带sqlite3模块。2.链接sqlite3数据库```#导入sqlite3模块import ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • Explain如何助力SQL语句的优化及其分析方法
    本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • Apple iPad:过渡设备还是平板电脑?
    I’vebeenagonizingoverwhethertopostaniPadarticle.Applecertainlydon’tneedmorepublicityandthe ... [详细]
  • 背景使用sqlite3的命令实现数据去重,与无效数据删除等操作。所有操作均封装在shellscript中。创建数据库邮件数据库:UserEmail.dbEmail表:TABLE_EM ... [详细]
author-avatar
hqgj15087878726
缅甸环球国际开户:15087878726游戏网址:www.6662016.com
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有