Получил ВСТАВИТЬ в SQLite на Android? - PullRequest
2 голосов
/ 05 апреля 2010

Я пытаюсь настроить простую базу данных SQLite в Android, обрабатывая схему через подкласс SQLiteOpenHelper . Однако, когда я запрашиваю свои таблицы, столбцы, которые я вставил, никогда не появляются.

А именно, в методе SQLiteOpenHelper onCreate(SQLiteDatabase db) я использую db.execSQL() для выполнения команд CREATE TABLE, затем попробовал и db.execSQL, и db.insert() для запуска команд INSERT в только что созданных таблицах. Кажется, это работает нормально, но когда я пытаюсь запросить их, я всегда получаю 0 возвращаемых строк (для отладки выполняемые мной запросы просты SELECT * FROM table и проверяют курсор getCount()).

Кто-нибудь сталкивался с чем-то подобным раньше? Эти команды выполняются в командной строке sqlite3. Это те ошибки, которые я пропускаю (например, INSERTS не должен / не должен заканчиваться точкой с запятой, или какая-то проблема, связанная с несколькими таблицами)? Я приложил часть кода ниже.

Спасибо за ваше время и дайте мне знать, если я смогу уточнить.


@Override
public void onCreate(SQLiteDatabase db)
{
    db.execSQL("CREATE TABLE "+ LEVEL_TABLE +" (" + 
               "  "+ _ID +" INTEGER PRIMARY KEY AUTOINCREMENT," +
               "  level TEXT NOT NULL,"+
               "  rows INTEGER NOT NULL,"+
               "  cols INTEGER NOT NULL);");

    db.execSQL("CREATE TABLE "+ DYNAMICS_TABLE +" (" + 
               "  level_id INTEGER NOT NULL," +
               "  row INTEGER NOT NULL,"+
               "  col INTEGER NOT NULL,"+
               "  type INTEGER NOT NULL);");

    db.execSQL("CREATE TABLE "+ SCORE_TABLE +" (" + 
               "  level_id INTEGER NOT NULL," +
               "  score INTEGER NOT NULL,"+
               "  date_achieved DATE NOT NULL,"+
               "  name TEXT NOT NULL);");
    this.enterFirstLevel(db);
}

И пример кода вставки, который я сейчас использую, который вызывается в enterFirstLevel() (некоторые значения жестко запрограммированы, чтобы запустить его ...):

private void insertDynamic(SQLiteDatabase db, int row, int col, int type)
{
    ContentValues values = new ContentValues();

    values.put("level_id", "1");
    values.put("row", Integer.toString(row));
    values.put("col", Integer.toString(col));
    values.put("type", Integer.toString(type));

    db.insertOrThrow(DYNAMICS_TABLE, "col", values);
}

Наконец, код запроса выглядит так:

private Cursor fetchLevelDynamics(int id)
{
    SQLiteDatabase db = this.leveldata.getReadableDatabase();
    try {
        String fetchQuery = "SELECT * FROM " + DYNAMICS_TABLE;
        String[] queryArgs = new String[0];         
        Cursor cursor = db.rawQuery(fetchQuery, queryArgs);

        Activity activity = (Activity) this.context;
        activity.startManagingCursor(cursor);
        return cursor;
    }
    finally {
        db.close();
    }
}

Ответы [ 3 ]

2 голосов
/ 21 апреля 2010

Разобрался, было несколько разных вещей. Прежде всего, код запроса: Cursor может перемещаться только по открытой базе данных. Таким образом, приведенный выше метод запроса вернет Cursor, а затем закроет базу данных в блоке finally.

Хотя он не будет работать должным образом, Курсор не выдаст ошибку при работе в закрытой базе данных. Он просто скажет, что вернул 0 строк (поэтому я подумал, что ошибка была в коде INSERT).

Кроме того, я забыл несколько вещей SQL, а именно, что row и col не являются хорошими именами для полей таблицы, и мне удалось избавиться от нескольких ошибок, переименовав их в row_num и col_num

0 голосов
/ 05 апреля 2010

Попробуйте использовать ноль для второго параметра в

db.insertOrThrow(DYNAMICS_TABLE, "col", values);
0 голосов
/ 05 апреля 2010

Это выглядит достаточно хорошо для меня.

Для устранения неполадок я бы предложил добавить хотя бы один столбец в ваш queryArgs. Я не уверен в эффекте отправки в пустой список. Возможно, это приведет к тому, что строки не будут возвращены, даже если есть результаты.

Нет необходимости преобразовывать ваши целочисленные значения в строки в ContentValues. Попробуйте заменить values.put("row", Integer.toString(row)); просто values.put("row", row); Вероятно, это не является причиной вашей проблемы, так как это вызвало бы исключение, если бы оно возражало против строк.

Я никогда не использовал SQLiteDatabase.rawQuery (), возможно, попробуйте более часто используемый .query ()?

Я не вижу, что ваш код делает с курсором, возвращаемым fetchLevelDynamics (), поэтому я не могу исключить там логические ошибки.

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