FMDB实用攻略

一.首先创建模型类

User.h

#import <Foundation/Foundation.h>

@interface User : NSObject

@property(nonatomic,assign)NSInteger ids;

@property(nonatomic,strong)NSString *name;

@property(nonatomic,strong)NSString *classes;

@property(nonatomic,strong)NSString *grade;

@end

二.创建数据库的单例类 FMDBData

FMDBData.h

@interface FMDBData : NSObject

//单例类

+(instancetype)sharedFMDBData;

//增

-(BOOL)insertUser:(User *)user;

//删

-(BOOL)deleteUser:(User *)user;

//改

-(BOOL)updateUser:(User *)user;

//查询

-(NSMutableArray *)getAll;

//查询单个数据

-(User *)getMessage:(NSString *)name;

@end

FMDBData.m

导入FMDB头文件

#import "FMDatabase.h"

//全局静态变量

//数据库

static FMDatabase *fmdb;

//对象

static FMDBData *DBdata;

@implementation FMDBData

+(instancetype)sharedFMDBData

{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

DBdata = [[FMDBData alloc]init];

[DBdata initDB];

});

return DBdata;

}

+(instancetype)allocWithZone:(struct _NSZone *)zone

{

if (!DBdata) {

DBdata = [super allocWithZone:zone];

}

return DBdata;

}

-(id)copy

{

return self;

}

-(id)mutableCopy

{

return self;

}

-(void)initDB

{

//沙盒路径

NSString *doucmentPach = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];

//拼接路径

NSString *pach = [doucmentPach stringByAppendingString:@"user.sqlite"];

//根据路径创建数据库

fmdb = [[FMDatabase alloc]initWithPath:pach];

if ([fmdb open]) {

//创建数据表

[fmdb executeUpdate:@"create table user(ids integer primary key autoincrement, name text, classes text, grade text)"];

NSLog(@"创建成功");

[fmdb close];

}

else

{

NSLog(@"创建失败");

}

}

//增

-(BOOL)insertUser:(User *)user

{

[fmdb open];

NSLog(@"%@",user.name);

BOOL isb = [fmdb executeUpdate:@"insert into user values (null,?,?,?)",user.name,user.classes,user.grade];

if (isb) {

NSLog(@"插入成功");

}

else

{

NSLog(@"插入失败");

}

[fmdb close];

return isb;

}

//删

-(BOOL)deleteUser:(User *)user

{

[fmdb open];

NSLog(@"%@",user.name);

BOOL isb = [fmdb executeUpdate:@"delete from user where name = ?",user.name];

if (isb) {

NSLog(@"删除成功");

}

else

{

NSLog(@"删除失败");

}

[fmdb close];

return isb;

}

//改

-(BOOL)updateUser:(User *)user

{

[fmdb open];

NSLog(@"%@",user.name);

NSString *str = [NSString stringWithFormat:@"update user set name = ‘%@‘ , classes = ‘%@‘ , grade = ‘%@‘ where ids = %ld",user.name,user.classes,user.grade,user.ids];

BOOL isb = [fmdb executeUpdate:str];

if (isb) {

NSLog(@"修改成功");

}

else

{

NSLog(@"修改失败");

}

[fmdb close];

return isb;

}

//查询所有

-(NSMutableArray *)getAll

{

//打开数据库

[fmdb open];

//创建可变数组

NSMutableArray *arr = [NSMutableArray array];

//创建结果对象接受数据库的操作结果

FMResultSet *fmset = [fmdb executeQuery:@"select * from user"];

//通过循环

while ([fmset next])

{

User *user = [[User alloc] init];

//用模型类对象接受数据库内容

user.ids = [fmset intForColumn:@"ids"];

user.name = [fmset stringForColumn:@"name"];

user.classes = [fmset stringForColumn:@"classes"];

user.grade = [fmset stringForColumn:@"grade"];

NSLog(@"%@",user.classes);

//将内容加入数组

[arr addObject:user];

}

//关闭数据库

[fmdb close];

return arr;

}

//查询单个数据

-(User *)getMessage:(NSString *)name

