ios sqlite3_bind_文本步骤返回null
在下面的代码中,一切似乎都是正确的,但是不管我向它们提供了什么数据,带符号的行总是返回一个null的错误代码。我已经研究并改变了我能想到的所有参数。第一个sqlite3_bind_文本行成功,接下来的三行每次都失败。我想不出来。帮忙ios sqlite3_bind_文本步骤返回null,ios,sqlite,Ios,Sqlite,在下面的代码中,一切似乎都是正确的,但是不管我向它们提供了什么数据,带符号的行总是返回一个null的错误代码。我已经研究并改变了我能想到的所有参数。第一个sqlite3_bind_文本行成功,接下来的三行每次都失败。我想不出来。帮忙 -(void)fillSqliteDb { sqlite3 *database; if (sqlite3_open([[self sqliteFilePath] UTF8String], &database) != SQLITE_OK) {
-(void)fillSqliteDb
{
sqlite3 *database;
if (sqlite3_open([[self sqliteFilePath] UTF8String], &database) != SQLITE_OK) {
sqlite3_close(database);
NSAssert(0, @"Failed to open database");
}
NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FUNCTIONS (nouns TEXT, verbs TEXT, adverbs TEXT, adjectives TEXT);";
char *errorMsg;
if (sqlite3_exec (database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
sqlite3_close(database);
NSAssert(0, @"Error creating table: %s", errorMsg);
}
sqlite3_stmt *stmt;
for (int i=0; i<260; i++) {
NSString * pln = self.pluralNouns[i]; // pre-filled array of 260 words
NSString * vrb = self.verb[i]; // pre-filled array of 260 words
NSString * adv = self.adverb[i]; // pre-filled array of 260 words
NSString * adj = self.adjective[i]; // pre-filled array of 260 words
char *update = "INSERT INTO FUNCTIONS (nouns, verbs, adverbs, adjectives) VALUES (?, ?, ?, ?);";
if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, [pln UTF8String], -1, NULL);
if (sqlite3_step(stmt) != SQLITE_DONE) // Works, word ends up in database
NSLog(@"Error updating table: %s", errorMsg);
sqlite3_bind_text(stmt, 2, [vrb UTF8String], -1, NULL);
if (sqlite3_step(stmt) != SQLITE_DONE) // ALWAYS RETURNS Error: NULL
NSLog(@"Error updating table: %s", errorMsg);
sqlite3_bind_text(stmt, 3, [adv UTF8String], -1, NULL);
if (sqlite3_step(stmt) != SQLITE_DONE) // ALWAYS RETURNS Error: NULL
NSLog(@"Error updating table: %s", errorMsg);
sqlite3_bind_text(stmt, 4,[adj UTF8String], -1, NULL);
if (sqlite3_step(stmt) != SQLITE_DONE) // ALWAYS RETURNS Error: NULL
NSLog(@"Error updating table: %s", errorMsg);
}
}
}
-(void)fillSqliteDb
{
sqlite3*数据库;
if(sqlite3_打开([[self-sqliteFilePath]UTF8String],&database)!=SQLITE_确定){
sqlite3_关闭(数据库);
NSAssert(0,@“无法打开数据库”);
}
NSString*createSQL=@“创建不存在的表函数(名词文本、动词文本、副词文本、形容词文本);”;
char*errorMsg;
if(sqlite3_exec(数据库,[createSQL UTF8String],NULL,NULL,&errorMsg)!=SQLITE_OK){
sqlite3_关闭(数据库);
NSAssert(0,@“创建表时出错:%s”,errorMsg);
}
sqlite3_stmt*stmt;
对于(inti=0;i而言,此代码有几处错误
只调用sqlite3\u prepare\u v2
一次。在for
循环之前执行此操作
您需要为每个变量调用一次sqlite3\u bind\u xxx
,然后再调用sqlite3\u step
每个循环只调用一次sqlite2\u步骤
。在循环结束时执行此操作
在循环结束时调用sqlite3\u步骤
后,需要调用sqlite3\u重置
循环完成后,需要对准备好的语句调用sqlite3\u finalize
由于在方法开始时打开了数据库连接,因此需要在方法结束时关闭它
检查每个sqlite3\u步骤
调用的结果后,对所有日志使用errorMsg
是错误的。errorMsg
仅在调用sqlite3\u exec
时设置。要获取其他调用的错误消息,需要使用sqlite3\u errmsg
更新代码:
- (void)fillSqliteDb {
sqlite3 *database;
if (sqlite3_open([[self sqliteFilePath] UTF8String], &database) != SQLITE_OK) {
sqlite3_close(database);
NSAssert(0, @"Failed to open database");
}
NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FUNCTIONS (nouns TEXT, verbs TEXT, adverbs TEXT, adjectives TEXT);";
char *errorMsg;
if (sqlite3_exec (database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
sqlite3_close(database);
NSAssert(0, @"Error creating table: %s", errorMsg);
}
sqlite3_stmt *stmt;
char *update = "INSERT INTO FUNCTIONS (nouns, verbs, adverbs, adjectives) VALUES (?, ?, ?, ?);";
if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {
for (int i=0; i<260; i++) {
NSString * pln = self.pluralNouns[i]; // pre-filled array of 260 words
NSString * vrb = self.verb[i]; // pre-filled array of 260 words
NSString * adv = self.adverb[i]; // pre-filled array of 260 words
NSString * adj = self.adjective[i]; // pre-filled array of 260 words
sqlite3_bind_text(stmt, 1, [pln UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 2, [vrb UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 3, [adv UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 4, [adj UTF8String], -1, NULL);
if (sqlite3_step(stmt) != SQLITE_DONE) // ALWAYS RETURNS Error: NULL
NSLog(@"Error updating table: %s", sqlite3_errmsg(database));
sqlite3_reset(stmt);
}
sqlite3_finalize(stmt);
}
sqlite3_close(database);
}
-(void)fillSqliteDb{
sqlite3*数据库;
if(sqlite3_打开([[self-sqliteFilePath]UTF8String],&database)!=SQLITE_确定){
sqlite3_关闭(数据库);
NSAssert(0,@“无法打开数据库”);
}
NSString*createSQL=@“创建不存在的表函数(名词文本、动词文本、副词文本、形容词文本);”;
char*errorMsg;
if(sqlite3_exec(数据库,[createSQL UTF8String],NULL,NULL,&errorMsg)!=SQLITE_OK){
sqlite3_关闭(数据库);
NSAssert(0,@“创建表时出错:%s”,errorMsg);
}
sqlite3_stmt*stmt;
char*update=“插入函数(名词、动词、副词、形容词)值(?,?,?);”;
if(sqlite3\u prepare\u v2(数据库,更新,-1,&stmt,nil)==SQLITE\u确定){
对于(int i=0;看,我已经采纳了您的建议,现在它可以正常工作了。我还使用sqlite3_exec使它正常工作,如代码所示。非常感谢您的帮助。很明显,我确实需要它。