工具:火狐浏览器+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. Microsoft.AspNet.SignalR 2.2

    Nuget :http://www.nuget.org/packages/Microsoft.AspNet.SignalR/ What is SignalR? ASP.NET SignalR is a ...

  2. sharepoint OWA问题解决

    请检查DNS   检查域名解析   cmd----nslookup---输入IP或者域名(计算机名)可以看到

  3. currentColor-CSS3非常有用的变量

    一.currentColor-简介 currentColor顾名思意就是“当前颜色”,准确讲应该是“当前的文字颜色”,例如: .xxx { border: 1px solid currentColor ...

  4. [BI项目记]-搭建代码管理环境之云端

    这一篇主要介绍云端的TFS.微软在云端解决方案为我们提供了不错的选择,当本地的资源无法满足部署一个TFS的环境的时候,在互联网连接允许的情况下,可以考虑使用Visual Studio Online. ...

  5. jquery placeholder

    /* * @author ambar * html5 placeholder pollfill * - 使用绝对定位内嵌层 * - 也适用于密码域 * 目标浏览器: IE 6~9, FF 3.5 */ ...

  6. Epub基础知识介绍

    转载自:http://www.cnblogs.com/linlf03/archive/2011/12/13/2286218.html 一.什么是epub epub是一个完全开放和免费的电子书标准.它可 ...

  7. 注解:【基于主键的】Hibernate1->1关联

    参考:http://blog.sina.com.cn/s/blog_674b23220100hjb5.html Husband.java package org.crazyit.app.domain; ...

  8. Zookeeper分布式集群搭建

    实验条件:3台安装linux的机子,配置好Java环境. 步骤1:下载并分别解包到每台机子的/home/iHge2k目录下,附上下载地址:http://mirrors.cnnic.cn/apache/ ...

  9. pointers on c (day 1,chapter2)

    交叉编译器(cross complier)就是在一台机器上运行,但它所产生的可执行代码运行在不同类型的机器上. 翻译阶段由几个步骤组成,组成一个程序的每一(有可能有多个)源文件通过编译过程分别转换成目 ...

  10. 解决Win8无法升级.NET Framework 3.5.1 提示错误0x800F0906

    搞了好久,发现了这篇文,很清晰,就引用了过来.http://www.xdowns.com/article/239/Article_3065.html 起因是windows8.1装oracle10g提示 ...