前言
iOS中的数据存储方式
- Plist(NSArray\NSDictionary)
- Preference(偏好设置\NSUserDefaults)
http://www.jianshu.com/p/459c15cf6ce2
- NSCoding(NSKeyedArchiver\NSkeyedUnarchiver)
- SQLite3
- Core Data(C语言操作的基础上增添面向对象,重量级)
1. SQLite
- 什么是SQLite
- SQLite是一款轻型的嵌入式数据库
- 它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了
- 它的处理速度比Mysql、PostgreSQL这两款著名的数据库都还快
- 什么是数据库
- 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库
- 数据库可以分为2大种类
- 关系型数据库(主流)
- 对象型数据库
- 常用关系型数据库
- PC端:Oracle、MySQL、SQL Server、Access、DB2、Sybase
- 嵌入式\移动客户端:SQLite
- 如何在程序运行过程中操作数据库中的数据
- 那得先学会使用SQL语句
- 什么是SQL
- SQL(structured query language):结构化查询语言
- SQL是一种对关系型数据库中的数据进行定义和操作的语言
- SQL语言简洁,语法简单,好学好用
- 什么是SQL语句
- 使用SQL语言编写出来的句子\代码,就是SQL语句
- 在程序运行过程中,要想操作(增删改查,CRUD)数据库中的数据,必须使用SQL语句
- SQL语句的特点
- 不区分大小写(比如数据库认为user和UsEr是一样的)
- 每条语句都必须以分号 ; 结尾
- SQL中的常用关键字有
- select、insert、update、delete、from、create、where、desc、order、by、group、table、alter、view、index等等
- 数据库中不可以使用关键字来命名表、字段
- SQLite的种类
- 数据定义语句(DDL:Data Definition Language)
- 包括create和drop等操作
- 在数据库中创建新表或删除表(create table或 drop table)
- 数据操作语句(DML:Data Manipulation Language)
- 包括insert、update、delete等操作
- 上面的3种操作分别用于添加、修改、删除表中的数据
- 数据查询语句(DQL:Data Query Language)
- 可以用于查询获得表中的数据
- 关键字select是DQL(也是所有SQL)用得最多的操作
- 其他DQL常用的关键字有where,order by,group by和having
2 Navicat
- Navicat是一款著名的数据库管理软件,支持大部分主流数据库(包括SQLite)
- 利用Navicat建立数据库连接
- 建表
- 查看DDL
- 执行SQL语句
3. SQLite编码 (增、删、改、查)
- 基本步骤
- 创建数据库文件
- 创建表
- 添加字段
- 添加记录
- 说明
- 获取沙盒路径
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *dbPath = [docPath stringByAppendingPathComponent:@"student.sqlite"];
2.定义数据库
只要调用sqlite3_open方法,系统就回自动去指定的路径加载sqlite文件,如果文件不存在就会自动创建数据库文件,并且打开数据库。如果数据库文件存在就会自动打开fileName:数据库文件的地址ppDb:已经打开的数据库
3. 打开数据库
int success = sqlite3_open(dbPath.UTF8String, &_db); ///&self.db &[self db] 错误写法
if (success == SQLITE_OK) {
NSLog(@"数据库打开成功");
//创建表
/*
需要执行SQL语句的数据库对象
需要执行的SQL语句
执行成功的回掉
回调函数的参数
错误信息
*/
char *error;
NSString *sql = @"CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,score REAL DEFAULT 0)";
/*不允许多线程同时操作,多个程序不能同时操作同一个数据库*/
success = sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, &error);
if (success == SQLITE_OK) {
NSLog(@"创建表成功");
}
else {
NSLog(@"创建表失败");
}
}
else {
NSLog(@"数据打开失败");
}
4. 插入
NSString *sql = @"INSERT INTO t_student(score,name) VALUES(100,‘tt‘);";
char *error;
int success = sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, &error);
if (success == SQLITE_OK) {
NSLog(@"插入成功");
}
else {
NSLog(@"插入失败");
}
5. 查询
//1. 准备查询
/*
需要查询的数据库
需要执行的查询语句
查询语句的长度,如果传递一个小于0的数系统会自动计算查询语句的长度
结果集对象
*/
sqlite3_stmt *stmt;
NSString *sql = @"SELECT * FROM t_student;";
int success = sqlite3_prepare_v2(self.db, sql.UTF8String, -1, &stmt, NULL);
if (success == SQLITE_OK) {
//2.取出查询的数据
// int row = sqlite3_step(stmt); //每次调用该方法都会跳到下一条记录
// if (sqlite3_step(stmt) == SQLITE_ROW)
while (sqlite3_step(stmt) == SQLITE_ROW) {
NSLog(@"有数据");
const unsigned char *name = sqlite3_column_text(stmt, 1);
double score = sqlite3_column_double(stmt, 2);
NSLog(@"%s,%.f",name,score);
}
}
6. 工具类封装
4. FMDB
- 什么是FMDB
- FMDB是iOS平台的SQLite数据库框架
- FMDB以OC的方式封装了SQLite的C语言API
- FMDB的优点
- 使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
- 对比苹果自带的Core Data框架,更加轻量级和灵活
- 提供了多线程安全的数据库操作方法,有效地防止数据混乱
- nFMDB的github地址
- https://github.com/ccgus/fmdb
- FMDB有三个主要的类
- FMDatabase
- 一个FMDatabase对象就代表一个单独的SQLite数据库
- 用来执行SQL语句
- FMResultSet
- 使用FMDatabase执行查询后的结果集
- FMDatabaseQueue
- 用于在多线程中执行多个查询或更新,它是线程安全的