Android Сбой ArrayAdapter при вставке - PullRequest
0 голосов
/ 10 января 2020

Приложение аварийно завершает работу при вставке данных из базы данных в autoCompleteTextView.

У меня есть 2 класса

Первый, тестовый класс

public class Test extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);
    final DataBaseHelper myDb = new DataBaseHelper(this);
    final String [] myData = myDb.SelectAllData();
    final AutoCompleteTextView autoCom = findViewById(R.id.stations);
    ArrayAdapter arrayAdapter=new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, myData);
    autoCom.setAdapter(arrayAdapter);
}}

Второй, DataBaseHelper класс

public class DataBaseHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "stations";
private static final String TABLE_STATIONS = "stations";

public DataBaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
}

public String[] SelectAllData() {
    try {
        String arrData[] = null;
        SQLiteDatabase db;
        db = this.getReadableDatabase();
        String strSQL = "SELECT name FROM " + TABLE_STATIONS;
        Cursor cursor = db.rawQuery(strSQL, null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                arrData = new String[cursor.getCount()];
                int i = 0;
                do {
                    arrData[i] = cursor.getString(0);
                    i++;
                } while (cursor.moveToNext());
            }
        }
        cursor.close();
        return arrData;
    } catch (Exception e) {
        return null;
    }
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}}

1 Ответ

1 голос
/ 10 января 2020

Проблема

Я считаю, что ваша проблема в том, что вы столкнетесь с ошибкой таблица не найдена , поскольку база данных не содержит таблиц. Тем не менее, вы перехватываете исключение и не предпринимаете никаких действий, так как приложение, похоже, не будет работать.

Если вы добавите

e.printStackTrace();

до return null тогда в журнале будет что-то похожее: -

2020-01-10 11:32:17.856 E/SQLiteLog: (1) no such table: stations
2020-01-10 11:32:17.856 W/System.err: android.database.sqlite.SQLiteException: no such table: stations (code 1 SQLITE_ERROR): , while compiling: SELECT name FROM stations
2020-01-10 11:32:17.859 W/System.err:     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
2020-01-10 11:32:17.859 W/System.err:     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:986)
2020-01-10 11:32:17.859 W/System.err:     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:593)
2020-01-10 11:32:17.859 W/System.err:     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:590)
2020-01-10 11:32:17.860 W/System.err:     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:61)
2020-01-10 11:32:17.860 W/System.err:     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
2020-01-10 11:32:17.860 W/System.err:     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
2020-01-10 11:32:17.860 W/System.err:     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1443)
2020-01-10 11:32:17.860 W/System.err:     at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1382)
2020-01-10 11:32:17.860 W/System.err:     at a.so59673151notable.DataBaseHelper.SelectAllData(DataBaseHelper.java:27)
2020-01-10 11:32:17.860 W/System.err:     at a.so59673151notable.MainActivity.onCreate(MainActivity.java:14)
  • Не рекомендуется перехватывать исключения SQLite, так как в общем случае это будут серьезные ошибки и это видно из вашего собственного опыта, сбивающего вас с толку, поскольку вы считаете, что проблема l ie в том, что массив не создается.

Исправление

Часть 1

Вы должны использовать метод onCreate класса DataBaseHelper для создания таблицы station .

например,

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_STATIONS + "(name TEXT);");
}
  • конечно, это может быть не та схема, которая вам нужна, это просто пример. Вы можете wi sh сослаться на CREATE TABLE

Часть 2

По мере создания базы данных DataBaseHelper onCreate Метод не будет запущен, так как он запускается только при создании базы данных. Таким образом, вам нужно удалить базу данных. При разработке самых простых способов сделать это: -

  1. Удалить / Очистить данные приложения
  2. Удалить приложение

После чего вы можете затем снова запустите приложение.

Подробнее

Чтобы получить данные из базы данных, вам необходимо добавить данные в базу данных, поэтому вам нужно добавить метод в класс DataBaseHelper по строкам (опять же предполагается, что таблица basi c создана выше): -

public long insertStation(String name) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put("name",name);
    return db.insert(TABLE_STATIONS,null,cv);
}

Вы можете sh прочитать insert

Затем вы можете в классе Test есть что-то вроде следующего: -

final DataBaseHelper myDb = new DataBaseHelper(this); //<<<<< EXISTING LINE
myDb.insertStation("MyFirstStation");
myDb.insertStation("MySecondStation");
final String [] myData = myDb.SelectAllData(); //<<<<< EXISTING LINE
  • Обратите внимание, что это только для тестирования, оно будет добавлять те же данные при каждом запуске приложения, поэтому для каждого прогона будет 2 дополнительных строки.

Тестирование

Вышеуказанные изменения были протестированы с использованием: -

    final DataBaseHelper myDb = new DataBaseHelper(this);
    myDb.insertStation("MyFirstStation");
    myDb.insertStation("MySecondStation");
    final String [] myData = myDb.SelectAllData();
    for (String s: myData) {
        Log.d("STATIONINFO","Station Name is " + s);
    }

Это приводит к (для первый запуск после установки приложения): -

2020-01-10 11:49:42.321 D/STATIONINFO: Station Name is MyFirstStation
2020-01-10 11:49:42.321 D/STATIONINFO: Station Name is MySecondStation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...