sqlite3_prepare_v2在iPhone代码中抛出SQLITE_ERROR

时间:2009-12-16 14:49:12

标签: iphone sqlite

我有一段曾经工作的代码,以及在同一个应用程序中工作的其他迭代代码,并且比较了代码,它们在结构上是相同的。这让我想起了INSANE !!!!!!

在这种情况下,sqlite3_prepare_v2会抛出其中一个无用的SQLITE_ERROR异常。显然,它可以查找数据库,并打开数据库,但它无法为它准备语句。

有人有任何想法吗?我在这里绝望。

 second_maindatabaseName = @"database.db";
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
second_maindatabasePath = [documentsDir stringByAppendingPathComponent:second_maindatabaseName];

// Setup the database object
sqlite3 *database;
// Init the entry requirements Array
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
success = [fileManager fileExistsAtPath:second_maindatabasePath];
if(!success) {
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:second_maindatabaseName];
[fileManager copyItemAtPath:databasePathFromApp toPath:second_maindatabasePath error:nil];
[fileManager release];
}
if(sqlite3_open([second_maindatabasePath UTF8String], &database) == SQLITE_OK) {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

value1 = [defaults stringForKey:kConst1];   
value2 = [defaults stringForKey:kConst2];   
value3 = [defaults stringForKey:kConst3];   
value4 = [defaults stringForKey:kConst4];   
const char *sqlStatement = "SELECT * FROM myTable WHERE Field1 = ? AND Field2 = ? AND Field3 = ? AND Field4 = ?";
sqlite3_stmt *compiledStatement;
int error_code = sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL);
if(error_code == SQLITE_OK) {
// Loop through the results and add them to the feeds array
sqlite3_bind_text(compiledStatement,1,[value1 UTF8String],-1,SQLITE_TRANSIENT);
sqlite3_bind_text(compiledStatement,2,[value2 UTF8String],-1,SQLITE_TRANSIENT);
sqlite3_bind_text(compiledStatement,3,[value3 UTF8String],-1,SQLITE_TRANSIENT);
sqlite3_bind_text(compiledStatement,4,[value4 UTF8String],-1,SQLITE_TRANSIENT);

while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
// Read the data from the result row
NSString *aNewValue = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                        }
} 
sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);

3 个答案:

答案 0 :(得分:0)

NSString *aNewValue = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];

请尝试以下格式:

char *rowData_ptr = (char *) sqlite3_column_text (statement_ptr, 1)
fieldValue_ptr    = [[NSString alloc] initWithUTF8String:rowData_ptr];

您没有分配“aNewValue”

答案 1 :(得分:0)

在我的情况下,它的返回值为1.即

 #define SQLITE_ERROR 1 /* SQL error or missing database */

数据库以包的形式存在  sqlite3_open([path UTF8String], &database) == SQLITE_OK以及声明'const char *sql = "SELECT * FROM Images";'正在发挥作用。 但是这个"const char *sql = "SELECT Image FROM Images WHERE CatagoryId=2";'无法在sqlManager中执行,但在ios中却没有。

它没有工作,因为我更改了数据库中的列。 我通过更新数据库来纠正它

  • 重置模拟器。
  • 删除并捆绑数据库。
  • 清理和构建。

    它正在模拟器中读取旧数据库。

答案 2 :(得分:0)

我遇到了同样的错误,因为我试图插入一张没有指定列的表:

INSERT OR REPLACE INTO table_name (record_id,record_from_date,record_to_date,blister_status,blister_size) VALUES (?,?,?,?,?);

虽然表格没有列blister_size