FMDB复习
// colum/列/字段
// row/行/记录
// 主键的作用是唯一标识一条记录
// sql语句注意:不区分大小写,以分号结束(不要分号也行?)
// 如果增加字段,可能要指定数据类型,SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型。
http://www.cnblogs.com/shenliang123/archive/2012/04/07/2435908.html
FMDB框架的3大核心类:
.FMDatabase
一个FMDatabase对象就代表一个单独的SQLite数据库
用来执行SQL语句
.FMResultSet
使用FMDatabase执行查询后的结果集
.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,]; //多次插入
for(int i=;i<;i++){
[_dataBase executeUpdateWithFormat:@"INSERT INTO users (name,age) VALUES (%@,%d);",@"刘亦菲",+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条记录
几个简单的基本的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 = ; i < ; ++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 = ; i < ; ++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);
}
}];
}
});
}
FMDB复习的更多相关文章
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- iOS总结_UI层自我复习总结
UI层复习笔记 在main文件中,UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil,即创建的是UIApplication类型的对象,此对象看成是 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- 【原】FMDB源码阅读(一)
[原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...
- IOS FMDB 获取数据库表和表中的数据
ios开发中,经常会用到数据库sqlite的知识,除了增,删,改,查之外,我们说说如何获取数据库中有多少表和表相关的内容. 前言 跟数据库使用相关的一般的增删改查的语句,这里就不做解释了.在网上有很多 ...
- vuex复习方案
这次复习vuex,发现官方vuex2.0的文档写得太简略了,有些看不懂了.然后看了看1.0的文档,感觉很不错.那以后需要复习的话,还是先看1.0的文档吧.
- 简单的数据库设计及使用(FMDB)
有这样一个需求: 有m个用户公用n个文件,一个用户可能会用到多个文件,一个文件可能被多个用户使用: 如果某个用户离开,那这个用户就不再使用任何文件:如果某个文件没有任何用户使用,就要删除该文件: 已知 ...
- 我的操作系统复习——I/O控制和系统调用
上篇博客介绍了存储器管理的相关知识——我的操作系统复习——存储器管理,本篇讲设备管理中的I/O控制方式和操作系统中的系统调用. 一.I/O控制方式 I/O就是输入输出,I/O设备指的是输入输出设备和存 ...
- FMDB的使用方法
转自:http://blog.devtang.com/blog/2012/04/22/use-fmdb/ 前言 SQLite (http://www.sqlite.org/docs.html) 是一个 ...
随机推荐
- 【转】一个 Vim 重度用户总结的 vim 超全指南
[转]一个 Vim 重度用户总结的 vim 超全指南 我本人是 Vim 的重度使用者,就因为喜欢上这种双手不离键盘就可以操控一切的feel,Vim 可以让我对文本的操作更加精准.高效. 对于未使用过 ...
- springAOP基于注解的使用方法和实现原理
springAOP即面向切面编程,可以在方法执行过程中动态的织入增强逻辑,其使用步骤为: 1. 导入aop模块的jar包,或在maven中添加依赖:spring-aspects 2. 定义目标类和目 ...
- 抓包工具之—charles碎言碎语
一.Charles常见使用场景: 1.Charles是跨平台的抓包工具,支持Windows,mac或Linux平台: 2.获取请求信息.测试接口时,若接口文档中的参数不清楚或没有接口文档时,可以通过抓 ...
- python 正则表达式 re.search
#coding:utf-8 import re #将正则表达式编译为pattern对象 #compile(pattern, flags=0) #Compile a regular expression ...
- hackinglab 脚本关 writeup
地址:http://hackinglab.cn 脚本关 key又又找不到了 点击提供的链接后,实际发生了两次跳转,key 在第一次跳转的网页中,key is : yougotit_script_now ...
- Java相关面试题总结+答案(九)
[MySQL] 164. 数据库的三范式是什么? 第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项. 第二范式:属性完全依赖于主键(满足第一范式的前提下),即任意一个字段只依赖 ...
- Maven父项目 以SpringBoot项目为例
父项目pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http ...
- 【题解】Shortest Cycle
原题链接:CF1205B 题目大意 给定\(n\)个整数\(a_1,a_2,a_3, \dots ,a_n\),若\(i \neq j\)且\(a_i \land a_j \neq 0\),则 ...
- Python中yield和return两者之间区别
在任何函数都有返回值,一般都是想到return 关键词,在函数生成器中有个关键词 yield 也可以做返回值,在函数没调用之前,是不会输出任何东西的 1,return 用法 def stu(): re ...
- menustrip
在对应菜单上点击鼠标右键,插入,SEPARATOR 就可以了,然后可以选中拖动位置.