Я новичок в Android и перед тем, как задать вопрос здесь, я был googling, но по этому вопросу я не могу найти ответ. (также у этого stackoverflow.com/questions/4195089 нет ответа).invalid statement in fillwindow() в Android
В моем тестовом приложении на эмуляторе у меня есть ошибка ОШИБКА/Курсор (1512): Неверный оператор в fillWindow() на LogCat, когда я нажимаю кнопку «Назад» при втором действии.
11-23 19: 06: 05,050: ОТЛАДКА/TestDB/отладки/MainActivity (1512): OnCreate
11-23 19: 06: 06,820: ОТЛАДКА/TestDB/отладки/MainActivity (1512): OpenDatabase
11-23 19: 06: 07.240: DEBUG/TestDB/Debug/MainActivity (1512): String [] from
11-23 19: 06: 07.270: DEBUG/TestDB/Debug/MainActivity (1512): SimpleCursorAdapter
11 -23 19: 06: 07.500: DEBUG/TestDB/Debug/MainActivity (1512): myDbHelper.close
11-23 19: 06: 07.520: DEBUG/TestDB/Debug/MainActivity (1512): onStart
11-23 19: 06: 07.551: DEBUG/TestDB/Debug/MainActivity (1512): onResu me
11-23 19: 06: 09.040: INFO/ActivityManager (587): Отображается активность ru.olegi/.MainActivity: 7962 ms
11-23 19: 06: 11.850: INFO/ActivityManager (587): Начальная деятельность : Intent {comp = {ru.olegi/ru.olegi.AnotherActivity}}
11-23 19: 06: 12.100: DEBUG/TestDB/Debug/AnotherActivity (1512): onCreate
11-23 19: 06: 12.970 : INFO/ActivityManager (587): отображаемая активность ru.olegi /. Дополнительная информация: 1100 мс
11-23 19: 06: 14.550: ОШИБКА/Курсор (1512): Недопустимый оператор в fillWindow()
11-23 19: 06: 14.590: DEBUG/TestDB/Debug/MainActivity (1512): onStart
11-23 19: 06: 14.600: DEBUG/T estDB/Debug/MainActivity (1512): onResume
Весь код хранится в OnCreate. Поэтому, когда я нажимаю назад, ListView пуст. Для этого переместите код в onStart. Вот лог для этого и опять Invalid заявление в fillWindow()
11-23 19: 26: 06,280: DEBUG/TestDB/Debug/MainActivity (6597): OnCreate
11-23 19: 26: 06.462 : ОТЛАДКА/TestDB/отладки/MainActivity (6597): OnStart
11-23 19: 26: 06,700: ОТЛАДКА/TestDB/отладки/MainActivity (6597): OpenDatabase
11-23 19: 26: 06.740: ОТЛАДКА/TESTDB/Debug/MainActivity (6597): String [] from
11-23 19: 26: 06.750: DEBUG/TestDB/Debug/MainActivity (6597): SimpleCursorAdapter
11-23 19: 26: 06.981: DEBUG/TestDB/Debug/MainActivity (6597): myDbHelper.close
11-23 19: 26: 07.010: DEBUG/TestDB/Debug/MainActivity (6597): onResume
11-23 19: 26: 08.030: INFO/ActivityManager (587): Отображается активность ru.olegi/.MainActivity: 3876 мс
11-23 19: 26: 15.419: INFO/ActivityManager (587): Начальная деятельность: Intent {comp = {ru.olegi/ru.olegi.AnotherActivity}}
11-23 19: 26: 15.770: DEBUG/TestDB/Debug/AnotherActivity (6597): onCreate
11-23 19: 26: 16.440: INFO/ActivityManager (587): Отображается активность ru.olegi /. Дополнительная информация: 1001 мс
11-23 19:26: 17.860: ОШИБКА/Курсор (6597): Недопустимый оператор в fillWindow()
11-23 19:26:17.870: ОТЛАДКА/TestDB/отладки/MainActivity (6597): OnStart
11-23 19: 26: 18,260: ОТЛАДКА/TestDB/отладки/MainActivity (6597): OpenDatabase
11-23 19: 26: 18.290: ОТЛАДКА/TestDB/Debug/MainActivity (6597): String [] from
11-23 19: 26: 18.310: DEBUG/TestDB/Debug/MainActivity (6597): SimpleCursorAdapter
11-23 19: 26: 18.670: DEBUG/TestDB/отладки/MainActivity (6597): myDbHelper.close
11-23 19: 26: 18.700: ОТЛАДКА/TestDB/отладки/MainActivity (6597): onResume
Этот код
package ru.olegi;
import java.io.IOException;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.SQLException;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
private DatabaseHelper myDbHelper;
private ListView lv1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("TestDB/Debug/MainActivity", "onCreate");
setContentView(R.layout.main);
}
@Override
public void onStart() {
super.onStart();
Log.d("TestDB/Debug/MainActivity", "onStart");
// DATABASE OPEN - START
DatabaseHelper myDbHelper = new DatabaseHelper(this);
myDbHelper = new DatabaseHelper(this);
try {
myDbHelper.createDataBase();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
myDbHelper.openDataBase();
}catch(SQLException sqle){
throw sqle;
}
Log.d("TestDB/Debug/MainActivity", "openDataBase");
// DATABASE OPEN - END
Cursor c = myDbHelper.fetchAllFoodname();
startManagingCursor(c);
lv1 = (ListView) findViewById(R.id.ListView01);
String[] from = new String[] { DatabaseHelper.KEY_NAME };
int[] to = new int[] { android.R.id.text1};
Log.d("TestDB/Debug/MainActivity", "String[] from");
SimpleCursorAdapter notes =
new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, c, from, to);
Log.d("TestDB/Debug/MainActivity", "SimpleCursorAdapter");
lv1.setAdapter(notes);
lv1.setOnItemClickListener(new OnItemClickListener() {
//@Override
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
Intent intent = new Intent();
//getApplicationContext()
intent.setClass(MainActivity.this, AnotherActivity.class);
//intent.putExtra(AnotherActivity.EXT_ID, id);
startActivity(intent);
//finish();
}
});
// DATABASE CLOSE - START
myDbHelper.close();
Log.d("TestDB/Debug/MainActivity", "myDbHelper.close");
// DATABASE CLOSE - END
}
@Override
public void onResume(){
super.onResume();
Log.d("TestDB/Debug/MainActivity", "onResume");
}
@Override
public void onDestroy(){
super.onDestroy();
Log.d("TestDB/Debug/MainActivity", "onDestroy");
}
}
Здесь groups.google.com/group/android-developers/browse_thread/thread/8bec793c626fb405 я прочитал, для исправления fillwindow (ошибка) нужно
Короткий ответ; Объект вашей базы данных (db) находится в неправильном объеме. Дольше ответ; Объявив db в методе , вы говорите JVM, что когда метод завершит вашу базу данных соединение (db) больше не является полезным. Что вы должны сделать, это объявить db в уровне класса вместо метода уровне, создать его в onCreate и закрыть его в onDestroy.
ОК, я перемещаю разделы // БАЗОВЫЕ ДАННЫЕ ОТКРЫТЫ - СТАРТ и // БАЗЫ ДАННЫХ ЗАКРЫТЬ - НАЧАТЬСЯ в onCreate и toDestory. И теперь у меня есть исключение на старте
11-23 19: 35: 39,310: DEBUG/TestDB/Debug/MainActivity (8975): OnCreate
11-23 19: 35: 40,050: DEBUG/TestDB/Debug/MainActivity (8975): openDataBase
11-23 19: 35: 40.050: DEBUG/TestDB/Debug/MainActivity (8975): onStart
11-23 19: 35: 40.090: DEBUG/AndroidRuntime (8975): выключение виртуальной машины
11-23 19: 35: 40.100: WARN/dalvikvm (8975): threadid = 3: резьба, выходящая с неперехваченным исключением (группа = 0x4000fe70)
11-23 19: 35: 40.120: ERROR/AndroidRuntime (8975): Неактивный обработчик: основной поток из-за неперехваченного исключения
11-23 19: 35: 40.300: ERROR/AndroidRuntime (8975): java.lang.RuntimeException: не удалось запустить активность ComponentInfo {ru.olegi/ru.olegi.MainActivity}: java.lang.NullPointerException
11- 23 19: 35: 40.300: ОШИБКА/AndroidRuntime (8975): at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2268)
11-23 19: 35: 40.300: ERROR/AndroidRuntime (8975): на android. app.ActivityThread.handleLaunchActivity (ActivityThread.java:2284)
11-23 19: 35: 40,300: ОШИБКА/AndroidRuntime (8975): в android.app.ActivityThread.access $ 1800 (ActivityThread.java:112)
11- 23 19: 35: 40.300: ERROR/AndroidRuntime (8975): at android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1692)
11-23 19: 35: 40.300: ОШИБКА/AndroidRuntime (8975): at android.os.Handler.dispatchMessage (Handler.java:99)
11-23 19: 35: 40.300: ERROR/AndroidRuntime (8975) : at android.os.Looper.loop (Looper.java:123)
11-23 19: 35: 40.300: ОШИБКА/AndroidRuntime (8975): at android.app.ActivityThread.main (ActivityThread.java:3948)
11-23 19: 35: 40.300: ОШИБКА/AndroidRuntime (8975): at java.lang.(Способ).
11-23 19: 35: 40.300: ОШИБКА/AndroidRuntime (8975): при java.lang.reflect.Method.invoke (Method.java:521)
11-23 19 : 35: 40.300: ERROR/AndroidRuntime (8975): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:782)
11-23 19: 35: 40.300: ERROR/AndroidRuntime (8975) : at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:540)
11-23 19: 35: 40.300: ERROR/AndroidRuntime (8975): at dalvik.system.NativeStart.main (собственный метод)
11-23 19: 35: 40.300: ERROR/AndroidRuntime (8975): вызвано: java.lang.NullPointerException
11-23 19: 35: 40.300: ERROR/AndroidRuntime (8975)): at ru.olegi.MainActivity.onStart (MainActivity.java:59)
11-23 19: 35: 40.300: ОШИБКА/AndroidRuntime (8975): at android.app.Instrumentation.callActivityOnStart (Instrumentation.java:1205)
11-23 19: 35: 40.300: ERROR/AndroidRuntime (8975): at android.app.Activity.performStart (Activity.java:3490)
11-23 19: 35: 40.300: ERROR/AndroidRuntime (8975) : в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2240)
11-23 19: 35: 40.300: ERROR/AndroidRuntime (8975): 11 ... подробнее
Вот код с перемещаемых DB-секциями:
package ru.olegi;
import java.io.IOException;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.SQLException;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
private DatabaseHelper myDbHelper;
private ListView lv1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("TestDB/Debug/MainActivity", "onCreate");
setContentView(R.layout.main);
// DATABASE OPEN - START
DatabaseHelper myDbHelper = new DatabaseHelper(this);
myDbHelper = new DatabaseHelper(this);
try {
myDbHelper.createDataBase();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
myDbHelper.openDataBase();
}catch(SQLException sqle){
throw sqle;
}
Log.d("TestDB/Debug/MainActivity", "openDataBase");
// DATABASE OPEN - END
}
@Override
public void onStart() {
super.onStart();
Log.d("TestDB/Debug/MainActivity", "onStart");
Cursor c = myDbHelper.fetchAllFoodname();
startManagingCursor(c);
lv1 = (ListView) findViewById(R.id.ListView01);
String[] from = new String[] { DatabaseHelper.KEY_NAME };
int[] to = new int[] { android.R.id.text1};
Log.d("TestDB/Debug/MainActivity", "String[] from");
SimpleCursorAdapter notes =
new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, c, from, to);
Log.d("TestDB/Debug/MainActivity", "SimpleCursorAdapter");
lv1.setAdapter(notes);
lv1.setOnItemClickListener(new OnItemClickListener() {
//@Override
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
Intent intent = new Intent();
//getApplicationContext()
intent.setClass(MainActivity.this, AnotherActivity.class);
//intent.putExtra(AnotherActivity.EXT_ID, id);
startActivity(intent);
//finish();
}
});
}
@Override
public void onResume(){
super.onResume();
Log.d("TestDB/Debug/MainActivity", "onResume");
}
@Override
public void onDestroy(){
super.onDestroy();
Log.d("TestDB/Debug/MainActivity", "onDestroy");
// DATABASE CLOSE - START
myDbHelper.close();
Log.d("TestDB/Debug/MainActivity", "myDbHelper.close");
// DATABASE CLOSE - END
}
}
Пожалуйста, помогите исправить Invalid заявления в fillWindow()
AnotherActivity - просто с TextView, MainActivity имеет только ListView + OnClick слушатель