sqlite3_prepare_v2 добавляет SQLITE_ERROR в код iPhone - PullRequest
1 голос
/ 16 декабря 2009

У меня есть фрагмент кода, который работал, и другие его итерации, которые ДОЛЖНЫ работать в одном приложении, и сравнили код, и они идентичны по структуре Это сводит меня с ума !!!!!!

В этом случае 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 голосов
/ 29 ноября 2012

В моем случае это возвращаемое значение 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 голосов
/ 24 августа 2015

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

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

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

0 голосов
/ 18 марта 2010
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»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...