如何在iPhone SDK中将SQLite文件导出为CSV文件

4
在我的应用中,我想将一个SQLite数据库文件导出为CSV文件。你能建议我如何做吗?谢谢。

1
数据库有一个还是多个表? - user142019
2个回答

15

首先,你需要确保在访问数据库时使用的是FMDB,因为直接在Objective-C中使用SQLite C API的人们是一群受虐狂。你可以这样做:

FMDatabase *db = [[FMDatabase alloc] initWithPath:@"/path/to/db/file"];
FMResultSet *results = [db executeQuery:@"SELECT * FROM tableName"];
while([results nextRow]) {
  NSDictionary *resultRow = [results resultDict];
  NSArray *orderedKeys = [[resultRow allKeys] sortedArrayUsingSelector:@selector(compare:)];
  //iterate over the dictionary
}

关于写入CSV文件,这里也有相关的代码:点击此处

#import "CHCSV.h"

CHCSVWriter * csvWriter = [[CHCSVWriter alloc] initWithCSVFile:@"/path/to/csv/file" atomic:NO];

//write stuff
[csvWriter closeFile];
[csvWriter release];

要将它们结合起来,您需要执行以下操作:

FMDatabase *db = [[FMDatabase alloc] initWithPath:@"/path/to/db/file"];
if (![db open]) {
  //couldn't open the database
  [db release];
  return nil;
}
FMResultSet *results = [db executeQuery:@"SELECT * FROM tableName"];
CHCSVWriter *csvWriter = [[CHCSVWriter alloc] initWithCSVFile:@"/path/to/csv/file" atomic:NO];
while([results nextRow]) {
  NSDictionary *resultRow = [results resultDict];
  NSArray *orderedKeys = [[resultRow allKeys] sortedArrayUsingSelector:@selector(compare:)];
  //iterate over the dictionary
  for (NSString *columnName in orderedKeys) {
    id value = [resultRow objectForKey:columnName];
    [csvWriter writeField:value];
  }
  [csvWriter writeLine];
}
[csvWriter closeFile];
[csvWriter release];

[db close];
[db release];

这将把tableName表的内容写入CSV文件中。


1
@Dave:天啊,我从未听说过FMDB。我终于可以在我的应用程序中杀掉所有本地SQLite代码了!真是个快乐的日子!!!! - Josh
1
@Josh 不用谢!Obj-C 有很多开源的东西,所以如果有疑问,可能已经有人为你做好了(在合理范围内);) 我会关注 http://cocoaobjects.com - Dave DeLong
抱歉打扰,但是上面提供的代码包含在当前版本的CHCSV中已经被弃用/更改的代码。有人能提供更新后的代码吗?我正在尝试实现完全相同的目标,即将整个SQLite数据库表导出到CSV文件。 - Razgriz
1
@Razgriz 没有太大的区别,你可以通过阅读头文件轻松辨别应该使用什么。初始化器略有变化(initForWritingToCSVFile),writeLinecloseFile分别变成了finishLinecloseStream - Dave DeLong
那我移除 [csvWriter release] 这行,对吗?ARC 似乎不允许这样做。 - Razgriz
显示剩余7条评论

0
只需对每个表执行SELECT操作,并按需要将每个列的值打印到文本文件中即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接