工具:火狐浏览器+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. Nginx概念及基础安装--详细讲解

    1.主要内容: Nginx的基础           特性           配置部署           优化(了解) 2.Nginx 是什么? Nginx是一个开源的,支持高性能,高并发的www ...

  2. Html 两个DIV并排的问题

    在一个容器内部,要放在两个并排的DIV,两个方法: 1.使用浮动.这个方式div是脱离文档流的,在窗口布局复杂,大小变化的时候,可能会有一些不希望的情况发生. <!DOCTYPE HTML> ...

  3. InnoDB全文索引:N-gram Parser【转】

    本文来自:http://mysqlserverteam.com/innodb%E5%85%A8%E6%96%87%E7%B4%A2%E5%BC%95%EF%BC%9An-gram-parser/ In ...

  4. 动态选路、RIP协议&&OSPF协议详解

    动态选路.RIP协议&&OSPF协议详解 概念 当相邻路由器之间进行通信,以告知对方每个路由器当前所连接的网络,这时就出现了动态选路.路由器之间必须采用选路协议进行通信,这样的选路协议 ...

  5. 开发Visual Studio 插件

    新建项目,在其他项目类型中找到扩展性,然后新建Visual Studio外接程序,VS中没有这个要安装SDK,http://yunpan.cn/cd27eNczKREwd (提取码:ab29)去下载 ...

  6. 移动硬盘安装win7,蓝屏,0x0000007B

    @echo offecho 加载注册表echo.reg load HKLM\sys %1\WINDOWS\system32\config\system >nul 2>nulif error ...

  7. kNN算法python实现和简单数字识别

    kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单 ...

  8. 基于hk2框架的功能测试Mock注入

    public Object getInstance(Class<?> clz){ return IocBean.get(clz.getName()); } public Object Mo ...

  9. Java基础知识点2:hashCode()方法

    hashCode()方法基本实现 hashCode方法是Java的Object类所定义的几个基本方法之一.我们可以深入到Object类的源码中去查看: public native int hashCo ...

  10. iOS--关于同步下载

    { NSMutableArray *_dataList; } [self loadDataWithPage:]; [self loadDataWithURLConnection]; //记得初始化数组 ...