我遇到SQLite问题。当我尝试插入条目时,我收到错误。我发现错误是“SQLITE MISUSE”,错误代码为21,使用
NSLog(@"ERROR: Failed to add food! (code: %d)",sqlite3_step(statement));
我的代码中的insertSQL字符串在需要时正确创建。另外,我看到使用iFunBox创建的表。
这是我的插入方法:
-(void)saveDataWithCategoryNumber:(int)categoryNumber foodNumber:(int)foodNumber foodName:(NSString *)foodName definiton:(NSString *)definiton ingredients:(NSString *)ingredients calorie:(int)calorie price:(int)price image1:(NSString *)image1 image2:(NSString *)image2 image3:(NSString *)image3 image4:(NSString *)image4 {
sqlite3_stmt *statement;
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &foodDB) == SQLITE_OK)
{
NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO foodDB (categoryNumber, foodNumber, foodName, definiton, ingredients, calorie, price, image1, image2, image3, image4) VALUES (%i, %i, \"%@\", \"%@\", \"%@\", %i, %i, \"%@\", \"%@\", \"%@\", \"%@\")", categoryNumber, foodNumber, foodName, definiton, ingredients, calorie, price, image1, image2, image3, image4];
const char *insert_stmt = [insertSQL UTF8String];
sqlite3_prepare_v2(foodDB, insert_stmt, -1, &statement, NULL);
//char *error;
//sqlite3_exec(foodDB, insert_stmt, NULL, NULL, &error);
NSLog(@"insertSQL: %@",insertSQL);
if (sqlite3_step(statement) == SQLITE_DONE)
{
NSLog(@"Food added.");
} else {
NSLog(@"ERROR: Failed to add food! (code: %d)",sqlite3_step(statement));
}
sqlite3_finalize(statement);
sqlite3_close(foodDB);
}}
可能是创建方法会很有用:
-(void)createDatabase{
NSString *docsDir;
NSArray *dirPaths;
// Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
// Build the path to the database file
databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"foodDB.db"]];
NSFileManager *filemgr = [NSFileManager defaultManager];
if ([filemgr fileExistsAtPath: databasePath ] == NO)
{
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &foodDB) == SQLITE_OK)
{
char *errMsg;
const char *sql_stmt = "CREATE TABLE IF NOT EXISTS foodDB (ID INTEGER PRIMARY KEY AUTOINCREMENT, categoryNumber INT, foodNumber INT, foodName TEXT, definition TEXT, ingredients TEXT, calorie INT, price INT, image1 TEXT, image2 TEXT, image3 TEXT, image4 TEXT)";
if (sqlite3_exec(foodDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)
{
NSLog(@"ERROR: Failed to create database!");
}
sqlite3_close(foodDB);
} else {
NSLog(@"ERROR: Failed to open/create database!");
}
}
}
答案 0 :(得分:1)
您的日志记录逻辑正在执行两次sqlite_step()
操作,这最多会产生误导。
相反,捕获第一个sqlite_step()
来电的返回代码并报告 值:
int rc = sqlite3_step(statement);
if (rc == SQLITE_OK)
{
NSLog(@"Food added.");
} else {
NSLog(@"ERROR: Failed to add food!: %d", rc);
}
您需要将此逻辑扩展到代码中的所有sqlite_xxx()
次调用。
答案 1 :(得分:1)
我发现了一个奇怪的情况,我在声明中使用的“定义”一词导致错误。有趣的是“定义”一词没有列在SQLite关键词列表(http://www.sqlite.org/lang_keywords.html)
中当我用“def”替换“definiton”问题解决了。 (createDatabase方法)
const char *sql_stmt = "CREATE TABLE IF NOT EXISTS foodDB (ID INTEGER PRIMARY KEY AUTOINCREMENT, categoryNumber INT, foodNumber INT, foodName TEXT, definition TEXT, ingredients TEXT, calorie INT, price INT, image1 TEXT, image2 TEXT, image3 TEXT, image4 TEXT)";
const char *sql_stmt = "CREATE TABLE IF NOT EXISTS foodDB (ID INTEGER PRIMARY KEY AUTOINCREMENT, categoryNumber INT, foodNumber INT, foodName TEXT, def TEXT, ingredients TEXT, calorie INT, price INT, image1 TEXT, image2 TEXT, image3 TEXT, image4 TEXT)";
答案 2 :(得分:0)
就我而言,我使用的是
<块引用>sqlite3_exec
代替
<块引用>sqlite3_prepare_v2
导致错误的原因。更改 SQL 语句解决了问题。