IOS swift版 sqlite3详解

本文详细介绍了SQLite3在iOS应用中的使用,包括SQLite的本地持久化存储、主要函数、Swift与C的类型转换、数据库操作、查询、事务处理、ALTER TABLE操作、索引、数据类型处理及查询效率优化。还提到了SQLite3加密和一些常见问题。
摘要由CSDN通过智能技术生成

IOS中的SQLite3的封装与详细应用

SQLite是一个开源的嵌入式关系数据库,特点是易使用、高效、安全可靠、可移植性强。

IOS中的本地持久化存储

NSUserDefault:一般用于存储小规模数据、业务逻辑弱的数据。

keychain: 苹果提供的可逆存储,因为有着只要app不重装系统、可以同步iCloud的特性,一般用来对用户的标识符或者一些需要加密的小数据进行存储。

归档:主要原理是对数据进行序列化、反序列化操作后,写入、读出数据。方便便捷易使用,缺点查询、更改数据耗时耗性能。

数据库:主要的有三种sqlite3、core data、realm。其中core data只是xcode对sqlite的界面化的封装原理相似,realm官方文档.

关于sqlite本文将主要介绍。

SQLite3中主要函数介绍

sqlite3_open(文件路径,sqlite3 **):文件名若不存在,则会自动创建

sqlite3_close(sqlite3 *):关闭数据库

sqlite3__finalize(sqlite3_stmt *pStmt): 释放数据库

sqlite3_errmsg(sqlite3*):输出数据库错误

sqlite3__exec(sqlite3 ,const char *sql, sqlite3_callback,void ,char **errmsg):

参数1:open函数得到的指针。

参数2:一条sql语句

参数3:sqlite3_callback是回调,当这条语句执行后,sqlite3会调用你提供的这个函数,回调函数

参数4:void *是自己提供的指针,可以传递任何指针到这里,这个参数最终会传到回调函数里面,如果不需要传到回调函数里面,则可以设置为NULL

参数5:错误信息,当执行失败时,可以查阅这个指针

sqlite3_prepare_v2(sqlite3 *db,const char *zSql, int nByte,sqlite3_stmt **ppStmt,const char **pzTail):

参数3:表示前面sql语句的长度,如果小于0,sqlite会自动计算它的长度

参数4:sqlite3_stmt指针的指针,解析后的sql语句就放在该结构里

参数5:一般设为0

sqlite3_step(sqlite3_stmt*):

参数为sqlite3_prepare_v2中的sqlite3_stmt
返回SQLITE_ROW 表示成功

sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void()(void)):

参数1:sqlite3_prepare_v2中的sqlite3_stmt

参数2:对应行数

参数3:对应行数的值

参数4:对应行数的值的长度,小于0自动计算长度

参数5:函数指针,主要处理特殊类型的析构

sqlite3_key( sqlite3 *db, const void *pKey, int nKey)

参数2:密钥

参数3:密钥长度

swift与c的类型转换

int => CInt

char => CChar / CSignedChar

char* => CString

unsigned long = > CUnsignedLong

wchar_t => CWideChar

double => CDouble

T* => CMutablePointer

void* => CMutableVoidPointer

const T* => CConstPointer

const void* => CConstVoidPointer

等等
参考地址

创建或者打开数据库

程序中‘db’不能为空,如果为空,表示打开数据库失败或者关闭了数据库。

@discardableResult   private func openDB() -> Bool{

    if db == nil {
        let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] + "/\(DB_NAME)"
        print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])
        if sqlite3_open(path.cString(using: String.Encoding.utf8)!,&db) != SQLITE_OK {
            closeDb()
            return false
        }else {
            //对数据库进行加密
            sqlite3_key(db, SAFE_KEY.cString(using: String.Encoding.utf8), Int32(SAFE_KEY.characters.count))
        }
        sqlite3_busy_handler(db, { (ptr,count) in

            usleep(500000)//如果获取不到锁,表示数据库繁忙,等待0.5秒
            print("sqlite is locak now,can not write/read.")
            return 1   //回调函数返回值为1,则将不断尝试操作数据库。

        }, &db)
    }


        return true
    }

通过sql执行数据库操作

由于防止多线程操作数据库,每次执行数据库操作添加同步锁。
sqlite3_exec函数基本上支持所有的数据库执行语句除了含有特殊类型的数据(二进制),含有特殊类型的数据会采用另一种方式处理下面会阐述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值