DYDB.h
Objective-C

12345678910111213141516

#import <Foundation/Foundation.h>
#import <FMDB/FMDatabase.h>
@interface DYDB : NSObject {
}
@property(nonatomic, readonly) FMDatabase *database;
+ (DYDB *) sharedDB;
- (FMDatabase *) connect;
- (void) clearDB;
@end

DYDB.m
Objective-C

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647

#import “DYDB.h”
#define kDYDBObvName @”dyobv.sqlite”
@implementation DYDB
static DYDB *_sharedDB;
+ (DYDB *) sharedDB {
if (!_sharedDB) {
_sharedDB = [[DYDB alloc] init];
}
return _sharedDB;
}
- (id) init {
self = [super init];
if (self) {
NSString* docsdir = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *dbpath = [docsdir stringByAppendingPathComponent:kDYDBObvName];
DLog(@”database file path: %@”, dbpath);
_database = [FMDatabase databaseWithPath:dbpath];
}
return self;
}
- (FMDatabase *) connect {
if ([_database open]) {
return _database;
}
DLog(@”fail to open db…”);
return nil;
}
- (void) clearDB {
dispatch_async(dispatch_get_main_queue(), ^{
if([_database close]) {
_database = nil;
}
});
}
@end

DYLogKeeper+DB.h
Objective-C

1234567891011121314151617181920

#import “DYLogKeeper.h”
#import <FMDB/FMDatabase.h>
DYLogKeeper * rs2logkeeper(FMResultSet *rs);
@interface DYLogKeeper (DB)
+ (void) createSqliteTable;
+ (BOOL) insert: (DYLogKeeper *) logkeeper;
+ (BOOL) updateContent: (NSString *) content localId: (NSString *) localId;
+ (BOOL) remove: (DYLogKeeper *) logkeeperId;
+ (DYLogKeeper *) findById: (NSString *) localId;
+ (NSArray *) findOfStartDate: (NSDate *) start toDate:(NSDate *) toDate;
@end

DYLogKeeper+DB.m
Objective-C

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156

