`
isiqi
  • 浏览: 16005456 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

iphone数据库

 
阅读更多

CoreData

介绍

在Cocoa环境下,如果你想使用数据库(如sqlite),你可以使用sql语句的方式通过相关的工具类进行数据库的直接操作。当然你也可以通过别人封装之后的一些简单框架,使得你的操作更加简单(如FMDBBNRPersistence)。

Cocoa框架本身提供了CoreData这个API可方便的让开发者通过操作对象的方式在操作数据库。CoreData是一个对象图(object graph)以及持久化的管理框架。我们可以通过CoreData创对象,设置好象之间的关系,然后将其持久化(我们甚至可以使用内存数据库),或者从硬盘上将持久化后的数据加载到内存中。对象图,我们可以创建一个个的对象,并维持不同对象之间的关系,一对一,一对多等。

CoreData有大量的特性,诸如支持Redo,Undo的功能,这些很多Document based的程序中显得非常的有用。提供数据model结构变化轻量级的迁移方案。CoreData还通过Binding特性和控件的紧密结合,这样使得只需要少量的代码便可以完成强大的功能,下面是一个例子

http://www.timisted.net/blog/archive/multiple-windows-with-core-data/

存储方式

Core Data可以将数据存储为XML,二进制文件或SQLite文件。在Mac OS X 10.5 Leopard及以后的版本中,开发者也可以通过继承NSPersistentStore类以创建自定义的存储格式。每种方法都有其优缺点,例如XML的可读性,SQLite的节约空间等。

Core Data的这一方面类似于原始的Enterprise Objects Framework(EOF)系统,但EOF中开发者可以使用相对简洁的查询方式,而在Core Data中,只能使用一个语法类似SQL子集的查询语言,称为Predicate。Core Data是标准化的,可以自由的读写Xcode数据模型文件(通常是.xcdatamodel文件)。

与EOF不同,Core Data目前没有设计多用户或多线程访问模式。模型迁移通常也需要代码,若其它开发者依赖于某个数据模型,则该数据模型的设计者可能在模型发生改变时需要与新数据模型一起提供版本转换代码。

操作简介

Core Data由相对庞大的类继承体系组成,但开发者需要关注的接口只是其中的一个相对小的子集。

一般需要定义以下Core Data的三个必备

NSPersistentStoreCoordinator*persistentStoreCoordinator;

NSManagedObjectModel*managedObjectModel;

NSManagedObjectContext*managedObjectContext;

以及使用时需要用到的

NSFetchedResultsController*fetchedResultsController;

具体的使用例子比较多,后面介绍一下在使用过程中遇到的一些问题。或许可以帮到你。

分享

1.使用Table时在3.0版本时会Crash

- (NSInteger)tableView:(UITableView*)table numberOfRowsInSection:(NSInteger)section{

id<NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsControllersections]objectAtIndex:section];

return[sectionInfonumberOfObjects];

}

3.0版本的时候如果你在numberOfRowsInSection的回调时Crash,那么加上下面这个回调就没事了,这样在无数据的时候数组就不会越界了。Apple在3.0才第一次上CoreData,总有不小心的时候,后面的版本就处理得很好。

- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView {

return[[self.fetchedResultsControllersections]count];

}

2.又Crash了,检查一下,记得在所有增删改查前已经调用过下面这几句话,并且在重置fetchedResultsController的时候也要重新调用,所以我把它写到创建的尾部了。

NSError*error;

if(![fetchedResultsControllerperformFetch:&error])

NSLog(@"Error performing fetch: %@", [errorlocalizedDescription]);

3.错误信息看不懂,用

- (void) handleError:(NSError*)error fromSource:(NSString*)sourceString

{

NDLOG(@"Unresolved error %@ at %@, %@", error, sourceString, [erroruserInfo]);

[DataControllerdumpError:error];

}

打出来的确实不是很清楚。有时候还是不准确不完整的信息。换一个吧,我们自己来。

+ (void) dumpError:(NSError*) error {

NDLOG(@"Failed to save to data store: %@", [errorlocalizedDescription]);

NSArray* detailedErrors = [[erroruserInfo]objectForKey:NSDetailedErrorsKey];

if(detailedErrors !=nil&& [detailedErrorscount] >0) {

for(NSError* detailedErrorindetailedErrors) {

NDLOG(@"DetailedError: %@", [detailedErroruserInfo]);

}

}

else{

NDLOG(@"%@", [erroruserInfo]);

}

}

4.不是每次都要fetchedResultsController的,有时候直接用NSFetchRequest更方便。

NSFetchRequest*request = [[[NSFetchRequestalloc]init]autorelease];

NSEntityDescription*tagEntity = [NSEntityDescriptionentityForName:@"entityName"inManagedObjectContext:managedObjectContext];

[requestsetEntity:tagEntity];

NSError*error =nil;

NSArray*array = [managedObjectContextexecuteFetchRequest:requesterror:&error];

return[arraycount];

5.有时候没SQL命令确实效率不怎么样。为了做一个更新数据库的操作,瞧这代码,幸亏N都是很小的值。

NSMutableArray* persistent = [NSMutableArrayarrayWithArray:local];

NSMutableArray* netData = [NSMutableArrayarrayWithArray:netReturn];

for(idinfoinpersistent) {

BOOLfound =NO;

for(iddatainnetData) {

if(找到) {

更新对象数据等操作

[netDataremoveObject: data];

found =YES;

break;

}

}

if(!found) {

移除不必要的数据等

}

}

for(iddatainnetData) {

插入新增等操作

}

最后是保存等操作

}

6.在使用的过程中,其功能强大省去了很多的事情,但是其实有很多需要注意的东西吗,delegate的处理等等。在改变模型的时候如果没有更新方案的话会很麻烦的。效率上也是值得商榷,还有一堆高度重复的代码也是看起来不舒服的地方。还有就是感觉数据源非常适合使用Table来处理。

7.在上面的第五点的更新操作为什么需要这样子麻烦呢,因为需要避免用户在操作一个数据库中一个已经被删除的但是已经载到内存中对象。但是这种情况并没有能够完全规避,这时候在访问对象数据前,需要及时的判断这个内存中的对象还有效吗。调用对象的isFault(NSManagedObject),进行判断,及时避免不必要的操作和崩溃。



本文来自http://blog.csdn.net/arthurchenjs/article/details/6339659

分享到:
评论

相关推荐

    sqlite persistent objects iphone数据库操作源码

    sqlite persistent objects iphone数据库操作源码sqlite persistent objects iphone数据库操作源码sqlite persistent objects iphone数据库操作源码

    Iphone数据库访问技术

    使用数据库技术访问资源信息,保存资源信息

    iphone数据库sqlite3的使用基础操作

    自己找的有关sqlite3的一些基本知识,里边也有几个例子,sql语句等等,希望对你有用,

    iphone FMDB 数据库操作示例

    使用SQLite创建数据库,然后用FMDB对其操作得到数据。相信你下了后一定能明白是怎么用FMDB来实现操作数据iphone数据库的。

    iphone开发SQLite数据库使用

    iphone开发SQLite数据库使用 简单方便

    数据库的框架和方法

    Iphone数据库操作,hone 中使用名为 SQLite 的数据库管理系统。它是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它 占用资源非常的低,...

    iPhone iOS数据库查询源代码

    iPhone iOS 数据库查询 源代码

    jsp servlet bean jdbc pager uploadfile案例iphone照片集

    案例实现了相片文件的 CRUD操作:内含使用视频 avi演示的2个功能为:上传照片、查询编辑; 分类管理未实现,可作为练习用的。...mysql数据root帐号,不设置密码,创建iphone数据库后,运行iphone.sql脚本。

    iphone程序中连接mysql远程数据库

    iphone 远程连接 mysql 实例

    iphone调用云数据库simpledb

    iphone调用aws.amazon.com的云数据库simpledb 包含IOS例子源代码和api手册 用免费的数据库服务器,看看大家用得着不,可以省一笔服务器成本了,祝大家早日做出挣钱的游戏 一次失败的腾讯面试真是激励自己努力学习哈....

    iPhone开发秘籍.part2.rar

    10.4 秘诀:与iPhone 数据库交互.....257 10.5 秘诀:将XML 转换为树.....259 10.6 秘诀:存储和检索密钥链项.....261 10.6.1 存储多个密钥链值.....265 10.6.2 密钥链持久化.....267 10.7 发送和接收文件.....267 ...

    iPhone开发秘籍.part1.rar

    10.4 秘诀:与iPhone 数据库交互.....257 10.5 秘诀:将XML 转换为树.....259 10.6 秘诀:存储和检索密钥链项.....261 10.6.1 存储多个密钥链值.....265 10.6.2 密钥链持久化.....267 10.7 发送和接收文件.....267 ...

    iPhone开发秘籍.part4.rar

    10.4 秘诀:与iPhone 数据库交互.....257 10.5 秘诀:将XML 转换为树.....259 10.6 秘诀:存储和检索密钥链项.....261 10.6.1 存储多个密钥链值.....265 10.6.2 密钥链持久化.....267 10.7 发送和接收文件.....267 ...

    iPhone开发秘籍

    10.4 秘诀:与iphone数据库交互 257 10.5 秘诀:将xml转换为树 259 10.6 秘诀:存储和检索密钥链项 261 10.6.1 存储多个密钥链值 265 10.6.2 密钥链持久化 267 10.7 发送和接收文件 267 10.8 秘诀:构建一个...

    iphone mysql数据库操作代码例子.docx

    iphone mysql数据库操作代码例子.docx

    iphone mysql数据库操作代码例子_.docx

    iphone mysql数据库操作代码例子_.docx

    FMDB数据库iPhone版本源码

    FMDB数据库iPhone版本,有较全面的功能,

Global site tag (gtag.js) - Google Analytics