{"id":25168359,"url":"https://github.com/fidetro/ffdb","last_synced_at":"2025-05-01T13:41:27.129Z","repository":{"id":56910393,"uuid":"85844178","full_name":"Fidetro/FFDB","owner":"Fidetro","description":"ORM database,is build on top of FMDB","archived":false,"fork":false,"pushed_at":"2024-03-19T14:30:58.000Z","size":2816,"stargazers_count":20,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-21T08:13:32.157Z","etag":null,"topics":["cocoapod-pod","cocoapods","fmdb","fmdb-ffdb","ios","orm","pod","sqlite"],"latest_commit_sha":null,"homepage":"","language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Fidetro.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-03-22T15:24:34.000Z","updated_at":"2024-03-19T03:30:19.000Z","dependencies_parsed_at":"2025-02-09T07:17:04.979Z","dependency_job_id":"a561537d-1a66-41c5-bb99-b7534530e740","html_url":"https://github.com/Fidetro/FFDB","commit_stats":null,"previous_names":[],"tags_count":43,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fidetro%2FFFDB","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fidetro%2FFFDB/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fidetro%2FFFDB/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Fidetro%2FFFDB/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Fidetro","download_url":"https://codeload.github.com/Fidetro/FFDB/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251882740,"owners_count":21659322,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cocoapod-pod","cocoapods","fmdb","fmdb-ffdb","ios","orm","pod","sqlite"],"created_at":"2025-02-09T07:17:02.509Z","updated_at":"2025-05-01T13:41:27.121Z","avatar_url":"https://github.com/Fidetro.png","language":"Objective-C","readme":"# FFDB\n[![DUB](https://img.shields.io/dub/l/vibe-d.svg)](https://github.com/Fidetro/FFDB/blob/master/LICENSE)\n[![GitHub stars](https://img.shields.io/github/stars/Fidetro/FFDB.svg)](https://github.com/Fidetro/FFDB/stargazers)  \n[更详细的使用介绍在WiKi](https://github.com/Fidetro/FFDB/wiki)\n\n\n# 前言  \n原本已经打算弃坑的OC版FFDB，因为[SwiftFFDB](https://github.com/Fidetro/Swift-FFDB)的一轮重构之后，决定把OC版的也进行重构，主要是针对sql语句这部分的拼接进行了优化，参考了sqlite3的[语法设计](http://www.sqlite.org/syntaxdiagrams.html)，总而言之变得更优雅了,同时，4.x的版本使用的是参数化查询，用来防注入。\n\n1.x的文档请移步\n[这里](https://github.com/Fidetro/FFDB/blob/master/1.x_README.md)  \n\n2.x的文档请移步\n[这里](https://github.com/Fidetro/FFDB/blob/master/2.x_README.md)  \n\n3.x的文档请移步\n[这里](https://github.com/Fidetro/FFDB/blob/master/3.x_README.md)  \n\n# 正文\n- [为什么会有FFDB？](#为什么会有FFDB？)\n- [CoreData、Realm和对FMDB封装后的FFDB对比](#CoreData、Realm和对FMDB封装后的FFDB对比)\n- [适合在什么地方使用以及优势](#适合在什么地方使用以及优势)\n- [怎么使用？如何集成？(请直接戳我)](#怎么使用？如何集成？)\n- [2.x和3.x的版本有什么不同？](#2.x和3.x的版本有什么不同？)\n- [补充](#补充)\n- [Pod版本更新说明](#Pod版本更新说明)\n- [UML类图](#UML类图)\n\n\u003ch2 id=\"为什么会有FFDB？\"\u003e为什么会有FFDB？\u003c/h2\u003e\n\n1. 直接用FMDB代码并不优雅而且十分繁琐，而且并不能像使用CoreData能面向对象管理;\n2. 在项目中经常会遇到不得不使用数据库去存储数据的情况；\n3. 主流的移动端数据库，用过的只有FMDB，CoreData，CoreData在使用的时候觉得要写太多代码了，后来放弃了，只用FMDB的话，没有使用ORM的方便，所以有了FFDB。  \n\n\u003ch2 id=\"CoreData、Realm和对FMDB封装后的FFDB对比\"\u003eCoreData、Realm和对FMDB封装后的FFDB对比\u003c/h2\u003e\n\n下面这部分代码出自于Realm的文档\n\n[从这里你可以找到](https://realm.io/news/migrating-from-core-data-to-realm)\n\n```\nCoreData插入对象\n//Create a new Dog\nDog *newDog = [NSEntityDescription insertNewObjectForEntityForName:@\"Dog\" inManagedObjectContext:myContext];\nnewDog.name = @\"McGruff\";\n\n//Save the new Dog object to disk\nNSError *saveError = nil;\n[newDog.managedObjectContext save:\u0026saveError];\n\n//Rename the Dog\nnewDog.name = @\"Pluto\";\n[newDog.managedObjectContext save:\u0026saveError];\n```\n\n```\nRealm插入对象\n//Create the dog object\nDog *newDog = [[Dog alloc] init];\nnewDog.name = @\"McGruff\";\n\n//Save the new Dog object to disk (Using a block for the transaction)\nRLMRealm *defaultRealm = [RLMRealm defaultRealm];\n[defaultRealm transactionWithBlock:^{\n[defaultRealm addObject:newDog];\n}];\n\n//Rename the dog (Using open/close methods for the transaction)\n[defaultRealm beginWriteTransaction];\nnewDog.name = @\"Pluto\";\n[defaultRealm commitWriteTransaction];\n```\n```\n\nFFDB插入对象\nDog *newDog = [[Dog alloc] init];\nnewDog.name = @\"McGruff\";\n[newDog insertObject];\n//重命名狗，更新对象\nnewDog.name = @\"Pluto\";\n[newDog updateObject];\n```\n```\nCoreData查询\nNSManagedObjectContext *context = self.managedObjectContext;\n\n//A fetch request to get all dogs younger than 5 years old, in alphabetical order\nNSEntityDescription *entity = [NSEntityDescription\nentityForName:@\"Dog\" inManagedObjectContext:context];\n\nNSPredicate *predicate = [NSPredicate predicateWithFormat:@\"age \u003c 5\"];\n\nNSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@\"name\" ascending:YES];\n\nNSFetchRequest *request = [[NSFetchRequest alloc] init];\nrequest.entity = entity;\nrequest.predicate = predicate;\nrequest.sortDescriptors = @[sortDescriptor];\n\nNSError *error;\nNSArray *dogs = [moc executeFetchRequest:request error:\u0026error];\n```\n```\nRealm查询对象\nRLMResults *dogs = [[Dog objectsWhere:@\"age \u003c 5\"] sortedResultsUsingProperty:@\"name\" ascending:YES];\n```\n\n```\nFFDB查询对象\nNSArray\u003cDog *\u003e *dogs = [Dog selectFromClassWhereFormat:@\"where age \u003c ? order by name\" values:@[@\"5\"]];\n```\n\n\u003e 类相当于一张表，对象即数据，这句话贯穿整个设计的思路\n\n\n\n\u003ch2 id=\"适合在什么地方使用以及优势\"\u003e适合在什么地方使用以及优势？\u003c/h2\u003e\n\n1. 数据量大，NSUserDefault和plist都不能满足的时候；\n2. 对基础数据库语句不太懂的同学；\n3. 不需要对数据库进行很复杂的操作；\n4. 通过runtime实现，~~不需要接触到sqlite语句~~(还是要懂一点点的)就能满足增删改查；\n\n\u003ch2 id=\"怎么使用？如何集成？\"\u003e怎么使用？如何集成？\u003c/h2\u003e\n\n[CocoaPod这里](https://cocoapods.org/pods/FFDB)\n\npod 'FFDB’,’~\u003e4.x’\npod search FFDB如果没有找到，pod setup之后就ok了\n\n如果不使用CocoaPod，请导入`FMDB`，并且在target的Linked Frameworks and Libraries导入\nlibsqlite3.0.tbd\n\n![image](https://github.com/Fidetro/FFDB/blob/master/src/1.png)\n\n同时把目录中的这些文件拉到工程中\n\n![image](https://github.com/Fidetro/FFDB/blob/master/src/8.png)\n\n建立好要创建的类继承`FFDataBaseModel`，声明属性即可，\n如一个`Person`表里，有人名，年龄字段。\n\n```\n@interface Person : FFDataBaseModel\n/** 人名 **/\n@property(nonatomic,copy) NSString *name;\n/** 年龄 **/\n@property(nonatomic,copy) NSString *age;\n/** 设置主键字段 **/\n@property(nonatomic,copy) NSString *priamryID;\n\n//从4.x后版本，必须重写该方法，指定主键字段\n+ (NSString *)primaryKeyColumn\n{\n    return @\"primaryID\";\n}\n//从4.x后版本，如需主键自增，还需要自行设置字段属性\n+ (NSDictionary *)columnsType\n{\n    return @{@\"priamryID\":@\"integer PRIMARY KEY AUTOINCREMENT\"};\n}\n\n//插入:\nPerson *person = [[Person alloc]init];//创建对象\nperson.name = @\"Fidetro\";//设置属性\n[person insertObject];//插入数据\n\n//查询:\n//等同于查询Person表中所有的对象\n[Person selectFromClassAllObject];\n\n//等同于查询年龄是15和名字叫Fidetro的数据\n[Person selectFromClassWhereFormat:@\"age = ? and name =  ? \" values:@[@\"15\",@\"Fidetro\"]];\n\n//限制只查询2个并从第2个开始\n[TestModel selectFromClassWhereFormat:nil orderBy:@\"time desc\" limit:@\"2\" offset:@\"2\" values:nil];\n \n//更新：\nNSArray *updatePersonArray = [Person selectFromClassWhereFormat:@\" name = ? \" values:@[@\"Fidetro\"]];//先查询到要更新的数据\nPerson *lastPerson = [updatePersonArray lastObject];\nassert([lastPerson.name isEqualToString:@\"Fidetro\"]);\nlastPerson.age = 24;\n[lastPerson updateObject];\n\n//删除:\nNSArray *deletePersonArray = [Person selectFromClassWhereFormat:@\"age = ? and name =  ? \" values:@[@\"24\",@\"Fidetro\"]];//先查询到要删除的数据\nPerson *deletePerson = [deletePersonArray lastObject];\nassert(deletePerson.age == 24);\n[deletePerson deleteObject];\n\n```\n\n\n\u003ch2 id=\"补充\"\u003e补充\u003c/h2\u003e\n\n\u003cbr\u003e1. 所有字段都是默认是TEXT，在后面的版本会增加自定义字段类型这个功能; \n\u003cbr\u003e2. 所有继承FFDataBaseModel的对象，在插入数据库后，都会自带一个primaryID作为唯一标识，同时这是一个自增的字段;\n\u003cbr\u003e3. 目前FFDB只是提供了简单的增删改查接口，如果要使用目前接口没办法满足的功能，可以通过以下几个方法进行扩充的操作;\n通过获取了这两个，可以自己结合FMDB原有的方法进行操作。\n\u003cbr\u003e4. 4.x版本数据表模型必须重写`+ (NSString *)primaryKeyColumn;`方法指定主键字段。\n```\n获取FMDatabase对象\n[FFDBManager database];\n获取类在FMDB对应的表名\n[Class tableName];\n需要自定义表名，需要在子类重写 + (NSString *)tableName;\n+ (NSString *)tableName\n{\n   return @\"CustomTableName\";\n}\n\n```\n\u003cbr\u003e4. 有不需要创建到表的属性的时候，现在通过在子类重写`+ (NSArray *)memoryPropertys` 可以达到效果\n\n```\n//例子\n@interface TestModel : FFDataBaseModel\n@property(nonatomic,copy) NSString *name;\n/** 这是不需要加到表中的字段 **/\n@property(nonatomic,copy) NSString *memory;\n@property(nonatomic,copy) NSString *_id;\n@property(nonatomic,assign) double time;\n@end\n\n+ (NSArray *)memoryPropertys\n{\n   return @[@\"memory\"];\n}\n```\n\u003cbr\u003e5. 想修改字段的存储类型可以通过重写 `+ (NSDictionary *)columnsType` 自定义字段的属性，修改字段属性，没有重写的字段都会默认是`text`类型\n\n```\n+ (NSDictionary *)columnsType\n{\n    return @{@\"time\":@\"double\"};\n}\n```\n\u003cbr\u003e6. 自定义字段名可以重写`+ (NSDictionary *)customColumns;`\n```\n这样表的字段是id建的，而不是_id\n + (NSDictionary *)customColumns\n {\n return @{@\"_id\":@\"id\"};\n }\n\n\n```\n\u003cbr\u003e7. 如果你的项目使用的是Swift，建议使用[SwiftFFDB](https://github.com/Fidetro/swift-FFDB)。\n\n\u003ch2 id=\"Pod版本更新说明\"\u003ePod版本更新说明\u003c/h2\u003e\n\n\n\u003ch2 id=\"UML类图\"\u003eUML类图\u003c/h2\u003e\n\n\n![image](https://github.com/Fidetro/FFDB/blob/master/src/7.png)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffidetro%2Fffdb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffidetro%2Fffdb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffidetro%2Fffdb/lists"}