#import “DYLogKeeper+DB.h”
#import “DYDB.h”
#import <FMDB/FMDatabase.h>
#import “DYUUID.h”
#import “NSDate+NSDateFormaterCategory.h”
DYLogKeeper * rs2logkeeper(FMResultSet *rs) {
DYLogKeeper *obj = [[DYLogKeeper alloc] init];
obj.localId = [rs stringForColumn:@”local_id”];
obj.logkeeperId = [rs stringForColumn:@”logkeeper_id”];
obj.addtime = [rs dateForColumn:@”add_time”];
obj.content = [rs stringForColumn:@”content”];
obj.deviceId = [rs stringForColumn:@”device_id”];
obj.deviceType = [rs intForColumn:@”device_type”];
obj.channel = [rs intForColumn:@”channel”];
return obj;
}
@implementation DYLogKeeper (DB)
+ (void) createSqliteTable {
DLog(@”check table is exists?”);
FMDatabase *db = [[DYDB sharedDB] connect];
NSString *existsSql = [NSString stringWithFormat:@”select count(name) as countNum from sqlite_master where type = ‘table’ and name = ‘%@’”, @”log_keepers” ];
DLog(@”%@”, existsSql);
FMResultSet *rs = [db executeQuery:existsSql];
if ([rs next]) {
NSInteger count = [rs intForColumn:@”countNum”];
DLog(@”The table count: %d”, count);
if (count == 1) {
DLog(@”log_keepers table is existed.”);
return;
}
DLog(@”log_keepers is not existed.”);
}
[rs close];
DLog(@”create table ….”);
NSString *filePath = [[NSBundle mainBundle] pathForResource:@”log_keepers_table” ofType:@”sql”];
DLog(@”logkeeper sql file: %@”, filePath);
NSError *error;
NSString *sql = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
if (error != nil) {
DLog(@”fail to read sql file: %@”, [error description]);
return;
}
DLog(@”—sql: \n %@”, sql);
DLog(@”execute sql ….”);
if([db executeUpdate:sql]) {
DLog(@”create table succes….”);
} else {
DLog(@”fail to execute update sql..”);
}
[db close];
}
+ (BOOL) insert: (DYLogKeeper *) logkeeper {
DLog(@”insert logkeeper”);
DLog(@”convert int value to NSNumber …”);
logkeeper.localId = [DYUUID uuidString];
NSNumber *channelNum = [NSNumber numberWithInt:logkeeper.channel];
DLog(@”— channelNum: %@”, channelNum);
NSNumber *typeNumber = [NSNumber numberWithInt:logkeeper.deviceType];
DLog(@”— deviceType: %@”, typeNumber);
NSString *sql = @”insert into log_keepers(local_id, logkeeper_id, add_time, content, device_id, device_type, channel) values(?, ?, ?, ?, ?, ?, ?)”;
FMDatabase *db = [[DYDB sharedDB] connect];
if (db == nil) {
DLog(@”fail to create db..”);
}
BOOL ret = [db executeUpdate:sql, logkeeper.localId, logkeeper.logkeeperId,
logkeeper.addtime, logkeeper.content,
logkeeper.deviceId, typeNumber, channelNum];
[db close];
return ret;
}
+ (BOOL) updateContent:(NSString *)content
localId: (NSString *)localId {
DLog(@”update logkeeper content”);
NSString *sql = @”update log_keepers set content = ? where local_id = ?”;
FMDatabase *db = [[DYDB sharedDB] connect];
BOOL ret = [db executeUpdate:sql, content, localId];
[db close];
return ret;
}
- (BOOL) remove: (DYLogKeeper *) logkeeper {
DLog(@”remove logkeeper: %@”, logkeeper.localId);
NSString *sql = @”delete from log_keepers where local_id = ?”;
FMDatabase *db = [[DYDB sharedDB] connect];
BOOL ret = [db executeUpdate:sql, logkeeper.localId];
[db close];
return ret;
}
- (DYLogKeeper *) findById:(NSString *)localId {
DLog(@”find logkeeper by id: %@”, localId);
FMDatabase *db = [[DYDB sharedDB] connect];
FMResultSet *rs = [db executeQuery:@”select * from log_keepers where local_id = ?”, localId];
DYLogKeeper *ret;
if ([rs next]) {
ret = rs2logkeeper(rs);
}
[db close];
return ret;
}
+ (NSArray *) findOfStartDate: (NSDate *) start toDate:(NSDate *) toDate {
DLog(@”find logkeeper between date ….”);
NSString *sql = @”select * from log_keepers where add_time between ? and ?”;
FMDatabase *db = [[DYDB sharedDB] connect];
FMResultSet *rs = [db executeQuery:sql, start, toDate];
NSMutableArray *array = [NSMutableArray arrayWithCapacity:32];
while ([rs next]) {
DYLogKeeper *logkeeper = rs2logkeeper(rs);
[array addObject:logkeeper];
}
[rs close];
[db close];
return array;
}
@end

DYLogKeeper.h
Objective-C

1234567891011121314151617181920

#import <Foundation/Foundation.h>
@interface DYLogKeeper : NSObject
@property(strong, nonatomic) NSString *localId;
@property(strong, nonatomic) NSDate *addtime;
@property(strong, nonatomic) NSString *deviceId;
@property(strong, nonatomic) NSString *content;
@property(strong, nonatomic) NSString *logkeeperId;
@property(nonatomic) int deviceType;
@property(nonatomic) int channel;
@end

