iOS使用的数据库 是 轻量级的sqlite
数据库 里面 实际上就是一张一张的table
//开发中本地持久化存储的 就是数据模型对象中的属性数据
每张表中 每一列就是一个字段 (数据模型对象的属性/类字段)
表中的每一行我们称为 一条记录 (一个数据模型对象的信息)
数据库 要1.创建数据库文件 2.sql语句创建表 3.sql语句增删改查
代码操作数据库 用底层C语言(sqlite3)操作,但是C语言操作起来比较麻烦我们开发中常用 一个Fmdb的第三方开源库进行 操作
fmdb 实际上就是对底层C语言(sqlite3)的封装
fmdb 步骤
1.导入库 fmdb 和 libsqlite3.dylib
2.导入 头文件 #import "FMDatabase.h"
3.创建 数据库对象 FMDatabase
3.1 创建数据库文件
3.2 sql语句创建表
3.3 sql语句增删改查
*/
- (void)viewDidLoad
{
[super viewDidLoad];
[self creatDatabase];
//增加 10个数据
//[self insertData];
[self findData];
[self findCount];
//删除
//[self deleteDataWithName:@"xiaohong9"];
//修改
[self updateAge:100 withName:@"xiaohong0"];
[self findData];
[self findCount];
}
- (void)creatDatabase {
//创建FMDatabase对象 根据传入数据库文件进行
//数据库文件 都放在 沙盒中
NSString *docmentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *dataFilePath = [docmentsPath stringByAppendingPathComponent:@"user.sqlite"];
//user.sqlite /user.db
_database = [[FMDatabase alloc] initWithPath:dataFilePath];
//打开数据库
if ([_database open]) {//打开的时候如果 没有指定的数据库文件 那么会创建新的并且打开,如果有 那么就直接打开
//根据传入的路径进行打开,
//打开成功 进行创建表
[self creatTable];
}else {
//获取最近一次错误
NSLog(@"open failed:%@",[_database lastErrorMessage]);
}
}
#pragma mark - 创建表
- (void)creatTable {
//写一个sql 语句
//写成 oc的字符串 然后调用相关的函数来执行
/*
CREATE TABLE Person (
serial integer Primary Key Autoincrement,
name Varchar(256) DEFAULT NULL,
age integer,
score Double DEFAULT NULL)
*/
NSString *sql = @"create table if not exists user(serial integer Primary Key Autoincrement,name Varchar(256),age integer,time date,image blob)";
//执行sql 语句
BOOL isSuccess = [_database executeUpdate:sql];
if (isSuccess) {
NSLog(@"创建表成功");
}else{
NSLog(@"create table failed!%@",[_database lastErrorMessage]);
}
}
/*
执行sql语句只有两个函数
//只执行查询 语句 "select ...."
- executeQuery:<#(NSString *), ...#>
执行 增删改 操作的语句 创建表的语句
- executeUpdate:
*/
- (void)insertData {
//增加10个数据
//sql语句 中的占位符 用 ?
//?对应的只能是对象地址
//类似于 %@
NSString *sql = @"insert into user (name,age,time,image) values (?,?,?,?)";
for (NSInteger i = 0; i < 10; i++) {
NSString *nameStr = [NSString stringWithFormat:@"xiaohong%d",i];
NSInteger age = arc4random()%8+18;
//把一个png的图片转化为二进制 无损转换
NSData *data = UIImagePNGRepresentation([UIImage imageNamed: @"Mole01"]);
//把jpg 转化为二进制 有损 转换 第二个参数 写 0--1
//NSData *data1 = UIImageJPEGRepresentation([UIImage imageNamed: @"back2.jpg"], 1);
//执行sql语句
BOOL isS = [_database executeUpdate:sql,nameStr,@(age),[NSDate date],data];
if (!isS) {
NSLog(@"insert failed:%@",[_database lastErrorMessage]);
}
}
}
#pragma mark - 查找
- (void)findData {
NSString *sql = @"select * from user";
//执行查询
//返回一个 结果集合
//结果在FMResultSet的对象
//查询 集合 有可能有 多条记录
FMResultSet *rs = [_database executeQuery:sql];
// 1 2 3 4 .. 10
//循环执行过程:第一次循环 遍历 第1条记录 第二次循环遍历第二条记录 依次类推 直到最后没有了记录 循环结束
while ([rs next]) {
//获取结果指定列的值
NSString *name = [rs stringForColumnIndex:1];
//根据字段名获取
NSString *name1 = [rs stringForColumn:@"name"];
NSLog(@"name:%@ %@",name,name1);
NSLog(@"age%d",[rs intForColumn:@"age"]);
NSLog(@"date:%@",[rs dateForColumn:@"time"]);
NSData *data = [rs dataForColumn:@"image"];
UIImage *image = [UIImage imageWithData:data];
NSLog(@"image:%@",image);
}
}
#pragma mark - 查找 多少记录
- (void)findCount {
//查询 总共有 多少条记录
NSString *sql = @"select count(*) from user";
FMResultSet *rs = [_database executeQuery:sql];
while ([rs next]) {
//有多少条记录 只有一条记录 只有一列 count(*)
NSLog(@"count:%d",[rs intForColumnIndex:0]);
}
}
#pragma mark - 删除
- (void)deleteDataWithName:(NSString *)name {
//根据名字删除
NSString *sql = @"delete from user where name = ?";
BOOL ret = [_database executeUpdate:sql,name];
if (!ret) {
NSLog(@"delete Failed :%@",[_database lastErrorMessage]);
}
}
#pragma mark - 修改
- (void)updateAge:(NSInteger)newAge withName:(NSString *)name{
NSString *sql = @"update user set age = ? where name = ?";
BOOL ret = [_database executeUpdate:sql,@(newAge),name];
if (!ret) {
NSLog(@"update failed:%@",[_database lastErrorMessage]);
}
}