iOS开发之SQLite-C语言接口规范(一)——Ready And Open Your SQLite

简介:

 为什么要搞一搞SQLite的C语言接口规范呢? 因为在做iOS开发中难免会遇到操作数据库的情况,你可以使用第三方的FMDB等,或者使用CoreData。但我们还是有必要去搞清楚如何去使用SQLite的C语言接口来操作SQLite数据库的。从今天开始就给大家结合实例详细的搞一搞SQLite的C语言接口。关于CoreData的东西请看之前的博客《IOS开发之表视图爱上CoreData》。

  如果英文好的小伙伴呢,你可以不听我啰嗦,直接官网走起:http://www.sqlite.org 上面的东西是应有尽有,你可以下载资源如SQLite的Shell, 上面还有好多的学习资源。不过前提是英文不能太Low呢。之前看过几本iOS开发的书籍,也包括某某出版社出版的《精通iOS开发》,虽然网上评价不错,但看书的时候总是不来感。大部分书上介绍的SQLite, 讲的太浅,只是罗列代码,接口参数是什么意思,为什么这么写都没讲。看书看的不爽了,就到官网上找找安慰吧,果不其然,眼前一亮。就写几篇博客好好的总结一下。

  一、准备SQLite测试工程和所需工具

    1. 准备一个已经引入动态链接库libsqlite3.0.dylib的iOS单视图工程(当然,看你心情,你也可以创建一个控制台工程,这不是重点)。

    2. 准备一个SQLite可视化的管理工具,我用的是SQLiteManager, 当然你可以选择你用着顺手的管理工具(自行百度吧)。当然如果你是初学者,并想“自残”一下话,可以从官网上Download一个叫做sqlite-shell的东西,用纯命令行去管理你的SQLite数据库。其实如果习惯了,用纯命令还是用着比较爽的,毕竟可以用来装13不是么! SQLite官网上有详细的Shell操作命令:如何去创建数据库,如何创建表等一系列的操作,今天不做赘述。(如果你之前搞过MySQL, Oracle等,应该对命令行操作数据库再熟悉不过了)。

    3. 你可以通过SQLiteManager来创建一个数据库插入一些测试数据,以备在我们的测试工程中进行使用。或者你可以懒一些,直接从网上Download一个现成的SQLite数据库进行操作使用(我下载了一个叫做Cars.sqlite文件来进行测试,数据库的表结构及数据如下所示)。

 

  二、打开你的数据库

    1.把准备好的测试SQLite数据库引入到我们的测试工程中。

    2.通过NSBundle加载我们的数据库资源

    //获取Sqllite文件的路径
    NSString *sqlPath = [[NSBundle mainBundle] pathForResource:@"Cars" ofType:@"sqlite"];

 

    3.因为是C语言接口,参数所用的字符串都是C语言中的字符串,所以呢得把字符串转成C语言中的字符串吧(也就是C语言中char类型的指针)

    //把路径转成C字符串
    const char * filePath = [sqlPath UTF8String];

    4.你需要定义一个sqlite3结构体类型的指针变量,打开数据库后可以获取这个sqlite3结构体指针的值,并赋值给之前对应的指针变量,然后就可以通过该sqlite3结构体指针变量来操作数据库。下面定义了一个sqlite3结构体类型的指针变量,然后把该指针变量的地址传给sqlite3_open()函数,函数参数传入的引用,在C语言中就可以得到数据库操作指针。为了便于理解,可以把sqlite3结构体当做一个类,而sqlite3结构体的指针可以看做是类的对象。
    sqlite3 * database;
    
    //打开数据库
    int result = sqlite3_open(filePath, &database);

   通过上述步骤就可以获取到操作数据库的结构体指针,sqlite3_open()函数,第一个参数就是C字符串格式的数据库文件的路径,第二个参数就是结构体指针的地址,用于获取操作数据库的句柄。该函数有一个int类型的返回值(0-101),这些返回值对应着不同的链接状态。0代表着成功,其余见下图:
