数据持久化(三)使用第三方类库FMDB
@SQLite是一种小型的轻量级的关系型数据库,在移动设备上使用是非常好的选择,无论是Android还是IOS,都内置了SQLite数据库,现在的版本都是SQLite3。在IOS中使用SQLite如果使用SDK提供的方法,特别麻烦也不利于理解和使用,感觉使用很不方便,今天就讲讲一个针对IOS的SQlite API封装的第三方库FMDB,FMDB对SDK中的API做了一层封装,使之使用OC来访问,使用方便而且更熟悉。FMDB的下载地址https://github.com/ccgus/fmdb。 @FMDB主要涉及两个类,FMDatabase和FMResultSet下载完FMDB源码后把文件拖到工程中,并导入SQLite支持 库,libsqlite3.0.dylib
#import "HMTDataBaseHandle.h" #import "FMDB.h" #import "HMTPerson.h" @implementation HMTDataBaseHandle static HMTDataBaseHandle * _dbHandle = nil; + (HMTDataBaseHandle *)shareInstance{ @synchronized(self){ if (!_dbHandle) { _dbHandle = [[HMTDataBaseHandle alloc]init]; [_dbHandle openDataBase]; [_dbHandle createTable]; } } return _dbHandle; } #pragma mark - 定义一个 FMDatabase 对象 static FMDatabase * database = nil; #pragma mark - 获得沙盒文件下Documents路径 - (NSString *)getDocumentsPath{ NSString * documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject]; return documents; } #pragma mark - 打开数据库操作------ databaseWithPath open - (void)openDataBase{ if (database) { return; } NSString * DataBasePath = [[self getDocumentsPath] stringByAppendingPathComponent:@"test.sqlite"]; database = [FMDatabase databaseWithPath:DataBasePath]; if (![database open]) { NSLog(@"打开数据库失败"); } // 为数据库设置缓存,提高查询效率 database.shouldCacheStatements = YES; NSLog(@"打开数据库成功"); } #pragma mark - 关闭数据库操作 - (void)closeDataBase{ if (![database close]) { NSLog(@"关闭数据库失败"); return; } database = nil; NSLog(@"关闭数据库成功"); } #pragma mark - 管理创建表的操作 - (void)createTable{ [self openDataBase]; // 判断表是否存在,不存在就创建------ tableExists if (![database tableExists:@"Person"]) { [database executeUpdate:@"CREATE TABLE Person(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,age INTEGER)"]; NSLog(@"创建表成功"); } [self closeDataBase]; } #pragma mark - 增加数据操作----- executeUpdate - (void)insertIntoDataBase:(HMTPerson *)person{ [self openDataBase]; [database executeUpdate:@" INSERT INTO Person (id,name,age) VALUES (?,?,?)",[NSString stringWithFormat:@"%i",person.personId],person.personName,person.personAge]]; [self closeDataBase]; } #pragma mark - 删除数据操作----- executeUpdate - (void)deleteDataFromDataBase:(HMTPerson *)person{ [self openDataBase]; [database executeUpdate:@" DELETE FROM Person WHERE id = ?",person.personId]]; [self closeDataBase]; } #pragma mark - 更新数据操作----- executeUpdate - (void)updateFromDataBase:(HMTPerson *)person{ [self openDataBase]; [database executeUpdate:@" UPDATE Person SET name = ? WHERE id = ?",person.personId]]; [self closeDataBase]; } #pragma mark - 查询数据操作(与其他的都不一样,查询是调用executeQuery,切记切记!!!!!!) - (void)selectAllDataFromDataBase{ [self openDataBase]; FMResultSet * resultSet = [database executeQuery:@" SELECT * FROM Person"]; while ([resultSet next]) { int Id = [resultSet intForColumn:@"id"]; NSString * name = [resultSet stringForColumn:@"name"]; int age = [resultSet intForColumn:@"age"]; NSLog(@"personId:%i,personName:%@,personAge:%i",Id,age); } [self closeDataBase]; } @end @FMDB提供如下多个方法来获取不同类型的数据: 1.intForColumn: 2.longForColumn: 3.longLongIntForColumn: 4.boolForColumn: 5.doubleForColumn: 6.stringForColumn: 7.dateForColumn: 8.dataForColumn: 9.dataNoCopyForColumn: 10.UTF8StringForColumnIndex: 11.objectForColumn:
@如果我们的app需要多线程操作数据库,那么就需要使用FMDatabaseQueue来保证线程安全了。切记不能在多个线程中共同一个FMDatabase对象并且在多个线程中同时使用,这个类本身不是线程安全的,这样使用会造成数据混乱等问题。 使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。在闭包中操作数据库,而不直接参与FMDatabase的管理。 [cpp] view plain copy
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 关于2.6 的 spi驱动,spidev,使用从设备.
- cocos2d-x游戏开发(十六)帧动画
- TRACE32调试技巧
- ajax – HighCharts – 如何创建导出EVERYTHING的动态图表
- 有人可以用几句话解释这些技术的相关性:Flex,Flash,Air,Ac
- 【Oracle】batchupdate每次处理到少条记录比较好呢?
- c# – 如何绑定到控件的实际宽度(包括其边距)?
- ruby-on-rails – 在哈希数组中查找值以创建新的哈希数组
- ruby-on-rails – 如何将LESS文件添加到rails应用程序
- iphone – xcode:如何在编译/构建阶段保存“documents”文