使用iOS原生sqlite3框架对sqlite数据库进行操作 一、引言 sqlite数据库是一种小型数据库,由于其小巧与简洁,在移动开发领域应用深广,sqlite数据库有一套完备的sqlite...在iOS的原生开发框架中可以对sqlite数据库进行很好的支持,这个框架中采用C风格且通过指针移动进行数据的操作,使用起来有些不便,我们可以对一些数据库的常用操作进行一些面向对象的封装。... SQLITE_ERROR 1 /* SQL数据库错误或者丢失*/ #define SQLITE_INTERNAL 2 /* SQL内部逻辑错误 */ #define SQLITE_PERM... */ #define SQLITE_READONLY 8 /* 企图向只读属性的数据库中做写操作 */ #define SQLITE_INTERRUPT 9 /* 通过sqlite3... */ #define SQLITE_CANTOPEN 14 /* 不法打开数据库文件 */ #define SQLITE_PROTOCOL 15 /* 数据库锁协议错误 */ #define
======================= 问题描述: SQLite数据库同一时刻只允许单个线程写入,很多服务端程序会开很多线程,每个线程为一个客户端服务,如果有多个客户端同时发起写入请求,在服务端会因为某个线程尚未写入完成尚未解除对数据库的锁定而导致其他线程无法在限定的时间内完成写入操作而抛出异常...如果编写高并发的服务端程序,一定要对数据库的写入操作进行有效管理,常用的方案有两个:1)使用锁机制使得多个线程竞争进入临界区,确保同一时刻只有一个线程执行写入数据库的代码;2)连接数据库时设置参数timeout...,设置当数据库处于锁定状态时最长等待时间,sqlite3.connect()函数的参数timeout默认值为5秒,不适合服务端程序。
系统:Windows 7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3.2 这个系列讲讲Python对sqlite3...的操作 本文介绍: 将已知数据写入数据库 Part 1:示例说明 ?...当我们建立一个数据库后,很多时候需要将原来Excel的数据写入到数据库中,例如一些常数项信息等 有多种方法可以实现,如数据库管理软件自带的导入功能,遗憾的是大部分都不好用; 还有就是本文提到的方法,撰写代码...数据库内容 ? Part 2:代码 ?...import sqlite3 import os import pandas as pd current_address = os.path.dirname(os.path.abspath(__file
iOS开发的基本上都知道fmdb,自从用了fmdb之后都忘记了原生的sqlite3操作了(fmdb太好用了)。...SQLite是一个轻量级的关系数据库。...SQLite最初的设计目标是用于嵌入式系统,TA占用资源非常少,在嵌入式设备中,只需要几百K的内存就够了,目前应用于Android、iOS、Windows Phone等智能手机。...SQLite支持的数据类型 类型 说明 INTEGER 有符号整型 REAL 浮点型 TEXT 字符串类型,采用UTF-8 UTF-16编码,在iOS中注意转换 BLOB 大二进制对象类型,能够存放任何二进制数据...创建数据库 创建数据库前需要加入libsqlite3.0.tbd依赖以及引入sqlite3.h头文件#import sqlite3.h> 1.使用sqlite3_open函数打开数据库 2.使用sqlite3
nil) { handle = [[DataBaseHandle alloc]init]; } } return handle; } 写一个私有的方法,返回数据库的路径...NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"db.sqlite..."]; } 创建一个Person表格 //创建一个Person表格 (void)creatPersonTable{ //初始化数据库对象 self.db = [FMDatabase...databaseWithPath: [self dbpath]]; //打开数据库 BOOL isOpen = [self.db open]; if (isOpen) { NSLog(...p.age = @"20"; //调用插入person的方法 // [[DataBaseHandle shareDateBaseHandle]insertPersonTable:p]; //接收数据库返回的查询结果
作者:张三华 前言 随着微信iOS客户端业务的增长,在数据库上遇到的性能瓶颈也逐渐凸显。在微信的卡顿监控系统上,数据库相关的卡顿不断上升。...SQLite提供了Busy Retry的方案,即发生阻塞时,会触发Busy Handler,此时可以让线程休眠一段时间后,重新尝试操作。重试一定次数依然失败后,则返回SQLITE_BUSY错误码。...下次打开数据库,并写入数据时,WAL文件需要重新增长。而对于文件系统来说,这就意味着需要消耗时间重新寻找合适的文件块。...下次数据库打开时,SQLite会识别到WAL文件不可用,重新从头开始写入。 保留WAL文件大小后,每个数据库都会有这约3.9MB的额外空间占用。如果数据库较多,这些空间还是不可忽略的。...本次尝试了仅对SQLite原有的方案进行优化,而市面上还有许多优秀的数据库,如LevelDB、RocksDB、Realm等,它们采用了和SQLite不同的实现原理。
前言 随着微信 iOS 客户端业务的增长,在数据库上遇到的性能瓶颈也逐渐凸显。在微信的卡顿监控系统上,数据库相关的卡顿不断上升。...重试一定次数依然失败后,则返回SQLITE_BUSY错误码。 3. SQLite Busy Retry 方案的不足 Busy Retry 的方案虽然基本能解决问题,但对性能的压榨做的不够极致。...下次打开数据库,并写入数据时,WAL 文件需要重新增长。而对于文件系统来说,这就意味着需要消耗时间重新寻找合适的文件块。...下次数据库打开时,SQLite 会识别到 WAL 文件不可用,重新从头开始写入。 保留 WAL 文件大小后,每个数据库都会有这约3.9MB的额外空间占用。如果数据库较多,这些空间还是不可忽略的。...本次尝试了仅对 SQLite 原有的方案进行优化,而市面上还有许多优秀的数据库,如 LevelDB、RocksDB、Realm 等,它们采用了和 SQLite 不同的实现原理。
分享内容简介: SQLite是微信iOS选用的数据库,随着微信iOS客户端业务的增长,在重度用户的场景下,性能瓶颈逐渐显现。...当一个进程的数据库操作结束时,无法通过锁来第一时间通知到其他进程进行重试。因此只能退而求其次,通过多次休眠来进行尝试。 1.5 新的方案 搞清楚了 SQLite 并发的实现,我们就是可以开始改造了。...下次数据库打开时, SQLite 会识别到 WAL 文件不可用,重新从头开始写入。 为 WAL 添加 mmap 的支持 有了上面两个优化,整体性能就会提升不少了。...这次也只尝试了对 SQLite 原有的方案进行优化,而市面上还有许多优秀的数据库,如 LevelDB、RocksDB、Realm 等,它们采用了和 SQLite 不同的实现原理。...这个是数据库损坏,SQLite 是以B树结构存储的,如果某一个节点发生损坏,可能导致无法读取数据。损坏的原因多种多样,如断电、文件系统错误、硬盘损坏等。据我所知很多产品都出现了类似问题。
为什么要搞一搞SQLite的C语言接口规范呢? 因为在做iOS开发中难免会遇到操作数据库的情况,你可以使用第三方的FMDB等,或者使用CoreData。...之前看过几本iOS开发的书籍,也包括某某出版社出版的《精通iOS开发》,虽然网上评价不错,但看书的时候总是不来感。...参数flag,不同的值代表着打开数据库后可以获取的不同操作,类似于数据库的操作权限,下方是flag的值代表的操作权限。 SQLITE_OPEN_READONLY 数据库是只读模式打开。...如果数据库不存在,则返回一个错误。 SQLITE_OPEN_READWRITE 数据库以读写的模式打开, 如果文件被操作系统设置为保护模式,那么就为只读模式。...在这两种情况下的数据库必须已经存在,否则会返回一个错误。
plist中,iOS的老版本也可以调用synchronize方法手动同步,避免写入数据后系统还没将其写入plist而用户退出应用(最新的iOS版本已经不需要)。...SQLite3基于C语言实现,OC可以直接兼容,iOS系统也自带了SQLite3,提供的方法是直接操作数据库。...FMDB FMDB对SQLite数据库进行封装,开放OC的接口便于开发者接入,是很普遍使用的iOS第三方数据库。 GitHub仓库地址,也可以使用pod接入。...SQLite3是iOS中最常用的数据库,通常我们会第三方封装库FMDB来操作,简化代码逻辑。 如果涉及到安全相关的敏感数据,则不应该保存在文件、数据库等可以被抓取的地方。...看详细的编译错误并没有额外的信息,仍是符号冲突。
之前一篇文章《微信 SQLite 数据库修复实践》介绍了微信对SQLite数据库修复以及降低损坏率的实践, 这次再深入介绍一下微信数据库修复的具体方案和发展历程。...Dump 方案本质上是尝试从坏DB里读出信息,这个尝试一般来说会出现两种结果: DB的基本格式仍然健在,但个别数据损坏,读到损坏的地方SQLite返回 SQLITE_CORRUPT错误, 但已读到的数据得以恢复...同时,因为我们的系统是只读的, 写入恢复数据到新 DB 只要直接调用 SQLite 接口即可,因而可以省略同样比较复杂的B-tree平衡、Journal和同步等逻辑。...即便如此,假如上面的所有尝试都失败,最后还是会尝试Dump恢复。 (图: 恢复方案组合) 上面说的三种修复方法,原理上只涉及到SQLite文件格式以及基本的文件系统,是跨平台的。...更多信息请看往期文章: 《微信移动端数据库组件WCDB系列(一)-iOS基础篇》 《微信 SQLite 数据库修复实践》 ---- 如果您觉得我们的内容还不错,就请转发到朋友圈,和小伙伴一起分享吧~
第9讲 读取excel数据并写入sqlite数据库中 本期主要实操讲解如何实现读取excel数据并写入到sqlite数据库中。...FileMode.Open 打开现有的文件,流指向文件的开头 FileAccess.Read 打开文件,用于只读 var wk = new HSSFWorkbook(fs); 把文件中的数据写入wk中...选择我们新建的一个student数据库。 创建一个表 创建一个表包含name、age、sex三个字段。...点击保存,并给表取个student1名字 查询表数据,目前是空数据 下面将excel数据写入到sqlite数据库中,需要安装System.Data.sqlite。...数据读取写入到excel中以及将连接数据库语句进行封装以方便多次使用时的复用功能。
作者:johnwhe 前言 长久以来SQLite DB都有损坏问题,从Android、iOS等移动系统,到Windows、Linux 等桌面系统都会出现。...之前一篇文章《微信 SQLite 数据库修复实践》介绍了微信对SQLite数据库修复以及降低损坏率的实践, 这次再深入介绍一下微信数据库修复的具体方案和发展历程。...Dump 方案本质上是尝试从坏DB里读出信息,这个尝试一般来说会出现两种结果: DB的基本格式仍然健在,但个别数据损坏,读到损坏的地方SQLite返回SQLITE_CORRUPT错误, 但已读到的数据得以恢复...同时,因为我们的系统是只读的, 写入恢复数据到新 DB 只要直接调用 SQLite 接口即可,因而可以省略同样比较复杂的B-tree平衡、Journal和同步等逻辑。...本文来源于:WeMobileDev 微信公众号 相关推荐 微信移动端数据库组件WCDB系列:iOS基础篇(一) 微信移动端数据库组件WCDB系列:WINQ原理篇(三) 微信移动端数据库组件WCDB系列
对原始内容做备份后,才能写入修改后的内容到 DB 主文件中,当写入操作完成,用户提交事务后,SQLite 清空 -journal 的内容,至此完成一个完整的写事务。 ?...由于读操作只读取 DB 主文件和 -wal 前面没在写的部分,不需要读取写操作正在写到一半的内容,WAL 模式下读与写操作的并发由此实现。...图:WAL 工作模式 基于 WAL 的基本工作方式,我们很容易想到两个优化点: 写入 -wal 文件时不进行 fsync 操作,因为 -wal 文件损坏只影响新写入的没 Checkpoint 部分数据而非整个数据库损坏...考虑到我们在独立线程做 Checkpoint,频繁 Checkpoint 的耗时可以掩盖掉,而维持 -wal 较小的话可以最优化读速度,所以首先尝试的策略是将阈值设为0,也就是一有任何提交,马上尝试 Checkpoint...iOS 版本默认开启 WAL 与异步 Checkpoint;Android 版本由于要保持与官方接口一致,默认不开启 WAL 与 Checkpoint,可以通过以下方式开启。
简介 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。它的设计目标是嵌入式的,目前Android和iOS的设备内置的都是SQLite数据库。...MMEDIATE 由BEGIN开始的IMMEDIATE事务会尝试获取RESERVED锁。如果成功,BEGIN IMMEDIATE保证没有别的连接可以写数据库。...错误。...这时你就可以对数据库进行修改操作了,但是你还不能提交,当你 COMMIT时,会返回SQLITE_BUSY错误,这意味着还有其它的读事务没有完成,得等它们执行完后才能提交事务。...在写的时候,SQLite将之写入到WAL文件中即可,但是必须保证独占写入,因此写写之间不能并行执行。
要防止文件句柄被误用时写坏数据库,一个简单的想法是尽量打开数据库文件时都是只读打开,这样外部逻辑就无法用这个句柄来更改数据库了。对于大部分数据库组件来讲,要实现这点,还是挺复杂。...打开句柄时要能够判断下这个操作会不会修改数据库,只读打开之后还要遇到更改数据库的操作时,又要重新打开数据库文件句柄。...SQLite 后来发现如果磁盘缓存是随机写入到磁盘,那可能存在 WAL 文件头以外的内容已经写入到磁盘但是文件头还没更新的情况,会导致数据库损坏(具体见https://sqlite.org/src/info...iOS 微信的数据库卡顿的头号共性问题。...在写入 WAL 文件的第一个 frame,如果发现 WAL 文件没创建或者文件头没有重写时,才尝试 sync 重写文件头。
好很多,说明Lucene索引的文件格式很有优势,但是微信没有只读取命中数量的应用场景,Lucene的其他性能数据跟SQLite的差距不明显。...SQLite FTS3和FTS5的大部分性能很接近,FTS5索引的生成耗时比FTS3高一截,这个有优化方法。 综合考虑这些因素,我们选择SQLite FTS5作为iOS微信全文搜索的搜索引擎。...假设业务每次写入量为M,写入了N次,那么在merge执行完整之后,数据库实际写入量为MN(log2(N)+1)。业务批量写入,提高M也可以减小总写入量。...所以我们最终的表格式是这样: 1.4 索引文件大小优化数据 下面是iOS微信优化前后的平均每个用户的索引文件大小对比: 2、索引更新逻辑优化 为了将全文搜索逻辑和业务逻辑解耦,iOS微信的FTS索引是不保存在各个业务的数据库中的...而且SQLite是不支持并行写入的,删除索引的性能也会间接影响到索引的写入速度,会为索引更新引入不可控因素。
近期微信团队对 IOS 微信的全文搜索技术进行了一次全面升级,本文将分享其选型与优化思路,详细解析全文搜索的应用数据库表格式、索引更新和搜索逻辑的优化细节。希望本文对你有帮助。...但是微信没有只读取命中数量的应用场景,Lucene 的其他性能数据跟 SQLite 的差距不明显。...综合考虑这些因素,我们选择 SQLite FTS5 作为 IOS 微信全文搜索的搜索引擎。...假设业务每次写入量为 M 、写入了 N 次,那么在 merge 执行完整之后,数据库实际写入量为**MN(log2(N)+1)** 。业务批量写入,提高 M 也可以减小总写入量。...,iOS 微信的 FTS 索引是不保存在各个业务的数据库中的,而是集中保存到一个专用的全文搜索数据库,各个业务的数据有更新之后再异步通知全文搜索模块更新索引。
0.前言 SQLite是一款开源、轻量级、跨平台的数据库,无需server,无需安装和管理配置。它的设计目标是嵌入式的,所以很适合小型应用,也是Qt应用开发种常用的一种数据库。...SQLite在单个文件上运行,在打开连接时必须将其设置为数据库名称。如果该文件不存在,SQLite将尝试创建它。。 2.初相遇 /* * ... ......设置了驱动及连接名称后,就是设置数据库文件的名称/路径,因为SQLite不需要用户名和密码,接下来直接就可以通过open和close函数来打开关闭该数据库了。...简要说来,full写入速度最慢,但保证数据是安全的,不受断电、系统崩溃等影响,而off可以加速数据库的一些操作,但如果系统崩溃或断电,则数据库可能会损毁。...默认是文件锁, Qt 中 SQLite 默认是以多线程读写模式打开,如果同时写入就会出现写入错误: 可以将写操作上锁,但是实测线程中循环写入时,只读打开去查询也是会阻塞很久,毫秒到几秒不等,这时候就得把超时设置长一点
领取专属 10元无门槛券
手把手带您无忧上云