FMDB

来源:互联网 发布:网络配线架英文缩写 编辑:程序博客网 时间:2024/05/16 23:59

Model

////  ResidenceModel.h//  fmdb_pickviewController////  Created by lcy on 16/4/7.//  Copyright © 2016年 ZG. All rights reserved.//#import <Foundation/Foundation.h>@interface ResidenceModel : NSObject@property (nonatomic,copy)NSString * residence;@end

添加FMDB

这里写图片描述

单例

////  DataManager.h//  fmdb_pickviewController////  Created by lcy on 16/4/7.//  Copyright © 2016年 ZG. All rights reserved.//#import <Foundation/Foundation.h>@class ResidenceModel;@interface DataManager : NSObject+ (id)sharedInstance;- (void)addResidence:(ResidenceModel*)residence;- (void)deleteResidence:(ResidenceModel*)residence;- (void)updateResidence:(ResidenceModel*)residence :(NSString*)newString;- (NSArray *)residenceArray;@end
////  DataManager.m//  fmdb_pickviewController////  Created by lcy on 16/4/7.//  Copyright © 2016年 ZG. All rights reserved.//static FMDatabase * dataBase;@implementation DataManager/*    1.单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。    2.多线程下的隐患 在多线程的情况下,如果两个线程几乎同时调用sharedInstance()方法会发生什么呢?有可能会创建出两个该类的实例。为了防止这种情况 我们通常会加上锁    3.dispatch_once iOS 4.0 引进了 GCD ,其中的 **dispatchonce**,它即使是在多线程环境中也能安全地工作,非常安全。dispatchonce是用来确保指定的任务将在应用的生命周期期间,仅执行一次。以下是一个典型的源代码以初始化的东西。它可以优雅通过使用dispatch_once来创建一个单例。 *//* ================initialize方法=============== Duck* duck1 = [[Duck alloc] init]; Duck* duck2 = [[Duck alloc] init]; Duck* duck3 = [[Duck alloc] init]; 控制台打印: 2008-03-23 20:03:25.871 initialize_example[30253:10b] Duck initialize 2008-03-23 20:03:25.872 initialize_example[30253:10b] Duck init 2008-03-23 20:03:25.873 initialize_example[30253:10b] Duck init 2008-03-23 20:03:25.873 initialize_example[30253:10b] Duck init 我们可以看到,虽然我们创建了3个Duck的实例,但是initialize仅仅被调用了一次。 ======================================== Duck* duck1 = [[Duck alloc] init]; Duck* duck2 = [[Duck alloc] init]; Duck* duck3 = [[Duck alloc] init]; //Chicken是duck的子类 Chicken* chicken = [[Chicken alloc] init]; 控制台打印: 2008-03-23 20:13:34.698 initialize_example[30408:10b] Duck initialize 2008-03-23 20:13:34.699 initialize_example[30408:10b] Duck init 2008-03-23 20:13:34.700 initialize_example[30408:10b] Duck init 2008-03-23 20:13:34.700 initialize_example[30408:10b] Duck init 2008-03-23 20:13:34.700 initialize_example[30408:10b] Duck initialize:class:Chicken 2008-03-23 20:13:34.701 initialize_example[30408:10b] Duck init 看来如果一个子类没有实现initialize方法,那么超类会调用这个方法两次,一次为自己,而一次为子类。 ======================================== 如果你希望确定只用了initialize一次用来实现某些单独运行的工作(比如数据库的创建

单利.h文件

#import <Foundation/Foundation.h>@class ResidenceModel;@interface DataManager : NSObject+ (id)sharedInstance;- (void)addResidence:(ResidenceModel*)residence;- (void)deleteResidence:(ResidenceModel*)residence;- (void)updateResidence:(ResidenceModel*)residence :(NSString*)newString;- (NSArray *)residenceArray;

单利.m文件

