SQLite на BlackBerry дает ошибку логики SQL или отсутствует ошибка базы данных

Привет всем, у меня есть следующая проблема. Недавно я добавил дополнительный столбец в свою базу данных в SQLite, и теперь он дает мне SQL logic error or missing database error Я внес изменения в базу данных и удалил виртуальную SD-карту на симуляторе BB, чтобы удалить старую базу данных и разрешить создание новой на симуляторе. Код функции, вызывающей проблему, следующий:

public Vector obtenerVoiceNotes() 
{
    Vector voiceNotes = new Vector();

    long id, idRemoto, duracion;
    byte[] audioArray;
    String nombre, comentario;

    try
    {
        // Se prepara la sentencia SQL
        Statement statement = _BD.createStatement("SELECT * FROM VoiceNote WHERE idUsuario = ?");
        statement.prepare();

        statement.bind(1, MainApp._user.getIdUser());

        // Se define un cursor para navegar por el resultado
        Cursor cursor = statement.getCursor();

        // Se itera sobre el cursor y se agrega al arreglo de notas 
        while(cursor.next())
        {
            Row row = cursor.getRow();

            id = row.getInteger(0);
            audioArray = row.getBlobBytes(1);
            nombre = row.getString(2);
            comentario = row.getString(3);
            idRemoto = row.getInteger(4);
            duracion = row.getInteger(5);

            long userId = MainApp._user.getIdUser();

            VoiceNote voiceNote = new VoiceNote(nombre, comentario, audioArray, userId);
            voiceNote.set_id(id);
            voiceNote.set_idRemoto(idRemoto);
            voiceNote.set_duration(duracion);

            voiceNotes.addElement(voiceNote);
        }

    }
    catch (DatabaseException e)
    {
        System.out.println();
        MainApp.messageDialog(e.toString());
    } catch (DataTypeException e) {
        // TODO Auto-generated catch block
        MainApp.messageDialog(e.toString());
    }

    // Se retorna el arreglo de notas obtenido
    return voiceNotes;
}

Исключение происходит на statement.prepare() это оператор создания для моей таблицы:

CREATE TABLE "VoiceNote" (
    "ID"         INTEGER PRIMARY KEY NOT NULL ,
    "Track"      BLOB,
    "Nombre"     VARCHAR(30) NOT NULL UNIQUE,
    "Comentario" VARCHAR(80),
    "idRemoto"   INTEGER     NOT NULL  DEFAULT -1,
    "Duracion"   INTEGER     NOT NULL  DEFAULT 0,
    "idUsuario"  INTEGER      NOT NULL  DEFAULT -1)

Новый столбец idUsuario если я отменить изменения, то больше нет проблем, есть идеи?

2 ответа

Решение

Похоже, база данных была изменена, но не зафиксирована - это означает, что следующий запрос к базе данных вернет состояние "повреждено".

Обязательно внесите любые изменения - и убедитесь, что такие экстремальные изменения, как это, выполняются на лету в заблокированной базе данных (не нужно, чтобы какие-то другие надоедливые потоки пытались получить к ней доступ!)

Мне удалось это решить. Я удалил приложение из симулятора вместе с SD-картой. Я сбросил и заново создал базу данных, чтобы у меня была правильная логика на телефоне, и она работала нормально.

Другие вопросы по тегам