gpt4 book ai didi

ios - 数据库存储时间过长

转载 作者:行者123 更新时间:2023-11-29 13:11:31 25 4
gpt4 key购买 nike

我正在制作一个 ios 应用程序,它通过网络获取 xml 提要,解析并将其存储在 sqlite 数据库中,然后显示给用户。

我的 xml 提要大约有 1700 行:http://www.paulshin.ca/yunatube/res/en.xml

我的应用应该是这样工作的。

  1. 用户运行应用
  2. 应用通过网络获取xml
  3. 使用 xml 解析器循环遍历 xml 对象并将每个项目存储在 sqlite 数据库中
  4. 完成后,在 tableview 中显示项目..

但是,我发现第 2 步用时不到 5 秒,而第 3 步用时大约 20 秒。原因是因为将每个项目存储到数据库中需要一些时间。

以下是我在第 3 步中使用的内容。

TBXMLElement *elemRoot = nil,*youtube = nil,*maincateg = nil,*categ = nil,*clip = nil;

    // maincatg
NSString *mcTitle = nil;
// catge
NSString *cTitle = nil;
// clip
NSString *title = nil, *url = nil, *note = nil;

elemRoot = tbxml.rootXMLElement;

if (elemRoot) {
youtube = [TBXML childElementNamed:@"youtube" parentElement:elemRoot];
maincateg = [TBXML childElementNamed:@"maincateg" parentElement:youtube];

while (maincateg) {
mcTitle = [TBXML valueOfAttributeNamed:@"type" forElement:maincateg];

categ = [TBXML childElementNamed:@"category" parentElement:maincateg];
while (categ) {
cTitle = [TBXML valueOfAttributeNamed:@"title" forElement:categ];

clip = [TBXML childElementNamed:@"clip" parentElement:categ];
while (clip) {
title = [TBXML valueOfAttributeNamed:@"title" forElement:clip];
url = [TBXML valueOfAttributeNamed:@"url" forElement:clip];
note = [TBXML valueOfAttributeNamed:@"note" forElement:clip];

//TODO
if (![note isEqualToString:@"0"]) {
// save pared data to persistent

title = [title stringByReplacingOccurrencesOfString:@"&"
withString:@"&"];
cTitle = [cTitle stringByReplacingOccurrencesOfString:@"&"
withString:@"&"];

DatabaseManager *database = [DatabaseManager getInstance];
**[database addDataToTable:mcTitle title:title url:url category:cTitle];**
}
clip = clip -> nextSibling;
}
categ = categ -> nextSibling;
}

maincateg = maincateg -> nextSibling;
}

如您所见,我有一些嵌套循环,我通过调用 addDataToTAble() 将每个项目存储到数据库;如果我删除带有 * 的行(换句话说,如果我在每次循环后不存储项目),它会非常快地工作。但是,如果我原样保留带 * 的行,则需要很长时间。

这个函数如下:

-(void) addDataToTable: (NSString*)table
title: (NSString*)title
url:(NSString*)url
category:(NSString*)category
{
sqlite3_stmt *statement;
const char *dbpath = [_databasePath UTF8String];

if (sqlite3_open(dbpath, &_yunatubeDB) == SQLITE_OK) {

NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO %@ (TITLE, URL, CATEGORY) VALUES (\"%@\", \"%@\", \"%@\")", table, title, url, category];

const char *insert_stmt = [insertSQL UTF8String];
sqlite3_prepare_v2(_yunatubeDB, insert_stmt,
-1, &statement, NULL);
if (sqlite3_step(statement) == SQLITE_DONE) {
// NSLog(@"Successfully added to DB");
} else {
NSLog(@"Failed to add data to DB");
}
sqlite3_finalize(statement);
sqlite3_close(_yunatubeDB);
}
}

好像这个函数在存储每一项的时候都需要一段时间,随着存储时间的累积,最终最多需要20秒。我对 android 使用类似的算法,它运行速度很快,但我不知道为什么在 ios 上需要这么长时间。我想知道这个处理时间是否会对应用商店中的应用评论产生负面影响。我在 android 上使用类似的方法,它在那里工作得非常快……不到 4 秒。我不知道为什么在ios上需要这么长时间。我做错了什么吗?

感谢任何帮助!

最佳答案

尝试在循环之前开始一个 SQLite 事务并在循环之后结束它。如果您不手动启动/停止事务,SQLite 将在每次写入时自动执行,这非常慢。

关于ios - 数据库存储时间过长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17258257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com