Исключение DatabaseNotClosed - прокрутка представления списка - PullRequest
0 голосов
/ 10 сентября 2011

У меня есть представление списка, заполненное чтением адаптера из базы данных 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 (собственный метод)

1 Ответ

0 голосов
/ 10 сентября 2011

Легко, вы не закрываете дескрипторы базы данных. Например, вы открываете курсор в getPlaces, но никогда не закрываете его, когда закончите, используя его, ни объект db, откуда он пришел.

...