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) 是一个 ...
随机推荐
- 爱好-超级IP:超级IP
ylbtech-爱好-超级IP:超级IP IP,是Intellectual Property的缩写,字面粗译为“知识产权”,特指具有长期生命力和商业价值的跨媒介内容运营.一个具有可开发价值的真正的I ...
- CentOS7设置启动模式问题
参考地址 https://www.linuxidc.com/Linux/2015-12/126356.htm
- VMware 虚拟化编程(2) — 虚拟磁盘文件类型详解
目录 目录 前文列表 虚拟磁盘文件 VMDK 用户可以创建的虚拟磁盘类型 VixDiskLib 中支持的虚拟磁盘类型 虚拟机文件类型 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/ ...
- jmeter之自动重定向和跟随重定向用法
jmeter工具里面有自动重定向和跟随重定向这2种选择,那么他们到底有啥区别呢? 目录 1.自动重定向和跟随重定向 2.举个例子 1.自动重定向和跟随重定向 01.3XX的请求一般要使用跟随重定向,2 ...
- python自动化测试接口测试http请求报404的其中一个坑
在敲代码的路上 ,总是会遇到报错找半天原因,最后发现是个低级错误的时候! 这不今天为了这个错误找了半天原因.......... http请求接口测试中报404我遇到的大部分都是url的问题: 但是今天 ...
- 解决django项目无法连接远程mysql的问题
我们都知道django项目可以通过修改settings.py文件中的DATABASES这个对象,使用不同的数据库. 如图所示,我们想连接远程的mysql,修改settings.py的配置 然后我们在终 ...
- Linux中 xargs 命令用法
xargs命令: xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具. 1.它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令 ...
- JAVA总结--设计模式
三大类设计模式: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为 ...
- JDK8 parallelStream性能测试
https://blog.csdn.net/u011870280/article/details/80700993 public static void main(String[] args) {lo ...
- 漫漫人生路,我们该何去何从! Python让我找到了方向
互联网寒冬 2017年冬天,是我人生中最难熬的一个冬天,其实2017年的冬天并不算太冷,比这冬日的寒风还要严寒的要属这所谓的"互联网寒冬"吧!各大厂裁员的消息充斥着互联网,互联网表 ...