// colum/列/字段
// row/行/记录
// 主键的作用是唯一标识一条记录
// sql语句注意:不区分大小写,以分号结束(不要分号也行?)
// 如果增加字段,可能要指定数据类型,SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型。
http://www.cnblogs.com/shenliang123/archive/2012/04/07/2435908.html
FMDB框架的3大核心类:
1.FMDatabase 一个FMDatabase对象就代表一个单独的SQLite数据库 用来执行SQL语句
2.FMResultSet 使用FMDatabase执行查询后的结果集
3.FMDatabaseQueue 用于在多线程中执行多个查询或更新,它是线程安全的
先声明两个必须变量:
{ NSString *path; //数据库的存储路径 } @property (nonatomic,strong)FMDatabase *dataBase;
1. 创建数据库
//1.创建一个数据库文件存放的位置路径 path=[NSHomeDirectory() stringByAppendingString:@"/Documents/users.db"];
//2.创建FMDatabase对象 并用数据库文件路径初始化 _dataBase=[FMDatabase databaseWithPath:path];
//3.打开数据库 if([_dataBase open]){ NSLog(@"数据库成功打开"); }else { NSLog(@"数据库打开失败"); }
//4.关闭数据库 [_dataBase close]; // 为什么要关闭数据库? // 注意:每一次对数据库操作(增删改查)的时候,重新打开数据库,然后关闭,以免数据库,一直保持打开状态,造成不必要的资源消耗
2. 创建表
NSString *sql=@"CREATE TABLE if not exists users (id integer primary key autoincrement,name VARCHAR(20),age VARCHAR(10));"; // sql语句为什么一般都用大写? // 在iOS开发里面,为了区别sql的关键字,与表名或者列名,以及变量名区分,sql 语句通常都是用大写来标示 // 如果id设置为自动增长的话,那么把表中的数据删除后,重新插入新的数据,id的编号不是从0开始,而是接着之前的id进行编号。PRIMARY KEY AUTOINCREMENT, 也就是这句话。 //1.打开数据库 if ([_dataBase open]) { //2.执行sql语句 [_dataBase executeUpdate:sql]; }else{ NSLog(@"数据库打开失败"); } //3.关闭数据库 [_dataBase close];
3. 插入数据
NSString *her=@"张三"; NSString *sql=@"INSERT INTO users (name = ?,age = ?);"; // NSString *sql2=@"INSERT INTO users (name,age) VALUES (?,?);"; // executeUpdateWithFormat : 不确定的参数用%@、%d等来占位 //1. if([_dataBase open]){ //2. 插入单条数据 [_dataBase executeUpdate:sql]; [_dataBase executeUpdateWithFormat:@"INSERT INTO users (name,age) VALUES (%@,%d);",her,24]; //多次插入 for(int i=0;i<1000;i++){ [_dataBase executeUpdateWithFormat:@"INSERT INTO users (name,age) VALUES (%@,%d);",@"刘亦菲",24+i]; } }else{ NSLog(@"打开数据库失败"); } //3. [_dataBase close];
4. 删除数据
NSString *sql=@"DELETE FROM users WHERE name = '范冰冰';"; //1. if([_dataBase open]){ //2. [_dataBase executeUpdate:sql]; }else { NSLog(@"数据库打开失败"); } //3. [_dataBase close];
// 删除user表数据 字段还在 FMDatabase *db = [FMDatabase databaseWithPath:self.dbPath]; if ([db open]) { NSString *sql = @"delete from user"; BOOL res = [db executeUpdate:sql]; if (!res) { NSLog(@"error to delete db data"); } else { NSLog(@"success to delete db data"); } [db close]; }
5. 修改数据
NSString *sql=@"UPDATE users SET name = ? WHERE id > 1;"; //1. if ([_dataBase open]) { //2. [_dataBase executeUpdate:sql,@"杨颖"]; }else{ NSLog(@"数据库打开失败"); } //3. [_dataBase close];
如果是升级,可能要增加字段,注意删除字段是不支持的。增加字段可以这样:
NSString *sql=@"ALTER TABLE users ADD COLUMN sex bit"; //增加sex字段
增加了某一列,该列不能删除,数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
6. 查询数据
NSString *sql=@"SELECT * FROM users"; //NSString *sql=@"SELECT * FROM users WHERE id > ?;"; //1. if ([_dataBase open]) { //2. // 查询语句查询到的是一个集合, FMResultSet *set=[_dataBase executeQuery:sql]; // 遍历查询到的结果集合 while ([set next]) { //NSInteger ID=[set intForColumn:@"id"]; NSString *name=[set stringForColumn:@"name"]; NSString *age=[set stringForColumn:@"age"]; NSLog(@"name:%@ age:%@",name,age); } }else{ NSLog(@"数据库打开失败"); } //3. [_dataBase close];
分页查询:
NSString *sql=@"SELECT * FROM users ORDER BY age DESC LIMIT 0,5;"; //ORDER BY age DESC 先降序 //LIMIT 0,5 跳过0条记录,取5条记录
几个简单的基本的sql语句
选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) -- field代表字段 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料! 排序:select * from table1 order by field1,field2 [desc] 总数:select count as totalcount from table1 求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1
多线程安全
// 多线程 - (void)multithread { NSLog(@"%s", __func__); FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:self.dbPath]; dispatch_queue_t q1 = dispatch_queue_create("queue1", NULL); dispatch_queue_t q2 = dispatch_queue_create("queue2", NULL); dispatch_async(q1, ^{ for (int i = 0; i < 100; ++i) { [queue inDatabase:^(FMDatabase *db) { NSString *sql = @"insert into user (name, password) values(?, ?) "; NSString *name = [NSString stringWithFormat:@"queue111 %d", i]; BOOL res = [db executeUpdate:sql, name, @"boy"]; if (!res) { NSLog(@"error to add db data: %@", name); } else { NSLog(@"success to add db data: %@", name); } }]; } }); dispatch_async(q2, ^{ for (int i = 0; i < 100; ++i) { [queue inDatabase:^(FMDatabase *db) { NSString *sql = @"insert into user (name, password) values(?, ?) "; NSString *name = [NSString stringWithFormat:@"queue222 %d", i]; BOOL res = [db executeUpdate:sql, name, @"boy"]; if (!res) { NSLog(@"error to add db data: %@", name); } else { NSLog(@"success to add db data: %@", name); } }]; } }); }