У меня есть представление списка, заполненное чтением адаптера из базы данных SQLite. Когда я прокручиваю вниз список на экране, я получаю следующую ошибку. Я также получаю ту же ошибку при переключении на другую вкладку в приложении (это приложение на основе вкладок).
close () никогда не вызывался явно для базы данных
DatabaseNotClosedException: приложение не закрывало курсор или объект базы данных, который был открыт здесь.
Кто-нибудь знает, почему это происходит? Я разместил файлы классов main и adapter ниже.
Основной класс:
public class Home extends ListActivity {
private DataBaseHelper myDbHelper;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.homeaz);
ListView yourList = (ListView) findViewById(android.R.id.list);
yourList.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Log.e("onClick",""+arg3);
Intent i = new Intent(Home.this,DetailView.class);
i.putExtra(DataBaseHelper.ID, arg3);
// Activity returns an result if called with startActivityForResult
/**Home.this.finish();*/
startActivity(i);
}
});
myDbHelper = new DataBaseHelper(this);
try {
myDbHelper.createDataBase();
} catch (IOException ioe) {
throw new Error("Unable to create database");
}
try {
myDbHelper.openDataBase();
}catch(SQLException sqle){
throw sqle;
}
try {
Cursor cursor = getPlaces();
showPlaces(cursor);
}
finally {
myDbHelper.close();
}
}
private static String ORDER_BY = NAME + " ASC";
private Cursor getPlaces() {
SQLiteDatabase db = myDbHelper.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, ORDER_BY);
startManagingCursor(cursor);
return cursor;
}
private void showPlaces(Cursor cursor) {
MyCustomAdapterClass adapter = new MyCustomAdapterClass(this,cursor, true); setListAdapter(adapter);
}
Класс адаптера:
public class MyCustomAdapterClass extends CursorAdapter {
public MyCustomAdapterClass(Context context, Cursor c, boolean autoRequery) {
super(context, c, autoRequery);
// TODO Auto-generated constructor stub
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.item, parent, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
((TextView) view.findViewById(R.id.name)).setText(cursor.getString(cursor.getColumnIndex("Name")));
((TextView) view.findViewById(R.id.description)).setText(cursor.getString(cursor.getColumnIndex("Area")));
((TextView) view.findViewById(R.id.address)).setText(cursor.getString(cursor.getColumnIndex("AddressLine1")));
switch (cursor.getInt(cursor.getColumnIndex("_id"))) {
case 1:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture1);
break;
case 2:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture2);
break;
case 3:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture3);
break;
case 4:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture4);
break;
case 5:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture5);
break;
case 6:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture6);
break;
case 7:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture7);
break;
case 8:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture8);
break;
case 9:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture9);
break;
case 10:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture10);
break;
case 11:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture11);
break;
case 12:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture12);
break;
case 13:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture13);
break;
case 14:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture14);
break;
case 15:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture15);
break;
case 16:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture16);
break;
case 17:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture17);
break;
case 18:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture18);
break;
case 19:
((ImageView) view.findViewById(R.id.Logo)).setImageResource(R.drawable.picture19);
break;
case 20:
Журнал:
09-10 18: 44: 25.495: INFO / ActivityManager (59): начало деятельности: намерение {cmp = com.Beutelkind.Database / .DetailView (имеет дополнительные функции)}
09-10 18: 44: 25.665: DEBUG / dalvikvm (415): GC_EXTERNAL_ALLOC освободил 4966 объектов / 284992 байта за 66 мс
09-10 18: 44: 26.284: DEBUG / dalvikvm (415): GC_EXTERNAL_ALLOC освободил 300 объектов / 14840 байт за 56 мс
09-10 18: 44: 27.435: INFO / ActivityManager (59): отображаемое действие com.Beutelkind.Database / .DetailView: 1888 мс (всего 1888 мс)
09-10 18: 44: 28.725: INFO / ActivityManager (59): начало деятельности: намерение {cmp = com.Beutelkind.Database / .Main}
09-10 18: 44: 28.825: INFO / База данных (415): sqlite вернул: код ошибки = 14, msg = не удается открыть файл в исходной строке 25467
09-10 18: 44: 28.825: ОШИБКА / База данных (415): ошибка sqlite3_open_v2 ("/ mnt / sdcard / DatabaseC.sqlite", & handle, 1, NULL)
09-10 18: 44: 29.535: INFO / ActivityManager (59): отображаемое действие com.Beutelkind.Database / .Main: 781 мс (всего 781 мс)
09-10 18: 44: 32.405: DEBUG / dalvikvm (415): GC_EXTERNAL_ALLOC освободил 2748 объектов / 167024 байта за 63 мс
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): высвобождение оператора в финализаторе. Убедитесь, что вы явно вызываете close () для вашего курсора: SELECT DISTINCT _id, Name, Description, Area, Postcode, AddressLine1, OpeningTimes, NearestTube, Cos
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): android.database.sqlite.DatabaseObjectNotClosedException: приложение не закрывало курсор или объект базы данных, который был открыт здесь
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): в android.database.sqlite.SQLiteCompiledSql. (SQLiteCompiledSql.java:62)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): в android.database.sqlite.SQLiteProgram. (SQLiteProgram.java:80)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): в android.database.sqlite.SQLiteQuery. (SQLiteQuery.java:46)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): в android.database.sqlite.SQLiteDirectCursorDriver.query (SQLiteDirectCursorDriver.java:42)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): в android.database.sqlite.SQLiteDatabase.rawQueryWithFactory (SQLiteDatabase.java:1345)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): в android.database.sqlite.SQLiteDatabase.queryWithFactory (SQLiteDatabase.java:1229)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): в android.database.sqlite.SQLiteDatabase.query (SQLiteDatabase.java:1184)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): в com.Beutelkind.Database.DetailView.populateFields (DetailView.java:79)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): в com.Beutelkind.Database.DetailView.onCreate (DetailView.java:70)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2627)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2679)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): на android.app.ActivityThread.access $ 2300 (ActivityThread.java:125)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:2033)09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): на android.os.Handler.dispatchMessage (Handler.java:99)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): на android.os.Looper.loop (Looper.java:123)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): на android.app.ActivityThread.main (ActivityThread.java:4627)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): at java.lang.reflect.Method.invokeNative (собственный метод)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): в java.lang.reflect.Method.invoke (Method.java:521)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:868)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:626)
09-10 18: 44: 32.455: WARN / SQLiteCompiledSql (415): at dalvik.system.NativeStart.main (собственный метод)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): close () никогда не вызывался явно для базы данных '/data/data/com.Beutelkind.Database/databases/DatabaseC.sqlite'
09-10 18: 44: 32.475: ОШИБКА / База данных (415): android.database.sqlite.DatabaseObjectNotClosedException: приложение не закрывало курсор или объект базы данных, который был открыт здесь
09-10 18: 44: 32.475: ОШИБКА / База данных (415): в android.database.sqlite.SQLiteDatabase. (SQLiteDatabase.java:1810)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): в android.database.sqlite.SQLiteDatabase.openDatabase (SQLiteDatabase.java:817)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): в android.database.sqlite.SQLiteDatabase.openOrCreateDatabase (SQLiteDatabase.java:851)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): в android.database.sqlite.SQLiteDatabase.openOrCreateDatabase (SQLiteDatabase.java:844)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): в android.app.ContextImpl.openOrCreateDatabase (ContextImpl.java:540)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): в android.content.ContextWrapper.openOrCreateDatabase (ContextWrapper.java:203)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): в android.database.sqlite.SQLiteOpenHelper.getWritableDatabase (SQLiteOpenHelper.java:98)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): в android.database.sqlite.SQLiteOpenHelper.getReadableDatabase (SQLiteOpenHelper.java:158)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): на com.Beutelkind.Database.DetailView.populateFields (DetailView.java:77)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): на com.Beutelkind.Database.DetailView.onCreate (DetailView.java:70)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2627)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2679)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): на android.app.ActivityThread.access $ 2300 (ActivityThread.java:125)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:2033)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): на android.os.Handler.dispatchMessage (Handler.java:99)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): на android.os.Looper.loop (Looper.java:123)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): на android.app.ActivityThread.main (ActivityThread.java:4627)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): at java.lang.reflect.Method.invokeNative (собственный метод)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): на java.lang.reflect.Method.invoke (Method.java:521)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:868)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:626)
09-10 18: 44: 32.475: ОШИБКА / База данных (415): at dalvik.system.NativeStart.main (собственный метод)