{

[fmdb open];

User *user = [[User alloc] init];

FMResultSet *fmset = [fmdb executeQuery:@"select * from user where name = ?",name];

while ([fmset next])

{

user.ids = [fmset intForColumn:@"ids"];

user.name = [fmset stringForColumn:@"name"];

user.classes = [fmset stringForColumn:@"classes"];

user.grade = [fmset stringForColumn:@"grade"];

}

[fmdb close];

return user;

}

@end

三.单例类的使用

1.删除按钮

- (IBAction)DeleteBtn:(id)sender {

//初始化FMDB

FMDBData *handle = [FMDBData sharedFMDBData];

//初始化单例类

User *user = [[User alloc] init];

//为 单例类的name赋值

user.name = self.NameTF.text;

//执行删除事件

BOOL isb =  [handle deleteUser:user];

// [table reloadData];

if (isb) {

[[[UIAlertView alloc] initWithTitle:@"提示" message:@"删除成功" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil] show];

}else{

[[[UIAlertView alloc] initWithTitle:@"提示" message:@"删除失败" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil] show];

}

[table reloadData];

}

2.查询按钮

- (IBAction)SelectBtn:(id)sender {

FMDBData *handle = [FMDBData sharedFMDBData];

if ([self.NameTF.text isEqualToString:@""]) {

arr = [handle getAll];

}

else

{

User *user=[handle getMessage:self.NameTF.text];

arr=[[NSMutableArray alloc]initWithObjects:user,nil];

}

[table reloadData];

}

3.添加按钮

-(void)click

{

//数据库

FMDBData *handle = [FMDBData sharedFMDBData];

//单例类

User *user = [[User alloc] init];

//保存数据

user.name = self.tfname.text;

user.classes = self.tfclass.text;

user.grade = self.tfscore.text;

//执行数据添加方法

BOOL isb =  [handle insertUser:user];

if (isb)

{

//

[self dismissViewControllerAnimated:YES completion:nil];

}

else

{

[[[UIAlertView alloc] initWithTitle:@"提示" message:@"保存失败" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil] show];

}

}

4更新按钮 (传参为数据模型体)

-(void)click

{

FMDBData *hander=[FMDBData sharedFMDBData];

self.user.name = self.tfname.text;

self.user.classes = self.tfclass.text;

self.user.grade = self.tfscore .text;

NSLog(@"id:%ld",self.user.ids);

BOOL isb =  [hander updateUser:self.user];

if (isb) {

[self dismissViewControllerAnimated:YES completion:nil];

}else{

[[[UIAlertView alloc] initWithTitle:@"提示" message:@"修改失败" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil] show];

}

}

时间: 2025-01-09 08:34:27

FMDB实用攻略的相关文章

2019春节公司邮箱实用攻略安心过年

春节将至,各企业员工都在为假期规划着,购票.拼假等各种攻略纷纷出炉,在喜迎假期的同时,合理安排公司工作就显的至关重要.因此,我准备一些关于TOM企业邮箱的假期实用小攻略,让您工作.生活两不误.随心邮 随时随地极速收发春节是中国最传统的节日,但由于国内外文化的差异,一些外贸公司在假期还会接收一些海外订单,回家拜年导致订单邮件无法处理,怎么办?TOM出品的"随心邮"让您过年回家无顾虑,作为手机上更方便的程序,随心邮独享TOM官方实时推送,享受毫秒级的邮件收发速度,让您随时随地即可高效快速的

安卓APP动态调试-IDA实用攻略

0x00 前言 随着智能手机的普及,移动APP已经贯穿到人们生活的各个领域.越来越多的人甚至已经对这些APP应用产生了依赖,包括手机QQ.游戏.导航地图.微博.微信.手机支付等等,尤其2015年春节期间各大厂商推出的抢红包活动,一时让移动支付应用变得异常火热. 然后移动安全问题接憧而至,主要分为移动断网络安全和客户端应用安全.目前移动APP软件保护方面还处于初级阶段,许多厂商对APP安全认识不够深入,产品未经过加密处理,使得逆向分析者能够通过逆向分析.动态调试等技术来破解APP,这样APP原本需

教你MySQL Binlog实用攻略

本文由云+社区发表 1.概述 binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的redo/undo log是完全不同的日志:其主要是用来记录对mysql数据更新或潜在发生更新的SQL语句,并以"事务"的形式保存在磁盘中: 作用主要有: [x] 复制:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves并回放来达到master-slave数据一致的目的 [x] 数据恢复:通过mysqlbinlo

