簡體   English   中英

DatabaseNotClosed異常-列表視圖滾動

[英]DatabaseNotClosed Exception - List View Scrolling

我有一個從SQLite數據庫讀取的適配器填充的列表視圖。 當我在屏幕上的列表中向下滾動時,出現以下錯誤。 切換到應用程序中的另一個選項卡(基於選項卡的應用程序)時,我也遇到相同的錯誤。

從未在數據庫DatabaseNotClosedException上顯式調用close():應用程序未關閉此處打開的游標或數據庫對象。

有人知道為什么會這樣嗎? 我已經在下面發布了主文件和適配器類文件。

主類:

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在66ms 09-10中釋放了4966個對象/ 284992字節09-10 18:44:26.284:DEBUG / dalvikvm(415):GC_EXTERNAL_ALLOC在56ms中釋放了300對象/ 14840字節了09-10 18:44:27.435:INFO / ActivityManager(59 ):顯示的活動com.Beutelkind.Database / .DetailView:1888 ms(總計1888 ms)09-10 18:44:28.725:INFO / ActivityManager(59):啟動活動:目的{cmp = com.Beutelkind.Database /。 Main} 09-10 18:44:28.825:INFO / Database(415):sqlite返回:錯誤代碼= 14,msg =無法在源代碼行25467中打開文件09-10 18:44:28.825:ERROR / Database(415) :sqlite3_open_v2(“ / mnt / sdcard / DatabaseC.sqlite”,&handle,1,NULL)失敗09-10 18:44:29.535:INFO / ActivityManager(59):顯示的活動com.Beutelkind.Database /。主要:781 ms (總共781毫秒)09-10 18:44:32.405:調試/ dalvikvm(415):GC_EXTERNAL_ALLOC釋放了2748個對象/ 16702 63毫秒中的4個字節09-10 18:44:32.455:WARN / SQLiteCompiledSql(415):在終結器中釋放語句。 請確保您在光標上顯式調用close():SELECT DISTINCT _id,名稱,描述,區域,郵政編碼,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):at 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 / SQL iteCompiledSql(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):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)09-10 18:44:32.455:WARN / SQLiteCompiledSql(415):at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)09-10 18:44:32.455:WARN / SQLiteCompiledSql(415):at android.app.ActivityThread.access $ 2300(ActivityThread.java:125)09-10 18 :44:32.455:WARN / SQLiteCompi ledSql(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):在java.lang.reflect.Method.invokeNative(本機方法)09-10 18: 44:32.455:WARN / SQLiteCompiledSql(415):at java.lang.reflect.Method.invoke(Method.java:521)09-10 18:44:32.455:WARN / SQLiteCompiledSql(415):at com.android.internal .os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)09-10 18:44:32.455:WARN / SQLiteCompiledSql(415):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 09-10 18:44:32.455:WARN / SQLiteCompiledSql(415):在dalvik.system.NativeStart.main(本機方法)09-10 18:44:32.475:ERROR / Database(415):close()從不 xplicitly調用了數據庫'/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:錯誤/ Database(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:4 4: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.Acti vityThread $ 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):位於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:ERROR / Database(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:錯誤/ Database(415):位於dalvik.system.NativeStart.main(本機方法)

很簡單,您沒有關閉數據庫句柄。 例如,您在getPlaces中打開了一個游標,但在使用完它或它所來自的db對象時,永遠不要關閉它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM