简述
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.youkuaiyun.com/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)</