////  DataManager.m//  fmdb_pickviewController////  Created by lcy on 16/4/7.//  Copyright © 2016年 ZG. All rights reserved.//#import "DataManager.h"#import "FMDatabase.h"#import "FMResultSet.h"#import "FMDatabaseQueue.h"#import "ResidenceModel.h"static FMDatabase * dataBase;@implementation DataManager/*    1.单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。    2.多线程下的隐患 在多线程的情况下,如果两个线程几乎同时调用sharedInstance()方法会发生什么呢?有可能会创建出两个该类的实例。为了防止这种情况 我们通常会加上锁    3.dispatch_once iOS 4.0 引进了 GCD ,其中的 **dispatchonce**,它即使是在多线程环境中也能安全地工作,非常安全。dispatchonce是用来确保指定的任务将在应用的生命周期期间,仅执行一次。以下是一个典型的源代码以初始化的东西。它可以优雅通过使用dispatch_once来创建一个单例。 *//* ================initialize方法=============== Duck* duck1 = [[Duck alloc] init]; Duck* duck2 = [[Duck alloc] init]; Duck* duck3 = [[Duck alloc] init]; 控制台打印: 2008-03-23 20:03:25.871 initialize_example[30253:10b] Duck initialize 2008-03-23 20:03:25.872 initialize_example[30253:10b] Duck init 2008-03-23 20:03:25.873 initialize_example[30253:10b] Duck init 2008-03-23 20:03:25.873 initialize_example[30253:10b] Duck init 我们可以看到,虽然我们创建了3个Duck的实例,但是initialize仅仅被调用了一次。 ======================================== Duck* duck1 = [[Duck alloc] init]; Duck* duck2 = [[Duck alloc] init]; Duck* duck3 = [[Duck alloc] init]; //Chicken是duck的子类 Chicken* chicken = [[Chicken alloc] init]; 控制台打印: 2008-03-23 20:13:34.698 initialize_example[30408:10b] Duck initialize 2008-03-23 20:13:34.699 initialize_example[30408:10b] Duck init 2008-03-23 20:13:34.700 initialize_example[30408:10b] Duck init 2008-03-23 20:13:34.700 initialize_example[30408:10b] Duck init 2008-03-23 20:13:34.700 initialize_example[30408:10b] Duck initialize:class:Chicken 2008-03-23 20:13:34.701 initialize_example[30408:10b] Duck init 看来如果一个子类没有实现initialize方法,那么超类会调用这个方法两次,一次为自己,而一次为子类。 ======================================== 如果你希望确定只用了initialize一次用来实现某些单独运行的工作(比如数据库的创建��) *//* 1.FMDB: (1)OC的方法封装SQLite的c语言的API,只适用于OC,跨平台不好 (2)面向对象,轻量级,灵活(3)多线程安全的数据库操作方法 2.三个重要的类 (1)FMDatabase 一个FMDatabase对象就代表一个单独的SQLite数据库 用来执行SQL语句 (2)FMResultSet 使用FMResultSet执行查询后的结果集 (3)FMDatabaseQueue 用于在多线程中执行多个查询或更新,它是线程安全的: FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath]; [queue inDatabase:^(FMDatabase *db) { [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @1]; [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @2]; [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @3]; FMResultSet *rs = [db executeQuery:@"select * from foo"]; while ([rs next]) { … } }]; */#pragma mark // 创建单例对象+ (id)sharedInstance{    static DataManager * manager = nil;    // coding  dispatch ,选择dispath_once,即可以出来下面的代码块;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        if (!manager) {            manager = [[DataManager alloc] init];        }    });    return  manager;}#pragma mark // 创建数据库+(void)initialize{    NSString * fileName = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingString:@"Residence.sqlite"];    NSLog(@"��%@", fileName);    dataBase = [FMDatabase databaseWithPath:fileName];    [dataBase open];    BOOL result = [dataBase executeUpdate:@"CREATE TABLE IF NOT EXISTS t_residence (ID integer PRIMARY KEY AUTOINCREMENT,residence text NOT NULL);"];    if (result) {        NSLog(@"创建表格成功");    }}- (void)addResidence:(ResidenceModel*)residence{    FMResultSet *rs =[dataBase executeQuery:@"SELECT COUNT(residence) AS countNum FROM t_residence WHERE residence = ?",residence.residence];    while (rs.next)    {        NSInteger count = [rs intForColumn:@"countNum"];        if (count > 0) {            NSLog(@"已经存在");        }        else        {            //executeUpdateWithForamat:不确定的参数用%@,%d等来占位 (参数为原始数据类型,执行语句不区分大小写)            [dataBase executeUpdateWithFormat:@"INSERT INTO t_residence(residence) VALUES (%@);", residence.residence];        }    }}- (void)deleteResidence:(ResidenceModel*)residence{    FMResultSet *rs =[dataBase executeQuery:@"SELECT COUNT(residence) AS countNum FROM t_residence WHERE residence = ?",residence.residence];    while (rs.next) {        NSInteger count = [rs intForColumn:@"countNum"];        if (count > 0) {            //executeUpdateWithForamat:不确定的参数用%@,%d等来占位 (参数为原始数据类型,执行语句不区分大小写)            [dataBase executeUpdateWithFormat:@"delete from t_residence where residence = %@;", residence.residence];            NSLog(@"数据库有,可以执行删除");        }        else        {            NSLog(@"数据库没有,不能删除");        }    }}- (void)updateResidence:(ResidenceModel*)residence :(NSString*)newString{    FMResultSet *rs =[dataBase executeQuery:@"SELECT COUNT(residence) AS countNum FROM t_residence WHERE residence = ?",residence.residence];    while (rs.next) {        NSInteger count = [rs intForColumn:@"countNum"];        if (count > 0) {            //executeUpdateWithForamat:不确定的参数用%@,%d等来占位 (参数为原始数据类型,执行语句不区分大小写)            [dataBase executeUpdateWithFormat:@"update t_residence set residence = %@ where residence = %@", newString,residence.residence];            NSLog(@"数据库有,可以执行修改");        }        else        {            NSLog(@"数据库没有,不能修改");        }    }}- (NSArray *)residenceArray{    FMResultSet *set = [dataBase executeQuery:@"SELECT * FROM t_residence;"];    NSMutableArray *residenceArray = [NSMutableArray array];    while (set.next) {        ResidenceModel * r = [[ResidenceModel alloc] init];        r.residence = [set stringForColumn:@"residence"];        [residenceArray addObject:r];    }    return residenceArray;}@end
////  ViewController.m//  fmdb_pickviewController////  Created by lcy on 16/4/6.//  Copyright © 2016年 ZG. All rights reserved.//#import "ViewController.h"#import "DataManager.h"#import "ResidenceModel.h"@interface ViewController ()<UIPickerViewDelegate,UIPickerViewDataSource>@property (weak, nonatomic) IBOutlet UIPickerView *pickView;@property (nonatomic,strong) NSMutableArray * addressArray;@property (nonatomic,copy)NSString * addressString;@property (nonatomic,strong)DataManager * manager;@end@implementation ViewController/* 懒加载 1.不必将创建的代码全部写在- (void)viewDidLoad方法中,增加了代码的可读性; 2.每个属性的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,耦合性低; 3.只有到真正需要资源的时候才回去加载,节省了内存空间; 4.当收到内存警告是,需要didReceviewMemoryWarning方法中清理缓存,如果是懒加载的话,如果以后有的地方用到了该属性,还会再次顺利的加载出来; */- (void)viewDidLoad {    [super viewDidLoad];    _manager = [[DataManager alloc] init];    _pickView.dataSource= self;    _pickView.delegate = self;    NSString* file = [[NSBundle mainBundle] pathForResource:@"ResidenceLabel" ofType:@"plist"];    _addressArray = [[NSDictionary dictionaryWithContentsOfFile:file] objectForKey:@"ResidenceInJapan"];}- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{    return 1;}- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{    return _addressArray.count;}- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{    _addressString = _addressArray[row];    return _addressArray[row];}- (IBAction)add:(id)sender {    ResidenceModel * r = [[ResidenceModel alloc] init];    r.residence = _addressString;    [_manager addResidence:r];}- (IBAction)delete:(id)sender {    ResidenceModel * r = [[ResidenceModel alloc] init];    r.residence = _addressString;    [_manager deleteResidence:r];}- (IBAction)update:(id)sender {    ResidenceModel * r = [[ResidenceModel alloc] init];    r.residence = _addressString;    [_manager updateResidence:r :@"新的"];}- (IBAction)read:(id)sender {    NSArray * array = [_manager residenceArray];    NSLog(@"%@", array);}@end
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 公公一晚上要8次 公公现在就想要白关婷中文字幕 丈夫上司侵犯系列在线 义父犯美媳嫁樱花叶菜在线播放 儿子的妻子在线中文字幕云播 老公去世公公每天晚上抱着我睡 被水电工掠夺的妻子在线播放b 佐佐木明希大嫂中文字幕全集 善良的小妻子字幕 公公在我洗碗时在厨房要了我 大嫂被肉翻了天佐佐木明希1 教师蕾丝短裙中文字幕 瓜棚里和大嫂乱禽 强睡大嫂中文字 免费 佐佐木明希 房东中文字幕 与父亲干柴烈火 中文字幕丈夫不在 9大嫂被禽翻中文字幕 侵犯你的贞洁 中文字幕 年轻的妻子在线观中文字幕 大嫂被翻天了佐佐木b希中文7 美丽的大嫂中文字幕影迅雷下载 邻居的妻子中文字幕下载 神马电影院电影中文 神马电影院理论中文 女儿的朋友5中文神马电影院 97手机2019电影院专用版中文 厨房里进入朋友的老婆 中文版电影院 神马电影院 中文 儿子的妻子中文字幕 下载 樱桃中文版电影院 大富豪电影院韩国中文 老婆的闺蜜们喝醉了在家 中文潮人影院您手中的电影院 朋友不在晚上去他家干 趁兄弟喝醉上他女朋友在线播放 神马电影院午伦中文 朋友喝醉上其妻 我朋友的妻子韩语中文2018 在朋友家趁朋友喝醉上他老婆