iOS数据持久化2-SQLite

本文详细介绍了在iOS应用中使用SQLite进行数据持久化的步骤,包括添加SQLite库、配置Swift环境、创建和打开数据库、执行查询、修改数据等操作。通过Swift和Objective-C代码示例,展示了如何进行数据的增删查改操作。
摘要由CSDN通过智能技术生成
简述

SQLite提供了对SQL-92标准的支持,支持多表、索引、事务、视图、触发,SQLite是无数据类型的数据库,就是字段不用指定类型。

虽然SQL可以忽略数据类型,但从编程规范来说,最好还是在创建表时指定数据类型,表明这个字段的含义,便于理解和阅读。常见数据类型如下:
(1)INTEGRR,有符号的整数。
(2)REAL,浮点。
(3)TEXT,字符串,采用UTF-8和UTF-16字符编码。
(4)BLOB,二进制大对象,能够存放任何二进制数据。
SQLite中没有Boolean类型,可以采用整数0和1代替。SQLite中也没有日期和时间类型,可以用TEXT、REAL、INTEGER存储。

添加SQLite库

选择工程中的TARGETS->Build Phases->Link Binary With Libraries->点击添加->从弹出界面中选择libsqlite3.0.tbd或libsqlite3.tbd->点击Add按钮。

配置Swift环境

如果采用Swift语言开发,则会复杂些,因为SQLit API基于C语言的,Swift语言想要调用C语言API,需要桥接头文件。
配置方法
转载:https://blog.csdn.net/liuchuo/article/details/53446974

创建数据库

创建数据库需要经过3个步骤
(1)使用sqlite3_open函数打开数据库。
(2)使用sqlite3_exec函数执行Create Table语句,创建数据库表。
(3)使用sqlite3_close函数释放资源。
例:
Swift代码

// An highlighted block
//NoteDAO.swift文件
import Foundation

let DBFILE_NAME="NotesList.sqlite3"

public class NoteDAO{
   
	//COpaquePointer类型,映射到C指针类型
	private vardb:COpaquePointer=nil
	//私有DateFormatter属性
	private var dateFormatter=DateFormatter()
	//私有沙箱目录中的属性列表文件路径
	private varplistFilePath:String!
	
	//初始化文件
	private func crateEditableCopyOfDatabaseIfNeeded(){
   
		//将NSString类型转换为C接受的char*类型数据
		let cpath=self.plistFilePath.cString(using:String.Encoding.utf8)
		//打开数据库,第一个参数是数据库文件的完整路径,需要注意的是,在SQLite3函数中,接受的是char*类型的数据。第二个参数为sqlite3指针变量db的地址。返回值是整数类型,在SQLite3中,定义了很多常量,返回值等于常量SQLITE_OK,说明创建成功
		if sqlite3_open(cpath!,&db)!=SQLTIE_OK{
   
			NSLog("数据库打开失败!")
		}else{
   
			//创建表的SQL语句,大概意思是在表Note不存在时创建,否则不创建
			let sql="CREATE TABLE IF NOT EXISTS Note(cdate TEXT PRIMAPY KEY,content TEXT)"
			//将Swift的NSString类型,转换为char*类型。
			let cSql=sql.cStringUsingEncoding(NSUTF8StringEncoding)
			//执行SQL语句
			if(sqlite3_exec(db,cSql!,nil,nil,nil)!=SQLITE_OK){
   
				NSLog("表创建失败!")
			}
		}
		//释放资源
		sqlite3_close(db)
	}
}

ObjectiveC代码

// An highlighted block
//NoteDAO.m
#import "NoteDAO.h"
#import "sqlite3.h"
#define DBFILE_NAME @"NotesList.sqlite3"

@interface NoteDAO(){
   
	//生命C指针类型变量db
	sqlite3 *db;
}
@property(nonatomic,strong)NSDateFormatter *dateFormatter;
@property(nonatomic,strong)NSString *plistFilePath;
@end
@implementation NoteDAO
-(void)createEditableCopyOfDatabaseIfNeeded{
   
	//将NSString类型,转换为c接受的char*类型
	const char *cpath=[self.plistFilePath UTF8String];
	//打开数据库
	if(sqlite3_open(cpath,&db)!=SQLITE_OK){
   
		NSLog(@"数据库打开失败!");
	}else{
   
		NSString *sql=[NSStirng stringWithFormat:@"CREATE TABLEIF NOT EXISTS Note(cdate TEXT PrIMARY KEY,content TEXT);"];
		//将NSString类型,转换为c接受的char*类型
		const char *cSql=[sqlUTF8String];
		//执行SQL语句
		if(sqlite3_exec(db,cSql,NULL,NULL,NULL)!=SQLTIE_OK){
   
			NSLog(@"表创建失败!");
		}
	}
	//释放资源
	sqlite3_close(db);
}
@end
查询数据

数据查询一般带有查询条件,这可以使用SQL语句的where子句实现。在程序中需要动态绑定参数给where子句。具体查询步骤如下:
(1)使用sqlite3_open函数,打开数据库。
(2)使用sqlite3_prepare_v2函数,预处理SQL语句。
(3)使用sqlite3_bind_text函数,绑定参数。
(4)使用sqlite3_step函数,执行SQL语句,遍历结果集。
(5)使用sqlite3_column_text等函数提取字段数据。
(6)使用sqlite3_finalize和sqlite3_close函数释放资源。

例1:有条件查询
Swift代码

// An highlighted block
public func findById(_ model:Note)->Note?{
   
	let cpath=self.plistFilePath.cString(using:String.Encoding.utf8)
	if(sqlite3_open(cpath!,&db)!=SQLITE_OK{
   
		NSLog("数据库打开失败!")
	}else{
   
		let sql="SELECT cdate,content FROM Note WHERE cdate=?"
		let cSql=sql.cString(using:String.Encoding.utf8)
		var statement:OpaquePointer?=nil
		//预处理过程
		//预处理的目的是将SQL变异成二进制代码,提高SQL语句的执行速度。sqlite3_prepare_v2函数第三个参数代表全部SQL字符串的长度;第四个参数是sqlite3_stmt指针的地址,他是语句对象,可以通过该语句对象执行SQL语句;第五个参数是SQL语句没有执行的部分语句。
		if sqlite3_prepare_v2(db,cSql!,-1,&statement,nil)==SQLITE_OK{
   
			//准备参数
			let strDate=self.dateFormatter.string(from:model.date as Date)
			let cDate=strDate.cString(using:String.Encoding.utf8)</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值