iOS中FMDB的使用【单例】的更多相关文章

  1. iOS中浅淡UIApplication单例-b

    在iOS的操作系统中 每一个程序都对应一个application单例,每一个application都对应一个Appdelegate代理,在代理中控制程序的各个状态.我们在程序中获取Applicatio ...

  2. RPCZ中的智能指针单例

    RPCZ中的智能指针单例 (金庆的专栏) 智能指针单例应用于 RPCZ 库以实现库的自动初始化与自动清理. RPCZ: RPC implementation for Protocol Buffers ...

  3. spring中如何向一个单例bean中注入非单例bean

    看到这个题目相信很多小伙伴都是懵懵的,平时我们的做法大都是下面的操作 @Component public class People{ @Autowired private Man man; } 这里如 ...

  4. iOS 页面间传值 之 单例传值 , block 传值

    ios 页面间传值有许多,前边已经分享过属性传值和代理传值,今天主要说一下单例传值和 block 传值 单例传值:单例模式一种常用的开发的模式,单例因为在整个程序中无论在何时初始化对象,获取到的都是同 ...

  5. c++单例模式为什么不在析构函数中释放静态的单例对象(转)

    需要清楚一下几点:   1.单例中的 new 的对象需要delete释放.   2.delete释放对象的时候才会调用对象的析构函数.   3.如果在析构函数里调用delete,那么程序结束时,根本进 ...

  6. springmvc中的controller是单例的

    今天发现spring3中的controller默认是单例的,若是某个controller中有一个私有的变量a,所有请求到同一个controller时,使用的a变量是共用的,即若是某个请求中修改了这个变 ...

  7. 【iOS】ARC-MRC下的单例及其应用

    单例的应用十分普遍,单例模式使一个类仅仅有一个实例. *易于供外界訪问. *方便控制实例个数,节约系统资源. *OC中的常见单例: 如:UIApplication,  NSNotificationCe ...

  8. IOS设计模式第二篇之单例设计模式

    现在我们的组件已经有组织了.你需要从其他的地方得到数据,你也可以创建一个API类管理数据这个下个设计模式单例里面介绍. 这个单例设计模式确保这个类仅仅拥有一个实例,并且为这个实例提供一个全局的访问点. ...

  9. Egret中的三种单例写法

    1 普通的单例写法 as3中也是这么个写法. 缺点:每个单例类里都要写instance和getInstance. class Single{ private static instance:Singl ...

  10. SpringMVC中的Controller默认单例

    众所周知,Servlet是单例的. 在struts中,Action是多例的,每一个请求都会new出来一个action来处理. 在Spring中,Controller默认是单例的,多个请求都会访问同一个 ...

随机推荐

  1. python3_mechanicalsoup

    python3_mechanicalsoup # !/usr/bin/python3.4 # -*- coding: utf-8 -*- import mechanicalsoup # 事实证明,这个 ...

  2. getDimension,getDimensionPixelOffset和getDimensionPixelSize的一点说明

    getDimension和getDimensionPixelOffset的功能类似, 都是获取某个dimen的值,但是如果单位是dp或sp,则需要将其乘以density 如果是px,则不乘.并且get ...

  3. 为App签名(为apk签名)

    为App签名(为apk签名) 原文地址 这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商 ...

  4. Google Play开发者账号注册与失败申诉攻略

    Google Play开发者账号注册与失败申诉攻略 这篇文章我在网上找了好久,是在Google play进行开发者账号注册方法,介绍的很详细.现在分享一下.[原文地址] 为了方便开发者们注册谷歌的官方 ...

  5. select case when

    SELECT CASE WHEN dc.defect_code_name IS NOT NULL THEN dc.defect_code_name WHEN sf.second_defect_leve ...

  6. C# MDI 子窗体被父窗体控件挡住

    using System.Runtime.InteropServices; [DllImport("user32")] public static extern int SetPa ...

  7. android学习笔记19——对话框(DatePickerDialog、TimePickerDialog)

    DatePickerDialog.TimePickerDialog ==> DatePickerDialog.TimePickerDialog功能.用法都比较简单,操作步骤: 1.通过new关键 ...

  8. QT显示中文的几个问题

    最近用QT,需要在界面上显示中文,发现QT无法直接在代码中写中文,只能通过曲线救国的方式,比如用QT语言家,QTextCodec的fromloca8bit 研究了半天,终于明白了一些编码的问题 1.V ...

  9. 【freemaker】之eclipse安装freemaker-IDE

    eclipse安装插件一般我喜欢手动安装,有种可控的感觉! 首先需要下载freemaker-IDEhttp://freemarker-ide.sourceforge.net/ 下载之后解压得到 在ec ...

  10. 解决RPM包相互依赖的有效方法

    出自:http://blog.csdn.net/kai27ks/article/details/7473683 前言:常用RPM的朋友们都知道,RPM简单易用,但是它的依赖关系是最头疼的!有时候比方说 ...