数据持久化(三)使用第三方类库FMDB

来源:互联网 发布:淘宝助理更新类目 编辑:程序博客网 时间:2024/06/05 10:56

@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


[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #import "HMTDataBaseHandle.h"  
  2. #import "FMDB.h"  
  3. #import "HMTPerson.h"  
  4.   
  5.   
  6. @implementation HMTDataBaseHandle  
  7.   
  8. static HMTDataBaseHandle * _dbHandle = nil;  
  9. + (HMTDataBaseHandle *)shareInstance{  
  10.   
  11.     @synchronized(self){  
  12.       
  13.         if (!_dbHandle) {  
  14.               
  15.             _dbHandle = [[HMTDataBaseHandle alloc]init];  
  16.               
  17.             [_dbHandle openDataBase];  
  18.               
  19.             [_dbHandle createTable];  
  20.         }  
  21.     }  
  22.       
  23.     return _dbHandle;  
  24. }  
  25.   
  26. #pragma mark - 定义一个 FMDatabase 对象  
  27. static FMDatabase * database = nil;  
  28.   
  29. #pragma mark - 获得沙盒文件下Documents路径  
  30. - (NSString *)getDocumentsPath{  
  31.   
  32.     NSString * documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];  
  33.   
  34.     return documents;  
  35. }  
  36.   
  37. #pragma mark - 打开数据库操作------ databaseWithPath   open  
  38. - (void)openDataBase{  
  39.   
  40.     if (database) {  
  41.         return;  
  42.     }  
  43.       
  44.     NSString * DataBasePath = [[self getDocumentsPath] stringByAppendingPathComponent:@"test.sqlite"];  
  45.       
  46.     database = [FMDatabase databaseWithPath:DataBasePath];  
  47.     if (![database open]) {  
  48.           
  49.         NSLog(@"打开数据库失败");  
  50.     }  
  51.       
  52.     // 为数据库设置缓存,提高查询效率  
  53.     database.shouldCacheStatements = YES;  
  54.       
  55.     NSLog(@"打开数据库成功");  
  56. }  
  57.   
  58. #pragma mark - 关闭数据库操作  
  59. - (void)closeDataBase{  
  60.   
  61.     if (![database close]) {  
  62.         NSLog(@"关闭数据库失败");  
  63.         return;  
  64.     }  
  65.       
  66.     database = nil;  
  67.     NSLog(@"关闭数据库成功");  
  68.   
  69. }  
  70.   
  71. #pragma mark - 管理创建表的操作  
  72. - (void)createTable{  
  73.   
  74.     [self openDataBase];  
  75.   
  76.     // 判断表是否存在,不存在就创建------ tableExists  
  77.     if (![database tableExists:@"Person"]) {  
  78.           
  79.         [database executeUpdate:@"CREATE TABLE Person(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)"];  
  80.           
  81.         NSLog(@"创建表成功");  
  82.     }  
  83.       
  84.     [self closeDataBase];  
  85. }  
  86.   
  87.   
  88. #pragma mark - 增加数据操作----- executeUpdate  
  89. - (void)insertIntoDataBase:(HMTPerson *)person{  
  90.   
  91.     [self openDataBase];  
  92.       
  93.     [database executeUpdate:@" INSERT INTO Person (id,name,age) VALUES (?,?,?)",[NSString stringWithFormat:@"%i",person.personId],person.personName,[NSString stringWithFormat:@"%i",person.personAge]];  
  94.   
  95.     [self closeDataBase];  
  96. }  
  97.   
  98. #pragma mark - 删除数据操作----- executeUpdate  
  99. - (void)deleteDataFromDataBase:(HMTPerson *)person{  
  100.   
  101.     [self openDataBase];  
  102.   
  103.     [database executeUpdate:@" DELETE FROM Person WHERE id = ?",[NSString stringWithFormat:@"%i",person.personId]];  
  104.       
  105.     [self closeDataBase];  
  106. }  
  107.   
  108. #pragma mark - 更新数据操作----- executeUpdate  
  109. - (void)updateFromDataBase:(HMTPerson *)person{  
  110.   
  111.     [self openDataBase];  
  112.       
  113.     [database executeUpdate:@" UPDATE Person SET name = ? WHERE id = ?",person.personName,[NSString stringWithFormat:@"%i",person.personId]];  
  114.   
  115.     [self closeDataBase];  
  116. }  
  117.   
  118. #pragma mark - 查询数据操作(与其他的都不一样,查询是调用executeQuery,切记切记!!!!!!)  
  119. - (void)selectAllDataFromDataBase{  
  120.   
  121.     [self openDataBase];  
  122.   
  123.     FMResultSet * resultSet = [database executeQuery:@" SELECT * FROM Person"];  
  124.     while ([resultSet next]) {  
  125.           
  126.         int Id = [resultSet intForColumn:@"id"];  
  127.         NSString * name = [resultSet stringForColumn:@"name"];  
  128.         int age = [resultSet intForColumn:@"age"];  
  129.           
  130.         NSLog(@"personId:%i,personName:%@,personAge:%i",Id,name,age);  
  131.     }  
  132.       
  133.     [self closeDataBase];  
  134. }  
  135.   
  136.   
  137. @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 plaincopy
  1. -(void)executeDBOperation  
  2. {  
  3.     //获取Document文件夹下的数据库文件,没有则创建  
  4.     NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];  
  5.     NSString *dbPath = [docPath stringByAppendingPathComponent:@"user.db"];  
  6.       
  7.     FMDatabaseQueue *databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath];  
  8.     [databaseQueue inDatabase:^(FMDatabase *db){  
  9.     [db executeUpdate:@"insert into user values (?,?,?)",@"Ren",@"Male",[NSNumber numberWithInt:20]];  
  10.     }];  
  11.     [databaseQueue close];  
  12. }  
0 0
原创粉丝点击