转发:http://wenku.baidu.com/link?url=LSPSZSPxN4pVwWNwqEXSoY0-jlnXq-_14C7qV1FV9_gFIMPjdKlXrG4Nrh_08EZS10IcYm3syaulljwJ0djvOjePa8Hl9Rq1GvZv50yz7bi

FMDB是用于进行数据存储的第三方的框架,它与SQLite与Core Data相比较,存在很多优势。

FMDB是面向对象的,它以OC的方式封装了SQLite的C语言API,使用起来更加的方便,不需要过多的关心数据库操作的知识。但是它本身也存在一些问题,比如跨平台,因为它是用oc的语言封装的,所以只能在ios开发的时候使用,如果想实现跨平台的操作,来降低开发的成本和维护的成本,就需要使用比较原始的SQLite。

Core Data是ORM的一种体现,使用Core Data需要用到模型数据的转化,虽然操作简单,不需要直接操作数据库,但是性能没有直接使用SQLite高。但是SQLite使用的时候需要使用c语言中的函数,操作比较麻烦,因此需要对它进行封装。但是如果只是简单地封装,很可能会忽略很多重要的细节,比如如何处理并发以及安全性更问题。

因此,在这里推荐使用第三方框架FMDB,它是对libsqlite3框架的封装,用起来的步骤与SQLite使用类似,并且它对于多线程的同时操作一个表格时进行了处理,也就意味着它是线程安全的。FMDB是轻量级的框架,使用灵活,它是很多企业开发的首选。
FMDB中重要的类

FMDatabase:一个FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句

FMResultSet:使用FMDatabase执行查询后的结果集

FMDatabaseQueue:用于在多线程中执行多个查询或更新,它是线程安全的

FMDB使用步骤

1. 下载FMDB文件 fmdb下载地址 ,将FMDB文件夹添加到项目中

2. 导入sqlite框架,导入FMDatabase.h文件

3.与SQLite使用步骤类似,需要获取数据库文件路径,然后获得数据库,并打开数据库,然后数据库进行操作,最后关闭数据库。代码如下所示:

1. // ViewController.m

2. // JRFMDB

3. //

4. // Created by jerehedu on 15/6/18.

5. // Copyright (c) 2015年 jerehedu. All rights reserved.

6. //

  1. 7.

8. #import "ViewController.h"

