工具:火狐浏览器+SQLite Manager插件 ; Xcode; FMDB库;

效果:

项目地址: https://github.com/sven713/PackFMDB

主要参考这两篇博客:

1. http://www.jianshu.com/p/dd170b1cbc3b iOS 基于FMDB简单封装

2. http://www.jianshu.com/p/54e74ce87404# FMDB的使用方法(附Demo)

使用步骤:

1.在工程中导入  libsqlite3.tdb

2.从GitHub下载FMDB库,拖到项目中(或者使用cocoaPods安装)  https://github.com/ccgus/fmdb

3.新建一个类,用于封装FMDB,封装一层肯定比直接使用要好一点,但是我这项目没有封装好,还要再调整. 不封装的话就直接使用  FMDatabase 这个类了.

  参考这个博客,http://www.jianshu.com/p/dd170b1cbc3b 只封装了下面一些简单的接口:

#import <Foundation/Foundation.h>
#import "FMDB.h"
/**
封装了FMDB的工具类
*/
@interface FMDBHelp : NSObject @property (nonatomic, strong) FMDatabase *dataBase; //!<数据库对象 /**
支持外界自定义数据库文件名 @param dbName 自定义的数据库文件名
*/
- (void)createDBWithName:(NSString *)dbName; /**
没有返回结果 @param sql sql语句
@return YES NO
*/
- (BOOL)noResultSetWithSql:(NSString *)sql; /**
有返回结果 @param sql sql
@return 返回字典数组
*/
- (NSArray<NSDictionary *> *)queryWithSql:(NSString *)sql; /**
单例 @return FMDBHelper
*/
+(instancetype)shareInstance; //- (void)insertTableName:(NSString *)tableName propertyKeyArray:(NSArray *)key value:(NSString *)values; /**
*@brief 插入一個實體---参考HDF这个接口还不能用!!!!!
*@param entity -要插入的實體,含有結果值的實體,設置用
*@return 操作成功與否
*/
- (BOOL)insert:(id)entity tableName:(NSString *)tableName; @end

就 queryWithSql 这个方法用的比较多,封装的可以用, 另外就是建表的时候用的一下第一个方法 createDBWithName

最后一个方法参考老东家的代码,没整好,还不能用

总之,这个封装非常不完全,至少还要封装出增删改查四个接口

4.继承UITableViewController,用死数据搭建UI

5.在FMDBHelp类的基础上再封装一个工具类:PersonCarDataBaseHelper 人车数据库工具类, 所有控制器直接调用这个工具类的方法实现数据库的增删改查,这个类只能用于这个项目,其他项目还是要使用FMDB的API

  PersonCarDataBaseHelper 接口如下:

#import <Foundation/Foundation.h>
@class People;
@class Car; /**
人车数据库工具类
*/
@interface PersonCarDataBaseHelper : NSObject /**
添加人物------增 @param people 被加入的人物
*/
- (void)addPerson:(People *)people; /**
获取人物列表----查 @return 人物列表数组
*/
- (NSMutableArray *)getPersonArray; /**
删除人物-------删 @param person 被删除的人物
*/
- (void)deletePerson:(People *)person; /**
删除某人的车---删 @param car 被删除的车
@param person 车所属的人
*/
- (void)deletCar:(Car *)car owner:(People *)person; /**
向某人添加小车----增 @param car 新添加小车
@param person 车主
*/
- (void)addCar:(Car *)car toPerson:(People *)person; /**
查询某人拥有的车-----查
@param person 谁的车
*/
- (NSMutableArray *)getCarFromPerson:(People *)person; /**
修改person模型--改 @param people 被修改的person
*/
- (void)updatePerson:(People *)people; /**
两表关联查询----查 @return 查询结果数组
*/
- (NSMutableArray *)queryTwoTable; +(instancetype)shareInstance;
@end

倒数第二个接口,  两表关联查询----查 里面的Sql语句是写死的,应该再封装一下

6.增加人接口的实现:

  先打开数据库,然后执行sql语句,最后再关闭数据库

  直接调用FMDB的 - (BOOL)executeUpdate:(NSString*)sql, ...;这个方法(增)

- (void)addPerson:(People *)people {

    [[FMDBHelp shareInstance].dataBase open];

    NSNumber *maxID = @();

    FMResultSet *res = [[FMDBHelp shareInstance].dataBase executeQuery:@"SELECT * FROM person "];
//获取数据库中最大的ID
while ([res next]) { // 第一次循环没有next,不会走进去这个判断,maxID就是1 这个循环的作用就是拿到最后一个person_id,再加一,往后添加
if ([maxID integerValue] < [[res stringForColumn:@"person_id"] integerValue]) { // [res stringForColumn:@"person_id"]第一次是nil
maxID = @([[res stringForColumn:@"person_id"] integerValue] ) ; // 如果maxID比personId小,就让maxID = personID person_id从1开始的?
}
}
maxID = @([maxID integerValue] + ); [[FMDBHelp shareInstance].dataBase executeUpdate:@"INSERT INTO person(person_id,person_name,person_age,person_updateTime)VALUES(?,?,?,?)",maxID,people.name,@(people.age),@()]; [[FMDBHelp shareInstance].dataBase close];
}

