Не могу прочитать информацию о базе данных в Android

0

Я пытаюсь прочитать данные из базы данных SQL. Я думаю, что мой код прав, но некоторые, как я не могу отобразить в текстовом поле. Приложение просто закрывается, когда я использую функцию compareData().

(У меня разные сигналы тревоги. Я хочу прочитать их все и показать их идентификатор и имя.)

Вот мой код:

public class RingAlarm extends Activity {

TextView texto;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.ring_alarm);

    texto = (TextView) findViewById(R.id.textView1);

    texto.setText(compareData());
}

public String compareData(){
    String result = "";
    String str1 = "";
    String str2 = "";

    String[] columns = new String[]{Database.COLUMN_ALARM_ID, Database.COLUMN_ALARM_NAME};

    Cursor cursor = Database.getDatabase().query(Database.ALARM_TABLE, columns, null, null, null, null, null);

    while(cursor.moveToNext()){
        str1 = str1 + cursor.getString(0);
        str2 = str2 + cursor.getString(1);
        result = result + str1 + " - " + str2 + "\n";
    }

    cursor.close();

    return result;
}
}
  • 0
    попробуйте распечатать несколько журналов. Вы получаете что-то в результате.
  • 0
    Пожалуйста, опубликуйте трассировку стека исключений из logcat
Теги:
database

1 ответ

0

Вам не следует делать ввод/вывод базы данных в главном потоке пользовательского интерфейса, так как это может привести к зависанию и сбою приложения.

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

Следующий код включает метод compareData() в метод doInBackground() AsyncTask. Затем TextView можно установить в методе onPostExecute, используя результат, возвращаемый из doInBackground(). Все вычисления должны выполняться в doInBackground(), а объекты пользовательского интерфейса должны быть установлены в onPostExecute(). Чтобы выполнить эту задачу в своем onCreate(), вы просто создаете экземпляр задачи и вызываете.execute().

public class RingAlarm extends Activity {

    TextView texto;

    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ring_alarm);

        MyTask myTask = new MyTask();
        myTask.execute();
    }

    private class MyTask extends AsyncTask<Void, Void, String> {

        /**
         * The system calls this to perform work in a worker thread and
         * delivers it the parameters given to AsyncTask.execute()
         */
        @Override
        protected String doInBackground(Void... params) {
            String result = "";
            String str1 = "";
            String str2 = "";

            String[] columns = new String[]{Database.COLUMN_ALARM_ID, Database.COLUMN_ALARM_NAME};

            Cursor cursor = Database.getDatabase().query(Database.ALARM_TABLE, columns, null, null, null, null, null);

            while(cursor.moveToNext()){
                str1 = str1 + cursor.getString(0);
                str2 = str2 + cursor.getString(1);
                result = result + str1 + " - " + str2 + "\n";
            }

            cursor.close();

            return result;
        }

        /**
        * The system calls this to perform work in the UI thread and delivers
        * the result from doInBackground()
        */
        @Override
        protected void onPostExecute(String result) {
            texto = (TextView) findViewById(R.id.textView1);

            texto.setText(result);    
        }
    }

}

Эта ссылка полностью объясняет, как работает AsyncTask: http://developer.android.com/reference/android/os/AsyncTask.html

Надеюсь это поможет!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню