我遇到了SQLite的问题。当我尝试插入条目时,出现错误。通过使用错误代码21,我发现错误是"SQLITE MISUSE"。
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!");
}
}
}