7.查询所有的人:

  先打开数据库,然后执行sql语句,最后再关闭数据库

  调用的自己封装的方法 queryWithSql(其实是封装的FMDB的 - (FMResultSet *)executeQuery:(NSString*)sql, ...;),对于不用传参数的,可以直接使用封装的方法,传入Sql语句就可以执行了,返回查询结果

- (NSMutableArray *)getPersonArray {
NSArray *arr = [[FMDBHelp shareInstance] queryWithSql:@"SELECT * FROM person"];
NSMutableArray *resultArr = [NSMutableArray array];
for (NSDictionary *dict in arr) {
People *person = [[People alloc]init];
person.name = [dict objectForKey:@"person_name"];
person.age = [[dict objectForKey:@"person_age"] integerValue];
person.ID = [dict objectForKey:@"person_id"]; // person_id-->maxID-->person.ID
person.updateTime = [[dict objectForKey:@"person_updateTime"] integerValue];
[resultArr addObject:person];
}
return resultArr;
}

8.删除某个人:

  直接调用FMDB的API - (BOOL)executeUpdate:(NSString*)sql, ...;

- (void)deletePerson:(People *)person {
// 打开
[[FMDBHelp shareInstance].dataBase open];
// 执行
[[FMDBHelp shareInstance].dataBase executeUpdate:@"DELETE FROM person WHERE person_id = ?", person.ID]; // executeQuery不行
// 关闭
[[FMDBHelp shareInstance].dataBase close];
}

9. 修改某个人的年龄:

  直接调用FMDB的API - (BOOL)executeUpdate:(NSString*)sql, ...;

- (void)updatePerson:(People *)people {
FMDatabase *db = [FMDBHelp shareInstance].dataBase;
[db open];
NSNumber *updateNum = @(people.updateTime + );
[db executeUpdate:@"UPDATE 'person' SET person_updateTime = ? WHERE person_id = ?", updateNum, people.ID];
[db executeUpdate:@"UPDATE 'person' SET person_age = ? WHERE person_id = ?", @(people.age),people.ID];
[db close];
}

总结:  只有查询的时候用  - (FMResultSet *)executeQuery:(NSString*)sql, ...;

    其他时候用  - (BOOL)executeUpdate:(NSString*)sql, ...;

10. 给某人增加车:

  跟增加人类似,使用FMDB:- (BOOL)executeUpdate:(NSString*)sql, ...;     但是要先从人的表里面查出特定人的车

  车的own_id = person.ID,将own_id跟person.ID关联

/**增加车*/
- (void)addCar:(Car *)car toPerson:(People *)person {
FMDatabase *db = [FMDBHelp shareInstance].dataBase;
[db open];
NSString *sql = [NSString stringWithFormat:@"SELECT * FROM car WHERE own_id = %@",person.ID];
FMResultSet *resultSet = [db executeQuery:sql];
NSInteger maxID = ;
while ([resultSet next]) { // while 写成了 if 循环就走一次,造成carID是相同
if (maxID < [resultSet stringForColumn:@"car_id"].integerValue) {
maxID = [resultSet stringForColumn:@"car_id"].integerValue;
}
}
maxID = maxID + ;
// NSNumber *max = [NSNumber numberWithInteger:maxID];
[db executeUpdate:@"INSERT INTO car(own_id,car_id,car_brand,car_price)VALUES(?,?,?,?)",person.ID,@(maxID),car.brand,@(car.price)]; // own_id == person_id car_id == maxID
// maxID递增,car_id也递增 car_id作用类似person_id
[db close];
}

11. 默认买车(增):

  跟增加人类似,直接用FMDB API - (BOOL)executeUpdate:(NSString*)sql, ...; 但是要传查询人的id

12.查询某人拥有的车(查):

  跟查询人类似,可以用封装的方法(里面是FMDB的 - (FMResultSet *)executeQuery:(NSString*)sql, ...;),但是sql语句要传查询人的id.

13.删除某人拥有的车(删):

  跟删除人类似,直接用FMDB API  - (BOOL)executeUpdate:(NSString*)sql, ...;, 要多传一个参数 person_id

