Заполните список из базы данных в Android - PullRequest
3 голосов
/ 08 ноября 2011

Я пытаюсь запросить базу данных с одной таблицей, которую я создал в своем коде. Насколько я знаю, база данных создается правильно. Предполагается, что запрос используется для заполнения ListView, но когда я пытаюсь использовать результирующий курсор из моего запроса для создания SimpleCursorAdapter, он завершается с: java.lang.IllegalArgumentException: столбец '_id' не существует. Я предполагаю, что это можно проследить до курсора, а также курсор кажется пустым.

База данных создается в onCreate () моей реализации SQLiteOpenHelper следующим образом:

db.execSQL("CREATE TABLE " + TABLE_NAME + " (_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL, title TEXT NOT NULL, path TEXT NOT NULL);");

И тогда фактический запрос устанавливается и выполняется в моем классе DataHelper, который используется для взаимодействия с базой данных:

public Cursor selectEntryStartsWith(String partialName , String title)
{
    String where = "name LIKE '" + partialName + "%' AND title LIKE '" + title + "'";

    if (title== null || title.equals("")){
        where =  "name LIKE '" + partialName + "%'";
    }
    Cursor cur = mDatabase.query(TABLE_NAME, new String[] {"_id", "name", "title"}, where, null, null, null, "name");

    return cur;
}

Код, который использует курсор, выглядит следующим образом:

Cursor cursor = mDataHelper.selectEntryStartsWith("ex", null); //get all entries that start with "ex"
String [] from = new String [] { "name", "title" };
int [] to = new int [] { R.id.name, R.id.title };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(mContext, R.layout.listview_entry, cursor, from, to);

songList.setAdapter(adapter);

Я использую вкладки, чтобы этот последний фрагмент кода находился внутри onActivityCreated () фрагмента; Я не думаю, что было бы лучше расширить ListFragment, но я не думаю, что это проблема здесь, в частности.

Извините, если я пропустил информацию, которая может вам потребоваться, я уже некоторое время бьюсь над этой проблемой.

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Проблема была в том, что база данных действительно не была настроена должным образом, я попробовал другой метод вставки данных, то есть с использованием ContentValues ​​и вставки непосредственно в базу данных, в отличие от использования предварительно скомпилированного оператора вставки, который я использовал ранее.

Метод вставки теперь выглядит следующим образом:

public long insert(String name, String title) 
{
    ContentValues cv = new ContentValues();
    cv.put("name", name);
    cv.put("title", title);
    return mDatabase.insert(TABLE_NAME, null, cv);

    /* The old code was using this precompiled statement
    mInsertStatement.bindString(1, name);
    mInsertStatement.bindString(2, title);
    return mInsertStatement.executeInsert();
    */
}
1 голос
/ 08 ноября 2011

Знаете ли вы, что данные на самом деле находятся в базе данных? Запустите 'adb shell', перейдите в ваш каталог данных '/ data / data / [имя пакета приложения] / database'. Затем запустите sqlite3 [имя файла базы данных]. Запустите несколько прямых SQL-запросов и убедитесь, что данные существуют.

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

Как только все получится, добавьте элементы ListView в качестве последнего шага.

Некоторые вещи, которые стоит упомянуть. Если пользователь вводит значения запроса, вам необходимо экранировать эти значения оператора. Либо используйте selectionArgs в операторе запроса:

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#query(java.lang.String, java.lang.String [], java.lang.String, java.lang.String [], java.lang.String, java.lang.String, java.lang.String)

или используйте мой урезанный apache commons-lang и класс StringEscapeUtils.

http://www.touchlab.co/blog/android-mini-commons/

Еще одна вещь, которую следует учитывать, хотя, если у вас нет проблем, это, вероятно, не проблема. 'name' и 'title' могут быть хитрыми ключевыми словами в инструкциях sql.

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