我正在尝试插入NSArray (tpInfo)中的所有元素,并将它们插入到SQLite数据库中。但是只填充了前15行,即240个条目。tpInfo包含超过3000个元素。我已经被困在这里一段时间了,如果能给我一个正确的方向,我会很感激。
我曾尝试更改我的for循环,将'i‘递增1,这会输入更多数据,但它被插入到不正确的列/行中,并抛出NSRangeException。
‘'NSRangeException',原因:’* -__NSArrayM objectAtIndexedSubscript::index 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);
}发布于 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类对象):
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);
}https://stackoverflow.com/questions/56361578
复制相似问题