超级实用!全郑州地铁沿线景点美食全攻略(附首末班时间表)

超级实用!全郑州地铁沿线景点美食全攻略(附首末班时间表) 2017-04-20小金豆郑州微公交 玩得劲 春天在哪里呀? 春天在哪里? 小编总结了 郑州地铁线路景点美食大全 及最新地铁首末班时刻表 最美人间四月天 快跟着小编 坐上地铁去旅行吃美食吧 别忘备上纸巾擦口水啊~ 一 郑州地铁沿线最全景点美食一览 1 1号线 龙子湖站 龙子湖 票价:免费 地址:郑东新区新107国道以东 市体育中心站 中原网球中心 票价:免费 地址:金水区金水东路附近 固始菜家庭餐馆 人均:¥20 地址:金水东路与明理路交

前台页面优化全攻略(三)

经过前两篇文章的实践,你的网站加载速度一定有了非常明显的变化.能把实践跟到这篇文章的人想必一定是极客中的极客.如果你仍对网站的加载速度不满意,可以看看再尝试一下本文中几近疯狂的终极优化方案. 你可以对网站进行快速的优化,但网站日常的节食却很难.也许你已经花了很大的力气去优化你的CSS和JavaScript代码,但是你所做的努力马上又会因为老板或客户期望的新功能而付之东流.所以看来不论是人还是网页,减肥都贵在坚持. 这篇终极减肥方案可能不适合所有的网站,但是我相信它可以引起你对网页大小的重视. 1

前台页面优化全攻略(四)

通过前几篇文章,你应该已经掌握了很多优化网站的方法.现在你的网站加载速度已经很快了,但是你必须持续的监控你的网站,了解它的大小变化,要不然一段时间过去之后,它可能又成为了一个胖子. 如今每个页面平均已经达到1.7M,每年增长大概32%.你可以通过以下几个工具来查看你的网站是不是又在暴饮暴食,而且它们都是免费的. 1. Pingdom Pingdom是我喜欢的一个在线测试工具.它会揭露出所以你想知道的细节,你可以一清二楚的看到网站的现状:重量.加载速度.代码分析.性能评分.开发者建议,它还提供了一

80后新手装修完全攻略(转载)

1. 如果家中会做饭频率很高的话,尽量放弃开放式厨房,会有油烟问题 2. 卫生间.厨房小水宝,热水来得快,使用时比较方便 3. 吸油烟机中式的比欧式的吸力更强,欧式的好看不中用. 4. 电源插座能多装尽量多装点,否则家里到处都是拖线板 5. 马桶边上一定要预留电源插座,否则卫洗丽没法装 6. 浴缸PK淋浴,二选一的话,还是建议淋浴,浴缸装好,从来也没泡过澡的不是少数.淋浴不是指淋浴房,淋浴房的玻璃擦起来还是很累的,也可以选择挂根浴帘 7. 如果有2个卫生间,装一个浴缸还是有必要的,泡泡大件衣物,

Linux基础:简明 VIM 练级攻略

世界上只有三种编辑器,EMACS.VIM和其它 个人觉得非常好的博文: 简明VIM练级攻略: http://coolshell.cn/articles/5426.html 无插件VIM编程技巧: http://coolshell.cn/tag/vim 跟我一起学习VIM:http://feihu.me/blog/2014/intro-to-vim/ .vimrc 文件: map <F9> :call SaveInputData()<CR> func! SaveInputData()

机器学习资料与攻略超强整理吐血推荐(二)

在前文<机器学习资料与攻略超强整理吐血推荐(一)>中,我们讲到要进入人工智能的圈子,数学是不可逾越的第一关,然后我们又推荐了一些你必须掌握的数学方面的资料.接下来,在这一篇中,我们将介绍关于机器学习的理论与工具方面的资料. 二.工具篇 工欲善其事,必先利其器.大数据时代,人工智能的工具趋势是显而易见且确定无疑的.作为一名数据科学家,其实你可以选择的工具非常多,其实随着时代的发展和技术的演进,传统的SPSS.STATA和SAS等这些老牌数据分析工具都已经集成了机器学习和数据挖掘的模块.当然,这不