2009-12-16 3 views
1

У меня есть часть кода, который раньше работал, и другие итерации, которые работают в одном приложении, и сравнивали код, и они идентичны по своей структуре. Это заставляет меня ИНСАНЕ !!!!!!sqlite3_prepare_v2 вызывает SQLITE_ERROR в коде iPhone

В этом случае 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); 
+0

Каково значение error_code после вызова? –

+0

Просто пытаясь выяснить, какая ошибка это бросает ... он улавливает код ошибки, возвращаемый sqlite3_prepare_v2, поэтому я могу оценить это в отладчике при прохождении через него. – incognitii

+0

@DonDickinson, в моем случае его возвращаемое значение 1. то есть '#define SQLITE_ERROR 1/* Ошибка SQL или отсутствующая база данных * /' База данных присутствует в виде пакета и 'sqlite3_open ([путь UTF8String] и база данных) == SQLITE_OK', а также оператор 'const char * sql = "SELECT * FROM Images";' работал. Но это «const char * sql =» SELECT Image FROM Images WHERE CatagoryId = 2 »; не работает, его выполнение выполняется в sqlManager, но не в ios. – HDdeveloper

ответ

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"

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.

Он не работал, так как я изменил колонку в базе данных. Я исправил это, обновив базу данных

  • перезагрузить симулятор.
  • удалить и добавить базу данных в комплекте.
  • очистить и построить.

    Он читал старую базу данных в симуляторе.

0

Я получил ту же ошибку, потому что я пытался выполнить вставку в таблицу, которая не имела столбца, который указал:

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

пока таблица не имеет столбец blister_size.

Смежные вопросы