数据持久化 技术比较

网友投稿 250 2022-09-19

数据持久化 技术比较

 

【数据存储】coredata、sqlite、fmdb和sqlitepersistentobject   

 


管理提醒: 本帖被 angellixf 从 OS X开发讨论区 移动到本区(2014-02-12)



 


  • 分享类型:应用开发相关




​​



在ios开发过程中,经常需要用到数据持久化工作。对于基本的配置信息等,NSUserDefault已经可以满足要求,但是对于大部分需要存储的信息,主要的方式有coredata建模或者sqlite写数据库的方法进行存储。现在针对coredata、sqlite以及常用的sqlite封装库进行研究和学习。


    首先,针对四种数据持久化方式,进行基本的10w条数据插入得到性能耗时如下(由于sqlitepersistentobject未找到合适的批量插入方法,所以没有进行对比):


  sqlite          1470ms

  fmdb           3088ms

  coredata    3418ms



从中可以看出,sqlite最快,基本都只用fmdb以及coredata等的一半时间。接下来我们逐个解析相关技术/库的操作以及使用。




【coreData】

    coredata相信基本都不陌生,我们常用的主要就是Data Model了,有两种方法添加Data Model:新建工程时勾选或者添加Core Data->Data Model文件。采用第一种方法默认会有相关的代码生成,为了更好的了解Core Data是怎么load进来的,我们采用第二种方法进行演示。


首先,我们添加CoreData->Model Data模型,名字输入为coreData,即可在文件列表中见到coreData.xcdatamodeld文件。我们先添加如下Entities:




我们已经有了模型,那么该怎样使用呢。有一个NSManagedObjectModel的类,专门用来管理数据模型的。先从coreData.xcdatamodeld中初始化模型:


  


插入数据过程中,首先获取一个NSManagedObject的对象,可以这么理解,NSManagedObject就代表了一条数据信息,我们用insertNewObjectForEntityForName往TestCoreData这个数据模型中添加了一条数据:object。后面的[object setValue:"***" forkey:"***"]即为该条插入的数据进行赋值。

添加完毕数据后,内存中模型已经有添加的数据了。但是文件中还没有同步进去,那么我们调用:

[coreDataContext save:nil];



即可将刚才插入的数据保存到文件中。

关于其他修改、删除等操作,以及core data中的releationship操作等,可以参考附件程序或查阅相关其他资料。

【sqlite】


    sqlite是一款轻量级数据库,在c、c++、java以及其他各种产品中都有涉及到,xcode对sqlite也提供的原生支持。使用sqlite也不难,只要在Link Binary With Libraries中添加ibsqlite3.0.dylib(我是用的3.0版本),然后在需要使用的地方添加头文件:#include<sqlite3.h>即可。

    sqlite的操作很方便,也很直观:

  


sqlite非常直观,并且依赖于sql语句,所以sqlite的有点在于灵活性高,上手简单并易于理解。缺点就是带来了很多底层数据库的操作,一般都需要自己再去进行数据建模并进行封装使用。

相关读写步骤也很简单:

  



【FMDB】

    fmdb是一个开源的库(​​data-id="p838747a-BBWmwpBS">要使用fmdb,将获取到的包中src下的文件(除了fmdb.m)拖到自己工程中(最好用一个group管理起来),然后添加libsqlite3.0.dylib即可。

照例我们先来看下fmdb的基础用法:

  



fmdb使用比直接调用sqlite要省略很多代码和相关参数(估计让很多人很头疼),整个使用过程感觉就是四个字:酣畅淋漓。只将必要的一些关键操作需要给出参数。符合大部分对性能要求不高的场合,非常方便。fmdb针对读取操作也一样方便,这里就不多讲。接下来我们看看fmdb中其他几个文件的用途,有几个比较有趣的东西可以细说。

在我们拿到的src中,还有部分文件我们在基本的使用场景中很少用到的:



FMDatabaseAdditions.*文件,我们可以打开h文件看下:


  


很直观是不是,就是针对某些你确定只有一个返回值的select语句,就不需要再通过返回FMResultSet并遍历set获取了。提供简单、直观易懂的操作。



FMDatabaseQueue.*提供多线程下针对db操作的一个队列。使用FMDatabaseQueue,我们在任何线程中,都可以操作:


  


首先我们有一个数据类,继承自SQLitePersistentObject,每一个ZJSqlitePersistentobjectPerson对象都对应数据库中的一条记录。

接下来,我们添加一批ZJSqlitePersistentobjectsPerson数据:



  


可以从插入过程中看到,整个操作过程中完全屏蔽了相关sql语句、表结构等细节。非常方便简单,不过sqlitepesistentobject只支持基础数据类型和实现了NSCoding等相关类,由此,对于相关集合类型(NSArray,NSSet,NSDictionary)等是不支持的。关于sqlitepersistentobject的其他细节,可以参考sqlitepersistentobject源码。



【总结】



综合比较coredata、sqlite、fmdb和sqlitepersistentobject等四种数据永久化方式,个人认为:

1、如果只是基础数据类型并且对sql不熟悉,用sqlitepersistenttobject是最理想的,我们需要的是数据,sqlitepersistentobject需要你面对的也是一条一条的数据。

2、如果需要操作一般的比较复杂的数据库以及类型,个人推荐用fmdb,非常方便和便于操作,而且sqlite本身还支持对数据加密的借口。

3、如果需要很好的性能,可以使用sqlite并自己封装相关接口。

4、如果需要基本的数据模型,并且对xcode可视化情有独钟的话,可以使用coredata->data model等。



由于对四种数据存储类型只是浅尝辄止,其中不免疏漏的地方。



 

 

复制代码


  1. // initilize
  2. NSURL* modelURL = [[NSBundle mainBundle] URLForResource:@"coreData" withExtension:@"momd"];
  3. coreDataModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];</span>
  4. 我们可以理解为,coreDataModel就代表了该模型。
  5. 接下来,我们需要考虑,有了模型后,数据最终应该存在哪里?答案是:文件。接下来我们有另外一个类来管理模型跟文件之间的对应关系:

  6. [code]NSString* strInfoPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"coreData.sqlite"];
  7. coreDataCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:coreDataModel];

  8. [coreDataCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:strInfoPath] options:nil error:nil];</span>

  9. OK,现在文件<->模型 之间的映射关系也有了。那么接下来我们就需要去对模型数据库进行读写操作等。自然,有一个上下文用来执行/处理相关数据信息:
  10. [code]// 对context进行操作
  11. coreDataContext = [[NSManagedObjectContext alloc] init];
  12. [coreDataContext setPersistentStoreCoordinator:coreDataCoordinator];</span>

  13. 我们尝试去插入一条数据:


  14. [code]NSManagedObject* object = [NSEntityDescription insertNewObjectForEntityForName:@"TestCoreData" inManagedObjectContext:coreDataContext];

  15. [object setValue:[NSNumber numberWithInt:data->intType] forKey:@"intType"];
  16. [object setValue:[NSNumber numberWithFloat:data->floatType] forKey:@"floatType"];
  17. [object setValue:[NSNumber numberWithDouble:data->doubleType] forKey:@"doubleType"];
  18. [object setValue:[NSString stringWithUTF8String:data->testString] forKey:@"stringType"];


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:面试 必备
下一篇:从存储角度看自动驾驶必经之路
相关文章

 发表评论

暂时没有评论,来抢沙发吧~