Я пытаюсь прочитать данные из базы данных 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;
}
}
Вам не следует делать ввод/вывод базы данных в главном потоке пользовательского интерфейса, так как это может привести к зависанию и сбою приложения.
Использование 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
Надеюсь это поможет!