工具:火狐浏览器+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. ListView加checkBox可以实现全选等功能

    1.效果图 2.LIteView_item布局 <?xml version="1.0" encoding="utf-8"?> <Relativ ...

  2. 毛笔笔锋算法IOS版

    http://www.merowing.info/2012/04/drawing-smooth-lines-with-cocos2d-ios-inspired-by-paper/#.VUln2_mqp ...

  3. K3中间层配置不成功 kdsvrmgr组件不工作 问题 客户端需要检查的设置

    苏州K3刘保平电脑安装的K3装有中间层组件,导致中间层死配都配不成功  以后中间层配置不成功的时候除了检查能否访问K3服务器之外,还要检查一下是否安装了中间层http://wenku.baidu.co ...

  4. Ubuntu设置环境变量 16.04

    打开终端并输入: sudo gedit /etc/environment. 2 输入用户密码.这时输入的密码是不可见的. 3 如图,在PATH="...."的末尾处添加: :/op ...

  5. .NET LINQ基本查询操作

    获取数据源      在 LINQ 查询中,第一步是指定数据源.像在大多数编程语言中一样,在 C# 中,必须先声明变量,才能使用它.在 LINQ 查询中,最先使用 from 子句的目的是引入数据源 ( ...

  6. 导入excel数据到数据库

    1.上传excel到服务器 jsp页面代码 <form action="actionname" method="post" id="form1& ...

  7. HTML5本地缓存数据

    //HTML5本地缓存数据 function putObj(key, data) { if (!!window.localStorage) { var obj = { "key": ...

  8. linux 下如何 makefile

    本文目的: 尝试着把makefile讲解清楚.非原创,仅仅是学习笔记和备忘录之用. makefile 的目的和好处: 一个工程中的源文件不计数,其按类型.功能.模块分别放在若干个目录中,makefil ...

  9. 【CentOS】正则表达式

    1.grep  [-cinvABC]  'word'  filename -c :打印符合要求的行数 --color:显示颜色 -i :忽略大小写(ignore) -n :在输出符合要求的行的同时连同 ...

  10. 使用lnmp一键安装包后yum源出现的问题与解决

    遇到一个问题就是执行 Yum update 或使用yum安装软件等命令的时候会有一个链接报404,使用find查找到该链接与kbsingh-CentOS-Extras.repo这个包有关,删除后yum ...