2012-06-28 2 views
0

Я пытаюсь прочитать данные из базы данных sqlite в приложении ios. Когда я запускаю приложение, он может открыть базу данных, но в файле журнала он показывает сообщение «Проблема с инструкцией подготовки». Я не знаю, что случилось с моей подготовки заявления Вот мой код -ios - sqlite statement statement

-(NSString *)dataFilePath{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    return [documentsDirectory stringByAppendingPathComponent:kFilename]; 
} 

В viewDidLoad меня -

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    myarray = [[NSMutableArray alloc]init]; 

    sqlite3 *database; 
    if(sqlite3_open([[self dataFilePath]UTF8String], &database)!=SQLITE_OK){ 
     sqlite3_close(database); 
     NSAssert(0, @"Failed to open database"); 
    } 

    const char *createSQL = @"SELECT ID, TITLE FROM FIRST ORDER BY TITLE;"; //first is the table in the database 
    sqlite3_stmt *sqlStmt; 
    if(sqlite3_prepare_v2(database, [createSQL UTF8String], -1, &sqlStmt, nil)!=SQLITE_OK){ 
     NSLog(@"Problem with prepare statement"); //this is where the code gets stuck and I don't know why 
    }else{ 

     while(sqlite3_step(sqlStmt)==SQLITE_ROW){ 
      NSInteger number = sqlite3_column_int(sqlStmt, 0); 
      NSString *title = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStmt, 1)]; 
      [myarray addObject:title]; 
     } 
     sqlite3_finalize(sqlStmt); 
    } 
    sqlite3_close(database); 
} 
+0

Вероятно, путь к БД неверен. В моем случае я добавил существующую базу данных sqlite в проект, и в этом случае она будет храниться в папке «AppName.app» не под 'Documents' – shebelaw

ответ

1

Если подготовить заявление терпит неудачу, а не просто отчет «Проблема с подготовить заявление», попробуйте получения сообщения об ошибке, например,

NSLog(@"%s Prepare failure '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database)); 

Это может дать вам более полное представление о проблеме.

Проблема, которую я видел в прошлом, заключается в том, что база данных не может быть найдена (поскольку она не была включена в комплект, опечатку в имени и т. Д.), Но стандартная функция sqlite3_open создаст ее, если она не существует, и поэтому sqlite3_open будет успешным, но указанная таблица не будет найдена в пустой, недавно созданной базе данных. Лучше, чем sqlite3_open бы:

sqlite3 *database; 
if (sqlite3_open_v2([[self dataFilePath] UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) { 
    sqlite3_close(database); // not sure you need to close if the open failed 
    NSAssert(0, @"Failed to open database"); 
} 

Таким образом, вы получите предупреждение, если база данных не найдены. Но если вы уже сделали sqlite3_open, у вас может быть пустая база данных, поэтому вам может потребоваться сбросить ваш симулятор и/или удалить приложение с вашего устройства, прежде чем попробовать его с помощью sqlite3_open_v2.

+0

В стороне, я был бы осторожен в использовании имен таблиц (или имен полей), которые являются такими же, как зарезервированные слова SQL (например, 'FIRST'). Я сомневаюсь, что это проблема, но в лучшем случае это запутанно. – Rob

+0

После того, как я использовал обновленный оператор sqlite3_open_v2 и очистил симулятор, его отказ в инструкции NSAssert и предоставление сообщения - Не удалось открыть базу данных. Почему это не открывает базу данных, я не знаю –

+0

@AshishAgarwal Является ли база данных частью вашего пакета? Откройте целевые настройки, перейдите на вкладку «Сборка фаз» и разверните «Копировать ресурсы Bundle» и убедитесь, что ваша база данных - это список файлов, которые нужно включить. Вы также можете подтвердить, что включено в ваше приложение, открыв папки симулятора в Finder, например. «~/Library/Application Support/iPhone Simulator» (если вы не видите папку «Библиотека», выделите ее, перейдя на терминал и выпустите команду «chflags nohidden»/Library'). – Rob

0

Попробуйте изменить ноль на NULL. Кроме того, попробуйте определить инструкцию SQL как const char.

.... 

const char *sql = "SELECT ID, TITLE FROM FIRST ORDER BY TITLE"; 
sqlite3_stmt *sqlStmt; 

if(sqlite3_prepare_v2(database, sql, -1, &sqlStmt, NULL)!=SQLITE_OK){ 

.... 
+0

той же проблемой, ничего произошел –

1

Несколько вещей, которые вы можете попробовать.

  1. Очистите приложение, Удалить из тренажера или устройств & попробуйте установить новую копию еще раз и посмотреть, если он работает.

  2. Откройте свою БД в терминале & попробуйте запустить свое заявление sql там. Убедитесь, что вы получаете желаемый результат.