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
//创建单例类的方法 - dispatch_once 只执行一次
+(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];
}
}
FMDB实用攻略的更多相关文章
- git实用攻略(二)
最近团队的版本控制从svn切换到了git,虽说已经使用git有2年多了,也写了一个实用攻略,但是github上的项目使用经验和公司内部团队协作的使用经验还有很多不同.补充下新的使用体会. 首先还是看一 ...
- git实用攻略
Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 下面是实用教程,免基础. 一.安装git https://git-scm.com/downloads 二.git创建 ...
- 教你MySQL Binlog实用攻略
本文由云+社区发表 1.概述 binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的redo/undo log是完全不同的日志:其主要是用来记录对mysql数据更新或潜在发 ...
- 安卓APP动态调试-IDA实用攻略
0x00 前言 随着智能手机的普及,移动APP已经贯穿到人们生活的各个领域.越来越多的人甚至已经对这些APP应用产生了依赖,包括手机QQ.游戏.导航地图.微博.微信.手机支付等等,尤其2015年春节期 ...
- 安卓APP动态调试(IDA实用攻略)
转自:http://drops.wooyun.org/mobile/5942 0x00 前言 随着智能手机的普及,移动APP已经贯穿到人们生活的各个领域.越来越多的人甚至已经对这些APP应用产生了依赖 ...
- 面向Web应用的并发压力测试工具——Locust实用攻略
1. 概述 该方案写作目的在于描述一个基于Locust实现的压力测试,文中详细地描述了如何利用locustfile.py文件定义期望达成的测试用例,并利用Locust对目标站点进行并发压力测试. 特别 ...
- [经验] Win7减肥攻略(删文件不删功能、简化优化系统不简优化性能)
[经验] Win7减肥攻略(删文件不删功能.简化优化系统不简优化性能) ☆心梦无痕☆ 发表于 2014-1-24 11:15:04 https://www.itsk.com/thread-316471 ...
- IIS 7完全攻略之日志记录配置(摘自网络)
IIS 7完全攻略之日志记录配置 作者:泉之源 [IT168 专稿]除了 Windows 提供的日志记录功能外,IIS 7.0 还可以提供其他日志记录功能.例如,可以选择日志文件格式并指定要记录的请求 ...
- 30天,O2O速成攻略【8.15济南站】
活动概况 时间:2015年08月15日13:30-16:30 地点:山东大学凤岐茶社(山东大学中心校区北门18号楼东连廊一层) 主办:APICloud.蚁巡 网址:www.apicloud.com 费 ...
随机推荐
- checkbox选中与取消选择
先上代码 <form> 你爱好的运动是?<br/> <input type="checkbox" name="items" val ...
- (转)深入理解JavaScript 模块模式
深入理解JavaScript 模块模式 (原文)http://www.cnblogs.com/starweb/archive/2013/02/17/2914023.html 英文:http://www ...
- hdu 2073
ps:感觉纯数学题.....我的思路就是找规律,发现dp(x+y) 就是 (0,x+y)的值,然后再加上x*根号2.就是他的距离.然后两个距离相减的绝对值就是两个点之间的距离了. 代码: #inclu ...
- Asp.net中Json的序列化和反序列化(一)
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍 ...
- 上下margin重叠传递问题
我发现强迫症真的是我一个大病...每次都非得把所有情况都实验出来不可...BUT!!!!!!!!!悲催的是,这么多情况我根本记不住...还是要在写代码的时候不断出错再排错~受不了自己了!不过还是把这部 ...
- JavaScript取子串方法slice,substr,substring对比表
在程序语言中,字符串可以说是最常用的一种类型,而在程序中对字符串的操作也是十分频繁.当程序语言自带多种字符串操作的方法时,用该语言编程程序时就有很多的便利性,提高开发的效率.但是当方法过多,甚至目的相 ...
- 如何在 Linux 终端中知道你的公有 IP
导读 在本文中我将会介绍在几种在 Linux 终端中查看你的公有 IP 地址的方法.这对普通用户来说并无意义,但 Linux 服务器(无GUI或者作为只能使用基本工具的用户登录时)会很有用.无论如何, ...
- 移动开发框架,Hammer.js 移动设备触摸手势js库
hammer.js是一个多点触摸手势库,能够为网页加入Tap.DoubleTap.Swipe.Hold.Pinch.Drag等多点触摸事件,免去自己监听底层touchstart.touchmove.t ...
- Postgres 9.4 feature highlight: REPLICA IDENTITY and logical replication
Among the many things to say about logical replication features added in PostgreSQL 9.4, REPLICA IDE ...
- 033. asp.netWeb用户控件之二将页面转换成web控件和使用Web控件显示热点新闻
访问Web用户控件的属性 ASP.NET提供的各种服务器控件都有其自身的属性和方法,程序开发人员可以灵活地使用服务器控件中的属性和方法开发程序.在用户控件中,程序开发人员也可以自行定义各种属性和方法, ...