以前没时间整理这方面的知识,现在苦逼公司倒闭了,整理一下,巩固知识,和需要的朋友一起学习...
好了,开怼.
一 .几种数据存储方式
iOS中数据存储的方式有以下几种:
- Plist: 特点:只能存储系统自带的数据类型,比NSDictionary;NSArray,自定义的对象无法存储
- Perference :偏好设置(NSUserDefaults) 特点:本质就是一个plist文件,只能存储系统自带的数据类型,不能存储自定义类型
- NSCoding: 特点:可以存储自定义的数据类型,但都是一次性的全数据操作.
- SQLite3: 特点:存储一些大批量数据,排序,统计等操作.
- Core Data : 特点 :对SQLite3的一层面向对象的封装,本质还是要转成为对应的SQL语句执行
SQLite 是一款轻型的嵌入式数据库,它占用资源非常低,在嵌入式设备中,几百k内存基本就够了,它的处理速度非常快.
二. 处理数据的软件(Navicat)
- Navicat 下载地址 上边有破解软件的详细步骤
- 简单使用
1.点击左上角是的连接,创建一个SQLite表
2.创建属性
增删改查大家可以自己摸索一下.
- DDL :数据定义语句(创建表)
- DML :数据操作语句(增,删,改)
- DQL :数据查询语句(就是查询)
三.简单操作
DDL: 简单约束
CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER);
CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER NOT NULL);
CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE, age INTEGER);
CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER DEFAULT 1);
DML:(数据的增删改)约束条件
/*插入数据*/
INSERT INTO t_student(age, score, name) VALUES ('28', 100, 'jonathan');
INSERT INTO t_student(name, age) VALUES ('lee', '28');
INSERT INTO t_student(score) VALUES (100);
/*删除数据*/
DELETE FROM t_student; //这是删除所有数据
DELETE FROM t_student WHERE name = 'cnw' age = 20;
DELETE FROM t_student WHERE name = 'qlt' and age >26 and score < 80;
/*修改指定数据*/
UPDATE t_student SET name = 'MM' WHERE age = 10;
UPDATE t_student SET name = 'WW' WHERE age is 7;
UPDATE t_student SET name = 'XXOO' WHERE age < 20;
UPDATE t_student SET name = 'NNMM' WHERE age < 50 and score > 10;
DQL:查询数据
/*查询*/
SELECT name, age, score FROM t_student;
SELECT * FROM t_student;
/*分页*/
SELECT * FROM t_student ORDER BY id ASC LIMIT 30, 10;
// id 升序排列,跳过30条数据取10条
四 . FMDB
- *FMDatabase * 提供 SQLite 数据库的类,用于执行 SQL 语句
- FMResultSet 用于查询数据
- FMDatabaseQueue 在多线程下查询和更新数据库用到的类
1 创建表
// 0.获取沙盒地址
NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 拼接路径
NSString * filePath = [path stringByAppendingPathComponent:@"person.sqlite"];
// 1. 加载数据库对象
self.db = [FMDatabase databaseWithPath:filePath];
// 2.打开数据库
if ([self.db open]) {
// 创建表(在FMDB框架中,增删改查销毁都统称为更新)
BOOL success = [self.db executeUpdate:@"create table if not exists t_person (id integer primary key autoincrement,name text not null,age integer,weight real default 120);"];
if (success) {
NSLog(@"创表成功");
}else{
NSLog(@"创表失败");
}
}else{
NSLog(@"打开失败");
}
2 插入数据
- (IBAction)insert {
// 在FMDB中可以用?当做占位符,但是:如果使用占位符,以后只能给占位符传递对象
BOOL success = [self.db executeUpdate:@"insert into t_person(name ,age,weight) values(?,?,?);",@"QLT",@"25",@"108"];
if (success) {
NSLog(@"插入成功");
}else{
NSLog(@"插入失败");
}
}
3 删除数据
- (IBAction)deleate {
BOOL success = [self.db executeUpdate:@"delete from t_person"];
if (success) {
NSLog(@"删除成功");
}else{
NSLog(@"删除失败");
}
}
4 修改数据
BOOL success = [self.db executeUpdate:@"update t_person set name = 'qlt' where weight = 108"];
if (success) {
NSLog(@"修改成功");
}else{
NSLog(@"修改失败");
}
5 查询数据
// FMResultSet结果集
FMResultSet * set = [self.db executeQuery:@"select id,name,age,weight from t_person;"];
if ([set next]) { // next 返回yes说明有数据
int ID = [set intForColumnIndex:0];
NSString * name = [set stringForColumnIndex:1];
double weight = [set doubleForColumnIndex:3];
NSLog(@"id = %d,name = %@,weight = %.1f",ID,name,weight);
}else{
NSLog(@"查询出错");
}
FMDatabaseQueue 比较方便使用,
// 1.创建一个FMDatabaseQueue对象
// 只要创建数据库队列对象, FMDB内部就会自动给我们加载数据库对象
self.queue = [FMDatabaseQueue databaseQueueWithPath:filePath];
//2 .执行操作
// 会通过block传递队列中创建好的数据库给我们
[self.queue inDatabase:^(FMDatabase *db) {
// 编写需要执行的代码
BOOL success = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, score REAL DEFAULT 1);"];
if (success) {
NSLog(@"创建表成功");
}else
{
NSLog(@"创建表失败");
}
}];
- 修改
- (IBAction)update {
[self.queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
[db executeUpdate:@"UPDATE t_person SET weight = 1500 WHERE name = 'zs';"];
NSArray *array = @[@"abc"];
array[1];
[db executeUpdate:@"UPDATE t_person SET weight = 500 WHERE name = 'ls';"];
}];
}
- 查找
[self.queue inDatabase:^(FMDatabase *db) {
// FMResultSet结果集, 结果集其实和tablevivew很像
FMResultSet *set = [db executeQuery:@"SELECT id, name, score FROM t_student;"];
while ([set next]) { // next方法返回yes代表有数据可取
int ID = [set intForColumnIndex:0];
// NSString *name = [set stringForColumnIndex:1];
NSString *name = [set stringForColumn:@"name"]; // 根据字段名称取出对应的值
double score = [set doubleForColumnIndex:2];
NSLog(@"%d %@ %.1f", ID, name, score);
}
}];