//  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复习的更多相关文章

  1. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  2. iOS总结_UI层自我复习总结

    UI层复习笔记 在main文件中,UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil,即创建的是UIApplication类型的对象,此对象看成是 ...

  3. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  4. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

  5. IOS FMDB 获取数据库表和表中的数据

    ios开发中,经常会用到数据库sqlite的知识,除了增,删,改,查之外,我们说说如何获取数据库中有多少表和表相关的内容. 前言 跟数据库使用相关的一般的增删改查的语句,这里就不做解释了.在网上有很多 ...

  6. vuex复习方案

    这次复习vuex,发现官方vuex2.0的文档写得太简略了,有些看不懂了.然后看了看1.0的文档,感觉很不错.那以后需要复习的话,还是先看1.0的文档吧.

  7. 简单的数据库设计及使用(FMDB)

    有这样一个需求: 有m个用户公用n个文件,一个用户可能会用到多个文件,一个文件可能被多个用户使用: 如果某个用户离开,那这个用户就不再使用任何文件:如果某个文件没有任何用户使用,就要删除该文件: 已知 ...

  8. 我的操作系统复习——I/O控制和系统调用

    上篇博客介绍了存储器管理的相关知识——我的操作系统复习——存储器管理,本篇讲设备管理中的I/O控制方式和操作系统中的系统调用. 一.I/O控制方式 I/O就是输入输出,I/O设备指的是输入输出设备和存 ...

  9. FMDB的使用方法

    转自:http://blog.devtang.com/blog/2012/04/22/use-fmdb/ 前言 SQLite (http://www.sqlite.org/docs.html) 是一个 ...

随机推荐

  1. 爱好-超级IP:超级IP

    ylbtech-爱好-超级IP:超级IP  IP,是Intellectual Property的缩写,字面粗译为“知识产权”,特指具有长期生命力和商业价值的跨媒介内容运营.一个具有可开发价值的真正的I ...

  2. CentOS7设置启动模式问题

    参考地址 https://www.linuxidc.com/Linux/2015-12/126356.htm

  3. VMware 虚拟化编程(2) — 虚拟磁盘文件类型详解

    目录 目录 前文列表 虚拟磁盘文件 VMDK 用户可以创建的虚拟磁盘类型 VixDiskLib 中支持的虚拟磁盘类型 虚拟机文件类型 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/ ...

  4. jmeter之自动重定向和跟随重定向用法

    jmeter工具里面有自动重定向和跟随重定向这2种选择,那么他们到底有啥区别呢? 目录 1.自动重定向和跟随重定向 2.举个例子 1.自动重定向和跟随重定向 01.3XX的请求一般要使用跟随重定向,2 ...

  5. python自动化测试接口测试http请求报404的其中一个坑

    在敲代码的路上 ,总是会遇到报错找半天原因,最后发现是个低级错误的时候! 这不今天为了这个错误找了半天原因.......... http请求接口测试中报404我遇到的大部分都是url的问题: 但是今天 ...

  6. 解决django项目无法连接远程mysql的问题

    我们都知道django项目可以通过修改settings.py文件中的DATABASES这个对象,使用不同的数据库. 如图所示,我们想连接远程的mysql,修改settings.py的配置 然后我们在终 ...

  7. Linux中 xargs 命令用法

    xargs命令: xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具. 1.它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令 ...

  8. JAVA总结--设计模式

    三大类设计模式: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为 ...

  9. JDK8 parallelStream性能测试

    https://blog.csdn.net/u011870280/article/details/80700993 public static void main(String[] args) {lo ...

  10. 漫漫人生路,我们该何去何从! Python让我找到了方向

    互联网寒冬 2017年冬天,是我人生中最难熬的一个冬天,其实2017年的冬天并不算太冷,比这冬日的寒风还要严寒的要属这所谓的"互联网寒冬"吧!各大厂裁员的消息充斥着互联网,互联网表 ...