首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当数组包含超过3000个元素时,为什么我的函数只在SQLite中插入240个条目?

当数组包含超过3000个元素时,为什么我的函数只在SQLite中插入240个条目?
EN

Stack Overflow用户
提问于 2019-05-29 21:17:58
回答 1查看 48关注 0票数 0

我正在尝试插入NSArray (tpInfo)中的所有元素,并将它们插入到SQLite数据库中。但是只填充了前15行,即240个条目。tpInfo包含超过3000个元素。我已经被困在这里一段时间了,如果能给我一个正确的方向,我会很感激。

我曾尝试更改我的for循环,将'i‘递增1,这会输入更多数据,但它被插入到不正确的列/行中,并抛出NSRangeException。

‘'NSRangeException',原因:’* -__NSArrayM objectAtIndexedSubscript::index 2304超出边界0 ..2303‘

代码语言:javascript
复制
-(void) insertTP: (NSMutableArray * ) tpInfo {

NSString * databasePath = [self dataPath: @ "eldb.sqlite3"];
sqlite3 * database;
if (sqlite3_open([databasePath UTF8String], & database) != SQLITE_OK) {
  NSLog(@ "Could not open database");
  return;
} else {
  NSLog(@ "Inserting TimeProfile Data");
}

//for each element in the array, save the array index
sqlite3_stmt * statement;
NSString * SQLInsert = @ "INSERT INTO TIME_PROFILES (TIMEZONE_IID, 
TIMEZONE_ID, SERIAL, FROM_TIME, TO_TIME ,MONDAY, TUESDAY, WEDNESDAY, 
THURSDAY, FRIDAY, SATURDAY, SUNDAY, HOLIDAY, SPECIAL_DAY_ONE, 
SPECIAL_DAY_TWO, TIMEZONE_ITEM_ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 
?, ?, ?, ?, ?, ?);";
if (sqlite3_prepare_v2(database, [SQLInsert UTF8String], -1, & statement, 
nil) == SQLITE_OK) {

  NSLog(@ "pinfo %@", tpInfo);

  for (int i = 0; i < [tpInfo count]; i += 16) {

  sqlite3_bind_text(statement, 1, [tpInfo[i] UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 2, [tpInfo[i + 1] UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 3, [tpInfo[i + 2] UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 4, [tpInfo[i + 3] UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 5, [tpInfo[i + 4] UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 6, [tpInfo[i + 5] UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 7, [tpInfo[i + 6] UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 8, [tpInfo[i + 7] UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 9, [tpInfo[i + 8] UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 10, [tpInfo[i + 9] UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 11, [tpInfo[i + 10] UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 12, [tpInfo[i + 11] UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 13, [tpInfo[i + 12] UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 14, [tpInfo[i + 13] UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 15, [tpInfo[i + 14] UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 16, [tpInfo[i + 15] UTF8String], -1, NULL);

  if (sqlite3_step(statement) != SQLITE_DONE) {
    NSLog(@"Database returned error %d: %s", sqlite3_errcode(database), sqlite3_errmsg(database));
  }
  sqlite3_reset(statement);
}
sqlite3_finalize(statement);
} else {
  NSLog(@ "Can't prepare: %s", sqlite3_errmsg(database));
}
 sqlite3_close(database);
}
EN

回答 1

Stack Overflow用户

发布于 2019-05-31 02:25:57

根据这种编码方式,您的tpInfo数组有16列数据,第一行的前16个元素(0-15)从TIMEZONE_IID到TIMEZONE_ITEM_ID,然后第二行的第二个16个元素(16-31)。如果是这样的话,这是一种填充tpInfo数组的奇怪方式。这应该是一个具有16个属性的TimeProfile对象数组,然后您只需将for循环递增+= 1即可。

这样,如果tpInfo计数不能被16完全整除,会发生什么?您将得到索引超出界限的错误,这可能是失败的原因。

您的代码可能看起来更像这样(假设您有一个TimeProfile类对象):

代码语言:javascript
复制
if (sqlite3_prepare_v2(database, [SQLInsert UTF8String], -1, & statement, 
nil) == SQLITE_OK) {

for (int i = 0; i < [tpInfo count]; i += 1) {
    TimeProfile *profile = tpInfo[I];
     NSLog(@ "pinfo %@", profile);

  sqlite3_bind_text(statement, 1, [profile.TIMEZONE_IID UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 2, [profile.TIMEZONE_ID UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 3, [profile.SERIAL UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 4, [profile.FROM_TIME UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 5, [profile.TO_TIME UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 6, [profile.MONDAY UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 7, [profile.TUESDAY UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 8, [profile.WEDNESDAY UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 9, [profile.THURSDAY UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 10, [profile.FRIDAY UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 11, [profile.SATURDAY UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 12, [profile.SUNDAY UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 13, [profile.HOLIDAY UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 14, [profile.SPECIAL_DAY_ONE UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 15, [profile.SPECIAL_DAY_TWO UTF8String], -1, NULL);
  sqlite3_bind_text(statement, 16, [profile.SPECIAL_DAY_THREE UTF8String], -1, NULL);

  if (sqlite3_step(statement) != SQLITE_DONE) {
    NSLog(@"Database returned error %d: %s", sqlite3_errcode(database), sqlite3_errmsg(database));
  }

  sqlite3_reset(statement);
}
sqlite3_finalize(statement);
} else {
  NSLog(@ "Can't prepare: %s", sqlite3_errmsg(database));
}
 sqlite3_close(database);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56361578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档