14. 多表关联查询:

  用自己封装的API [[FMDBHelp shareInstance]queryWithSql:sql]; 前提是写对传入的sql语句,person_id写死了,没有封装,只是用了一下

- (NSMutableArray *)queryTwoTable {
NSMutableArray *arrMu = [NSMutableArray array]; NSString *sql = @"SELECT person.person_name,car.id,car.car_brand FROM car,person where car.own_id = person.id and person.id=1";
arrMu = [[[FMDBHelp shareInstance]queryWithSql:sql] copy];
return arrMu;
}

FMDB简单封装和使用的更多相关文章

  1. iOS sqlite 增删改查 简单封装(基于 FMDB)

    /** *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * *  基于 FMDB * *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...

  2. iOS开发数据库篇—FMDB简单介绍

    iOS开发数据库篇—FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来 ...

  3. 对FMDB的封装JRDB

    在自己开发中,每次用到数据库都会纠结是使用CoreData还是FMDB.CoreData虽然Api简单,但是调用栈非常复杂,要初始化一个Context需要至少20行代码.显然,对于这种这么恶心的情况, ...

  4. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

    前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...

  5. Android--Retrofit+RxJava的简单封装(三)

    1,继续接着上一篇的讲讲,话说如果像上一篇这样的话,那么我们每一次请求一个结构都要创建一堆的Retrofit对象,而且代码都是相同的,我们可以试试封装一下 先创建一个HttpMethods类,将Ret ...

  6. okhttp3 get post 简单封装

    最近打算在新项目中使用 okhttp3, 简单封装了一下异步 get post 因为 CallBack 也是在子线程中执行,所以用到了 Handler public class MyOkHttpCli ...

  7. python网页请求urllib2模块简单封装代码

    这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...

  8. 对pymysql的简单封装

    #coding=utf-8 #!/usr/bin/python import pymysql class MYSQL: """ 对pymysql的简单封装 "& ...

  9. iOS开发——UI篇OC篇&UITableView简单封装

    UITableView简单封装 UITableView时iOS开发中使用最多也是最重的一个UI空间,其实在App Store里面的%80以上的应用都用到了这个控件,所以就给大家介绍一下,前面的文章中也 ...

随机推荐

  1. 【转载】实时监听输入框值变化的完美方案:oninput & onpropertychange

    oninput 是 HTML5 的标准事件,对于检测 textarea, input:text, input:password 和 input:search 这几个元素通过用户界面发生的内容变化非常有 ...

  2. Socket通信(二)

    程序下载地址: http://download.csdn.net/detail/u010312811/9683748 1.基本流程 服务器:(1)用指定的端口号和服务器的IP建立一个EndPoint对 ...

  3. 进程互斥和fork

    自父进程继承 进程的资格(真实(real)/有效(effective)/已保存(saved) 用户号(UIDs)和组号(GIDs)) 环境(environment) 堆栈 内存 打开文件的描述符(注意 ...

  4. Shell判断字符串包含关系的几种方法

    现在每次分析网站日志的时候都需要判断百度蜘蛛是不是真实的蜘蛛,nslookup之后需要判断结果中是否包含“baidu”字符串 以下给出一些shell中判断字符串包含的方法,来源程序员问答网站 stac ...

  5. 16进制ascii码转化为对应的字符,付ipmitool查询硬件信息

    最近工作需要在用ipmitool查询服务器硬件信息.ipmitool查询硬件信息 比如电源,使用命令: 获取PSU0信息:Ipmitool raw 0x3a 0x71 0x00: 获取PSU1信息:I ...

  6. 配置VNC

    VNC连接Linux桌面,要想连接Linux远程桌面,按照下面的步骤,非常简单.快速,Linux配置VNC(以RedHat.CentOS.Fedora系列为例). 工具/原料 Linux平台安装VNC ...

  7. Java中的位运算

    昨天去面试的时候做到了一道Java的位运算题目,发现有个运算符不懂:">>>",今天特地查了一下,并小结一下常见的位运算符号: ~  按位非(NOT)(一元运算) ...

  8. Linux常用命令学习2---(文件搜索命令locate find、命令搜索命令whereis which、字符串搜索命令grep、帮助命令man)

     1.文件搜索命令:locate [文件名]    在后台数据库中按文件名搜索,搜索速度比find快,耗费资源更少    例子:locate test.txt,就会显示文件名包含 test.txt的所 ...

  9. ASP.NET Web API 提升性能的方法实践

    ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...

  10. winform用户控件、动态创建添加控件、timer控件、控件联动

    用户控件: 相当于自定义的一个panel 里面可以放各种其他控件,并可以在后台一下调用整个此自定义控件. 使用方法:在项目上右键.添加.用户控件,之后用户控件的编辑与普通容器控件类似.如果要在后台往窗 ...