【发布时间】:2011-06-07 02:42:12
【问题描述】:
在我的应用程序中,我想将 SQLite 数据库文件导出为 CSV 文件..
你能建议我怎么做吗? 谢谢。
【问题讨论】:
-
数据库有一张还是多张表?
标签: iphone objective-c csv sqlite export-to-excel
在我的应用程序中,我想将 SQLite 数据库文件导出为 CSV 文件..
你能建议我怎么做吗? 谢谢。
【问题讨论】:
标签: iphone objective-c csv sqlite export-to-excel
首先,您需要确保使用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 文件,好吧there's code for that too:
#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 文件。
【讨论】:
CHCSVParser 试图弄清楚 csv 文件的编码是什么,但这绝不是完整的。 NSArray 便捷方法具有指定文件的文件编码的选项。试试这些(我建议NSUTF8StringEncoding 作为第一次尝试),如果它不起作用,请给我发送电子邮件(我的个人资料中的联系信息)。
initForWritingToCSVFile),writeLine 和 closeFile 分别变为 finishLine 和 closeStream。
只需对每个表执行 SELECT 并根据需要将每列的值打印到文本文件中。
【讨论】: