Почему моя функция вставляет в SQLite только 240 записей, когда массив содержит более 3000 элементов? - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь вставить все элементы из NSArray (tpInfo) и вставить их в базу данных SQLite.Но заполняются только первые 15 строк, а это 240 записей.tpInfo содержит более 3000 элементов.Я застрял здесь на некоторое время и был бы признателен за правильное направление.

Я попытался изменить цикл for, чтобы увеличить 'i' на 1, который вводит больше данных, но он вставляется в неправильные столбцы / строки и генерирует исключение NSRangeException.

'NSRangeException',причина: '*** - [__ NSArrayM objectAtIndexedSubscript:]: индекс 2304 за пределами [0 .. 2303]'

-(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);
}

1 Ответ

0 голосов
/ 30 мая 2019

В зависимости от того, как это закодировано, ваш массив tpInfo содержит 16 столбцов данных в первых 16 элементах (0-15) от TIMEZONE_IID до TIMEZONE_ITEM_ID для первой строки, затем вторые 16 элементов (16-31) длявторой ряд.Если это так, это странный способ заполнить ваш массив tpInfo.Это должен быть массив объектов TimeProfile, которые имеют 16 атрибутов, и тогда вы будете увеличивать цикл for только на + = 1.

Таким образом, что произойдет, если [tpInfo count] не делится на 16?Вы получите ошибку индексации из границ, которая может быть причиной сбоя.

Ваш код, вероятно, должен выглядеть примерно так (при условии, что у вас есть объект класса TimeProfile):

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...