if (result == SQLITE_OK) {
        NSLog(@"连接成功");
    } else {
        NSString *error = [NSString stringWithFormat:@"错误结果代码:%d", result];
        NSLog(@"%@", error);
    }

 

    

    sqlite3_open()就是一个构造函数, 另外还有sqlite3_open16()和sqlite3_open_v2(), 他们的功能都是打开一个新的数据库的连接,所需参数如下所示。这些构造函数可以通过数据库文件名称参数来连接一个数据库。如果文件名参数是UTF-8编码格式的, 可以调用sqlite3_open()和sqlite3_open_v2(),   那么如果文件参数是 UTF-16编码的话就调用构造函数sqlite3_open16()。第二个参数就是返回的数据库操作句柄的指针地址。

    由下方的图可以看出sqlite3_open_v2()比sqlite3_open()多了两个参数,一个是int flags, 一个是const char *zVfs。 sqlite3_open_v2()的用法和sqlite3_open()类似,可以说前者是后者的加强版。sqlite3_open()是以前的旧方法,而sqlite3_open_v2()是后来改进的方法。

    参数flag,不同的值代表着打开数据库后可以获取的不同操作,类似于数据库的操作权限,下方是flag的值代表的操作权限。

    SQLITE_OPEN_READONLY 数据库是只读模式打开。如果数据库不存在,则返回一个错误。

    SQLITE_OPEN_READWRITE 数据库以读写的模式打开, 如果文件被操作系统设置为保护模式,那么就为只读模式。在这两种情况下的数据库必须已经存在,否则会返回一个错误。

    SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE 数据库以读写的模式打开, 如果数据库不存在,就创建一个。使用sqlite3_open()和sqlite3_open16()连接数据库时,默认的就是这种行为。

    如果sqlite3_open_v2()的第三个参数不包含上述三种结合中的一个的话,那么数据库的连接权限是未定义的。也就是说数据库不知道是读还是写,还是创建,所以操作数据库就没有意义了,所以上面必须选择一个参与“与”运算。

    SQLITE_OPEN_NOMUTEX 只要单线模式下没有设置编译的起始时间,就会在多线程模式下进行数据库的连接。

    SQLITE_OPEN_FULLMUTEX 在序列化的线程模式(在此模式中,SQLite能无约束地在多线程中安全使用)打开数据库连接,除非在编译时或者单线程之前选择起始时间。

    SQLITE_OPEN_SHAREDCACHE 可以使数据库连接适当的使用共享缓存模式,无论是否使用sqlite3_enable_shared_cache()启用共享缓存。

    SQLITE_OPEN_PRIVATECACHE 导致数据库连接不使用共享缓存模式,即使共享缓存模型可用。

 

    sqlite3_open_v2()第四个参数是sqlite3_vfs对象的名称,它定义了操作系统接口应该使用新的数据库连接。如果第四个参数是一个nil的话,那么就会使用默认sqlite3_vfs对象。下方是结构体sqlite3_vfs的具体内容:

 

    vfs: sqlite3_vfs对象的实例定义了一个SQLite核心和底层操作系统间的接口。“vfs”对象的名称代表“虚拟文件系统”。关于VFS的详解内容在这里:https://www.sqlite.org/vfs.html 有兴趣的小伙伴可以好好的搞一下。如果以后有时间的话在好好的介绍一下VFS。今天就不做过多的赘述了。第四个参数传入nil就会使用默认的sqlite3_vfs默认对象。

    关于VFS和sqlite3_vfs结构体的东西,如果以后有时间,在单独拿出来搞搞。了解VFS的结构和模式还是很有必要的。ok~今天打开并连接数据库,关于如何去通过接口去操作数据库就留在以后的博客中介绍吧。

    用到的数据库和sqliteAPI代码GitHub分享地址:https://github.com/lizelu/SQLiteResource

    在博客的最后呢,给出简单封装的打开数据库的方法:

/*******************************
 *功能:打开数据库
 *参数:databaseName -- 数据库名称
 *返回:数据库对象(sqlite3对象)
 *******************************/
+ (sqlite3 *) openDatabaseWithName: (NSString *)databaseName{
    
    //获取Sqllite文件的路径
    NSString *sqlPath = [[NSBundle mainBundle] pathForResource:databaseName ofType:@"sqlite"];
    
    //把路径转成C字符串
    const char * filePath = [sqlPath UTF8String];
    
    sqlite3 * database;
    
    //打开数据库
    int result = sqlite3_open(filePath, &database);
    
    if (result == SQLITE_OK) {
        return database;
    }
    
    return nil;

}

相关文章
|
4天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
23 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
1月前
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
143 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
2月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
90 11
|
2月前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
145 66
|
2月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
173 3
|
2月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
3月前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
3月前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
3月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
3月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
72 2

热门文章

最新文章

  • 1
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 2
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 3
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 6
    sqlite事务模型、性能优化tips、常见误区
  • 7
    SQLite是如何理解 SQL As Understood By SQLite
  • 8
    SQLite 删除语句和匹配条件 | 学习笔记
  • 9
    【转】sqlite3数据类型以及近似类型
  • 10
    SQLite Manager
  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    14
  • 2
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    28
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    34
  • 4
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    29
  • 5
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    23
  • 6
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    143
  • 7
    【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
    235
  • 8
    app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
    90
  • 9
    深入探索iOS开发中的SwiftUI框架
    145
  • 10
    ios样式开关按钮jQuery插件
    60