数据持久化(存储)---数据存储
数据存储几种方式
1: 归档 重点 必会 常用于自动登录
2: NSdifault 本质就是(plist)文件
//沙盒路径:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingString:@"/data.db"];
3: 写文件
4: 数据库 FMDBDemo
第一步: 导入库中
第二步: 这时会有39个错误 这是我们要点击工程的蓝色标记 选择Bulid Phasses 选择第三项的LInK 选项 点击左边的下拉框, 选择下面的加号,搜索sql这个字符,把libsglite3这个字符添加到工程中就可以
// 对于一些复杂的数据, 我们一般情况下用数据库来存储
// 在移动开发中, 数据库用sqlite
// FMDB 是一个第三方库, 用来方便我们对sqlite数据库进行操作
// 数据库是用来存储一系列的复杂的数据的, 这些数据以键值的形式, 存在"表"中, 数据库中可以有无数张表
warning 创建和建表的顺序是不能过颠倒的 先建数据库,再建表才可以, 增,删,改,查 顺序是可以随便的 但也要注意程序 是一步步执行的
warning 当这个数据库还没有打开 就不能进行增、删、改、 可以进行查 但查出来的东西是空的 什么都没有
#warning FMDB 不方便去存储头像 和大文件 我们可以把头像或者大文件存到本地,然后把路径存到数据库中
/**创建数据库*/
- (void)createDataBase{
#warning 当这个数据库还没有打开 就不能进行增、删、改、 可以进行查 但查出来的东西是空的 什么都没有 所以 我们要进行
// 取数组的第0个元素 最好用 fristObject 因为不会蹦 没有元素就是nil
//数据库用.db结尾 命名规范
//获取数据
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingString:@"/data.db"];
NSLog(@"%@",path);
//在这个路径下如果有一个数据库,就直接读取这个数据库
//如果这个路径,没有数据库,那么就去新建一个数据库
self.dataBase = [[FMDatabase alloc] initWithPath:path];
//我们要对一个数据库进行操作,必须先要打开这个数据
//如果一个数据库能打开,就说明创建成功
// 打开 用open 关闭用close
if ([self.dataBase open]) {
NSLog(@"创建成功");
}
else{
//失败原因,可能路径写错了
NSLog(@"创建失败");
}
}
/**创建表*/
- (void)createTable{
#warning
//1.建表语句 create table 字符串大小写没有影响 表名:LQUser 键名字:ID, name, age
//建表第二个会把第一个覆盖掉 为了防止这个现象 在表名前添加 :if not exists
//键对应的值的类型,//默认为type (无类型,可以存任何类型数据) 不同的类型直接在键后面添加相应的类型即可
//为了防止有些name 的值是一样的 在 ID 后面直接 添加主键即可primary key 这样添加第二个部分相同属性的时候,不会被覆盖
// 建表语句 ↓如果表不存在 ↓表名 ↓键 ↓类型 ↓ 主键
// NSString *sql = @"create table if not exists LHYUser(ID integer primary key, name varchar(32), age integer,)";//默认为text
#warning 创建表格是要把数据库打开的
NSString *sql = @"create table if not exists LQUser(ID integer primary key, name varchar(32), age integer)";
BOOL ret = [self.dataBase executeUpdate:sql];
if (ret) {
NSLog(@"建表成功");
}
else{
NSLog(@"建表失败");
}
}
/**增*/
- (void)insertAction{
//增SQL
//给谁赋值 就再括号里面写上相应的键
//值values () 在这里面写上相应的值 不管是什么类型的值 都用?来表示
NSString *sql = @"insert into LQUser (ID,name,age) values (?, ?,?)";
//执行语句
//这里的ID 和 values 不能传基本数据类型 因为创建数据库的时候是integer类型
[self.dataBase executeUpdate:sql,@88,@"xiaoqiang",@56];
}
/**删*/
- (void)deleteAction{
//删除语句
//这条语句会删除数据库里面的所有数据
// NSString *sql = @"delete * from LQUser";
//为了选定哪个数据 我们要选定一些条件 where ID = ?
// ? 要英文字符
// 多个条件我们用 and 做拼接
//where name = ? and age = ?
NSString *sql = @"delete from LQUser where ID = ? ";
//执行删除
[self.dataBase executeUpdate:sql,@3];
}
/**改*/
- (void)updateAction{
//SQL 语句
// 用逗号,隔开
//改哪条 用where
//多条件也是用and连接
NSString *sql = @"update LQUser set name = ?, age = ? where ID = ?";
[self.dataBase executeUpdate:sql,@"xiaoyi",@999,@1];
}
/**查*/
- (void)selectTable{
#warning 查询的结果默认是按照主键升序的 我们也可以进行其他条件进行升序 例如 我们以age字段进行排列, 用 order by age 如果我们需要以降序排列,在最后添加一个desc
#warning 查询也可以进行条件查询,
//查询表里面所有的数据
NSString *sql = @"select *from LQUser order by age desc";
//执行一个查询的操作 executeQuery
//executeQuery 返回值是FMResultSet 类型
FMResultSet *set = [self.dataBase executeQuery:sql];
//FMResultSet 是一个数据的集合,里面存放的是查询到的所有数据
//如果想拿到其中的数据,只能遍历这个集合,一条条的拿
while (set.next) {
//通过键的名字,来获取对应的值
//写法一:
//NSString *ID = [set objectForColumnName:@"ID"];
//写法二 ID 的类型是NSNumber类型
NSInteger ID = [[set objectForColumnName:@"ID"] integerValue];
NSString *name = [set objectForColumnName:@"name"];
//通过键的下标,获取对应的值
//下标为建表的时候,声明的key的顺序,从0开始
NSNumber *age = [set objectForColumnIndex:2];
NSLog(@"查出来的结果");
//打印
NSLog(@"%zd,%@,%@",ID,name,age);
}
}
网友评论