9. #import "FMDatabase.h"

    1. @interface ViewController ()
    2. @property (nonatomic, strong) FMDatabase *db;
    3. @end
    4. @implementation ViewController
    5. - (void)viewDidLoad
    6. {
    7. [super viewDidLoad];
    8. //导入sqlite框架,导入FMDB文件夹
    9. //1.获得数据库文件的路径
    10. NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    11. NSString *fileName=[doc stringByAppendingPathComponent:@"student.sqlite"];
    12. NSLog(@"fileName = %@",fileName);
    13. //2.获得数据库
    14. FMDatabase *db = [FMDatabase databaseWithPath:fileName];
    15. //3.打开数据库
    16. if ([db open]) {
    17. NSLog(@"ok");
    18. //4.创表
    19. BOOL result=[db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
    20. if (result) {
    21. NSLog(@"创表成功");
    22. }else{
    23. NSLog(@"创表失败");
    24. }
    25. }
    26. self.db=db;
    27. //插入数据
    28. [self insertStu];
    29. [self deleteStu:6];
    30. [self updateStu:@"apple7_name" :@"7777"];
    31. [self queryStu];
    32. [self dropStu];
    33. [self insertStu];
    34. [self queryStu];
    35. //6.关闭数据库
    36. [self.db close];
    37. }
    38. #pragma mark 插入数据
    39. -(void)insertStu
    40. {
    41. for (int i=0; i<10; i++)
    42. {
    43. NSString *name = [NSString stringWithFormat:@"1apple%i_name",i];
    44. int age = arc4random()%3+20;
    45. //1. executeUpdate : 不确定的参数用?来占位 (后面参数必须都是oc对象)
    46. [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?,?);",name,@(age)];
    47. //2. executeUpdateWithFormat : 不确定的参数用%@、%d等来占位 (参数为原始数据类型)
    48. // [self.db executeUpdateWithFormat:@"insert into t_student (name, age) values (%@, %i);",name,age];
    49. //3. 数组
    50. // [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?,?);" withArgumentsInArray:@[name,@(age)]];
    51. }
    52. }
    53. #pragma mark 删除数据
    54. -(void)deleteStu:(int)idNum
    55. {
    56. //a. executeUpdate : 不确定的参数用?来占位 (后面参数必须都是oc对象)
    57. // [self.db executeUpdate:@"delete from t_student where id=?;",@(idNum)];
    58. //b. executeUpdateWithFormat : 不确定的参数用%@、%d等来占位
    59. // [self.db executeUpdateWithFormat:@"delete from t_student where name=%@;",@"apple9_name"];
    60. }
    61. #pragma mark 销毁表格
    62. -(void)dropStu
    63. {
    64. [self.db executeUpdate:@"drop table if exists t_student;"];
    65. //4.创表
    66. BOOL result=[self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);"];
    67. if (result) {
    68. NSLog(@"再次创表成功");
    69. }else{
    70. NSLog(@"再次创表失败");
    71. }
    72. }
    73. #pragma mark 修改数据
    74. -(void)updateStu:(NSString *)oldName :(NSString*)newName
    75. {
    76. // [self.db executeUpdateWithFormat:@"update t_student set name=%@ where name=%@;",newName,oldName];
    77. [self.db executeUpdate:@"update t_student set name=? where name=?",newName,oldName];
    78. }
    79. #pragma mark 查询数据
    80. -(void)queryStu
    81. {
    82. //1.执行查询语句
    83. // FMResultSet *resultSet = [self.db executeQuery:@"select * from t_student;"];
    84. FMResultSet *resultSet = [self.db executeQuery:@"select * from t_student where id<?;",@(14)];
    85. //2.遍历结果集合
    86. while ([resultSet next]) {
    87. int idNum = [resultSet intForColumn:@"id"];
    88. NSString *name = [resultSet objectForColumnName:@"name"];
    89. int age = [resultSet intForColumn:@"age"];
    90. NSLog(@"id=%i ,name=%@, age=%i",idNum,name,age);
    91. }
    92. }
    93. - (void)didReceiveMemoryWarning
    94. {
    95. [super didReceiveMemoryWarning];
    96. // Dispose of any resources that can be recreated.
    97. }
    98. @end

iOSFMDB和CoreData的更多相关文章

  1. iOS基本数据库存储方式 - CoreData

    CoreData 创建模型文件的过程 1.选择模板 2.添加实体 3.添加实体的属性[注意]属性的首字母必须小写 一.CoreData管理类(必备以下三个类对象) 1.CoreData数据操作的上下文 ...

  2. iOS CoreData 中 objectID 的不变性

    关于 CoreData的 objectID 官方文档有这样的表述:新建的Object还没保存到持久化存储上,那么它的objectID是临时id,而保存之后,就是持久化的id,不会再变化了. 那么,我想 ...

  3. CoreData __ 基本原理

    操作过程 Context想要获取值,先要告诉连接器,我要什么东西 链接器再告诉store, 你给我什么东西, store去找 找到之后返回给链接器,链接器再返回给Context          Co ...

  4. iOS CoreData primitive accessor

    Given an entity with an attribute firstName, Core Data automatically generates firstName, setFirstNa ...

  5. 初识CoreData与详解

    Core Data数据持久化是对SQLite的一个升级,它是iOS集成的,在说Core Data之前,我们先说说在CoreData中使用的几个类. (1)NSManagedObjectModel(被管 ...

  6. CoreData教程

    网上关于CoreData的教程能搜到不少,但很多都是点到即止,真正实用的部分都没有讲到,而基本不需要的地方又讲了太多,所以我打算根据我的使用情况写这么一篇实用教程.内容将包括:创建entity.创建r ...

  7. CoreData和SQLite多线程访问时的线程安全

    关于CoreData和SQLite多线程访问时的线程安全问题 数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常 ...

  8. IOS数据存储之CoreData使用优缺点

    前言: 学习了Sqlite数据之后认真思考了一下,对于已经习惯使用orm数据库的开发者或者对sql语句小白的开发者来说该如何做好数据库开发呢?这个上网搜了一下?看来总李多虑了!apple 提供了一种数 ...

  9. iOS开发之表视图爱上CoreData

    在接触到CoreData时,感觉就是苹果封装的一个ORM.CoreData负责在Model的实体和sqllite建立关联,数据模型的实体类就相当于Java中的JavaBean, 而CoreData的功 ...

随机推荐

  1. DLL and LIB

    在StackOverflow中看到一个提问“what's the difference between DLL's and LIB's?” 有如下回复值得参考: 回复一:

  2. ASP.NET MVC 使用带有短横线的html Attributes

    我们常常需要一个文本框来输入用户名,在asp.net mvc 中可以使用 TextBoxFor.有时候我们想为这个文本框添加一些特性,比如 html5 的data-,如果直接写data-是会提示错误的 ...

  3. JS获取网页中HTML元素的几种方法分析

    getElementById getElementsByName getElementsByTagName 大概介绍 getElementById ,getElementsByName ,getEle ...

  4. Chapter 1 First Sight——29

    I was anxious not to be late for class on my first day. 在我第一天上学的时候我非常焦虑我会上课迟到. One of my new acquain ...

  5. poi的各种单元格样式以及一些常用的配置

    之前我做过一个poi到处excel数据的博客,但是,后面使用起来发现,导出的数据单元格样式都不对. 很多没有居中对齐,很多单元格的格式不对,还有就是单元格的大小不对,导致数据显示异常,虽然功能可以使用 ...

  6. 使用OpenCV查找二值图中最大连通区域

    http://blog.csdn.net/shaoxiaohu1/article/details/40272875 使用OpenCV查找二值图中最大连通区域 标签: OpenCVfindCoutour ...

  7. POJ 1258 Agri-Net(Prim)

    ( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<cmath> #include<algori ...

  8. hdu_5754_Life Winner Bo(博弈)

    题目链接:hdu_5754_Life Winner Bo 题意: 一个棋盘,有国王,车,马,皇后四种棋子,bo先手,都最优策略,问你赢的人,如果双方都不能赢就输出D 题解: 全部都可以直接推公式, 这 ...

  9. hdu_2089_不要62(数位DP)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:中文,不解释 题解:dp[i][j]表示当前第i位的前一个数为j,然后记忆化dfs,注意的 ...

  10. hdu_2141_Can you find it?(二分)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2141 题意:叫你找三个数,使得这三个数的值为X,如果找得到就输出YES否则输出NO,注意两个32位数相 ...