定稿尚未停用或关闭的游标 [英] Finalizing a Cursor that has not been deactivated or closed

查看:172
本文介绍了定稿尚未停用或关闭的游标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的下面code访问来自源码数据库的数据。

  @覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.profile);
    type_spn =(微调)findViewById(R.id.type_spn);
    animal_spn =(微调)findViewById(R.id.animal_spn);
    habitat_txt =(的TextView)findViewById(R.id.life_txt);
    diet_txt =(的TextView)findViewById(R.id.habit_txt);
    discription_txt =(的TextView)findViewById(R.id.description_txt);    ADB = DBAdpter.getAdapterInstance(SecondActivity.this);
    adb.createdatabase();
    DB = adb.openDataBase();    CR = db.rawQuery(从动物园独特的类型,新的String [] {});    如果(cr.getCount()大于0){
        cr.moveToFirst();
        的for(int i = 0; I< cr.getCount();我++){
            字符串类型= cr.getString(0);
            cr.moveToNext();
            type_list.add(类型);
        }
        db.close();
        ArrayAdapter<串GT; type_add =新ArrayAdapter<串GT;(
                SecondActivity.this,R.layout.spinnerlayout,TYPE_LIST);
        type_spn.setAdapter(type_add);    }    type_spn.setOnItemSelectedListener(新OnItemSelectedListener(){        公共无效onItemSelected(适配器视图<>为arg0,ARG1查看,
                INT ARG2,长ARG3){
            animal_list.clear();
            字符串TYPE_NAME = arg0.getItemAtPosition(ARG2)的ToString();
            DB = adb.openDataBase();
            CR = db.rawQuery(选择从动物那里动物园型像'
                    + TYPE_NAME +%',新的String [] {});            如果(cr.getCount()大于0){
                cr.moveToFirst();
                的for(int i = 0; I< cr.getCount();我++){
                    字符串类型= cr.getString(0);
                    cr.moveToNext();
                    animal_list.add(类型);
                }
            }
            db.close();
            ArrayAdapter<串GT; type_add =新ArrayAdapter<串GT;(
                    SecondActivity.this,R.layout.spinnerlayout,
                    animal_list);
            animal_spn.setAdapter(type_add);        }        公共无效onNothingSelected(适配器视图<>为arg0){        }
    });    animal_spn.setOnItemSelectedListener(新OnItemSelectedListener(){
        字符串的栖息地;
        串饮食;
        字符串描述;        公共无效onItemSelected(适配器视图<>为arg0,ARG1查看,
                INT ARG2,长ARG3){
            字符串animal_name = arg0.getItemAtPosition(ARG2)的ToString();            DB = adb.openDataBase();
            CR = db.rawQuery(
                    选择的栖息地,饮食,详细描述从动物园其中type像'
                            + animal_name +%',新的String [] {});            如果(cr.getCount()大于0){
                Log.v(动画,测试+ cr.getCount());
                cr.moveToFirst();
                 栖息地= cr.getString(0);
                 饮食= cr.getString(1);
                 说明= cr.getString(2);
            }
            db.close();
            Log.v(动画,测试+:+栖+:+饮食+:+描述);
            habitat_txt.setText(栖息地);
            diet_txt.setText(饮食);
            discription_txt.setText(介绍);        }        公共无效onNothingSelected(适配器视图<>为arg0){        }
    });
}

和我收到的错误是这样的。

  03-28 18:08:09.356:ERROR /光标(4754):完成尚未停用或关闭的游标。数据库= /data/data/com.zoobuzz/databases/zoo_buzz.sqlite,表=空,查询=选择从动物园其中type像'鸟动物
03-28 18:08:09.356:ERROR /光标(4754):%​​
03-28 18:08:09.356:ERROR /光标(4754):android.database.sqlite.DatabaseObjectNotClosedException:应用程序没有关闭在这里打开游标或数据库对象
03-28 18:08:09.356:ERROR /光标(4754):在android.database.sqlite.SQLiteCursor<&初始化GT;(SQLiteCursor.java:210)。
03-28 18:08:09.356:ERROR /光标(4754):在android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
03-28 18:08:09.356:ERROR /光标(4754):在android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
03-28 18:08:09.356:ERROR /光标(4754):在android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1315)
03-28 18:08:09.356:ERROR /光标(4754):在com.zoobuzz.SecondActivity $ 1.onItemSelected(SecondActivity.java:65)
03-28 18:08:09.356:ERROR /光标(4754):在android.widget.AdapterView.fireOnSelected(AdapterView.java:864)
03-28 18:08:09.356:ERROR /光标(4754):在android.widget.AdapterView.access $ 200(AdapterView.java:42)
03-28 18:08:09.356:ERROR /光标(4754):在android.widget.AdapterView $ SelectionNotifier.run(AdapterView.java:830)
03-28 18:08:09.356:ERROR /光标(4754):在android.os.Handler.handleCallback(Handler.java:587)
03-28 18:08:09.356:ERROR /光标(4754):在android.os.Handler.dispatchMessage(Handler.java:92)
03-28 18:08:09.356:ERROR /光标(4754):在android.os.Looper.loop(Looper.java:123)
03-28 18:08:09.356:ERROR /光标(4754):在android.app.ActivityThread.main(ActivityThread.java:4627)
03-28 18:08:09.356:ERROR /光标(4754):在java.lang.reflect.Method.invokeNative(本机方法)
03-28 18:08:09.356:ERROR /光标(4754):在java.lang.reflect.Method.invoke(Method.java:521)
03-28 18:08:09.356:ERROR /光标(4754):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
03-28 18:08:09.356:ERROR /光标(4754):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-28 18:08:09.356:ERROR /光标(4754):在dalvik.system.NativeStart.main(本机方法)


解决方案

不要打开和关闭数据库经常 DB = adb.openDataBase(); ,而不是关闭数据库关闭光标 cursor.close();

步骤:

数据库:启动活动打开数据库,并直到活动被关闭时它仍将保持打开状态。 (中的onDestroy()推荐)

光标:当光标的工作获得超过关闭它。

I am accessing data from sqlite data base in my following code.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.profile);
    type_spn = (Spinner) findViewById(R.id.type_spn);
    animal_spn = (Spinner) findViewById(R.id.animal_spn);
    habitat_txt=(TextView)findViewById(R.id.life_txt);
    diet_txt=(TextView)findViewById(R.id.habit_txt);
    discription_txt=(TextView)findViewById(R.id.description_txt);

    adb = DBAdpter.getAdapterInstance(SecondActivity.this);
    adb.createdatabase();
    db = adb.openDataBase();

    cr = db.rawQuery("select distinct type from zoo", new String[] {});

    if (cr.getCount() > 0) {
        cr.moveToFirst();
        for (int i = 0; i < cr.getCount(); i++) {
            String type = cr.getString(0);
            cr.moveToNext();
            type_list.add(type);
        }
        db.close();
        ArrayAdapter<String> type_add = new ArrayAdapter<String>(
                SecondActivity.this, R.layout.spinnerlayout, type_list);
        type_spn.setAdapter(type_add);

    }

    type_spn.setOnItemSelectedListener(new OnItemSelectedListener() {

        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            animal_list.clear();
            String type_name = arg0.getItemAtPosition(arg2).toString();
            db = adb.openDataBase();
            cr = db.rawQuery("select animal from zoo where type like '"
                    + type_name + "%'", new String[] {});

            if (cr.getCount() > 0) {
                cr.moveToFirst();
                for (int i = 0; i < cr.getCount(); i++) {
                    String type = cr.getString(0);
                    cr.moveToNext();
                    animal_list.add(type);
                }
            }
            db.close();
            ArrayAdapter<String> type_add = new ArrayAdapter<String>(
                    SecondActivity.this, R.layout.spinnerlayout,
                    animal_list);
            animal_spn.setAdapter(type_add);

        }

        public void onNothingSelected(AdapterView<?> arg0) {

        }
    });

    animal_spn.setOnItemSelectedListener(new OnItemSelectedListener() {
        String habitat;
        String diet;
        String description;

        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            String animal_name = arg0.getItemAtPosition(arg2).toString();

            db = adb.openDataBase();
            cr = db.rawQuery(
                    "select habitat,diet,discription from zoo where type like '"
                            + animal_name + "%'", new String[] {});

            if (cr.getCount() > 0) {
                Log.v("anim","Test"+cr.getCount());
                cr.moveToFirst();
                 habitat =cr.getString(0);
                 diet =cr.getString(1);
                 description =cr.getString(2);
            }
            db.close();
            Log.v("anim","Test"+" : "+habitat+" : "+diet+" : " + description);
            habitat_txt.setText(habitat);
            diet_txt.setText(diet);
            discription_txt.setText(description);

        }

        public void onNothingSelected(AdapterView<?> arg0) {

        }
    });
}

and I am getting error like this.

03-28 18:08:09.356: ERROR/Cursor(4754): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.zoobuzz/databases/zoo_buzz.sqlite, table = null, query = select animal from zoo where type like 'Bird
03-28 18:08:09.356: ERROR/Cursor(4754): %'
03-28 18:08:09.356: ERROR/Cursor(4754): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
03-28 18:08:09.356: ERROR/Cursor(4754):     at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210)
03-28 18:08:09.356: ERROR/Cursor(4754):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
03-28 18:08:09.356: ERROR/Cursor(4754):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
03-28 18:08:09.356: ERROR/Cursor(4754):     at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1315)
03-28 18:08:09.356: ERROR/Cursor(4754):     at com.zoobuzz.SecondActivity$1.onItemSelected(SecondActivity.java:65)
03-28 18:08:09.356: ERROR/Cursor(4754):     at android.widget.AdapterView.fireOnSelected(AdapterView.java:864)
03-28 18:08:09.356: ERROR/Cursor(4754):     at android.widget.AdapterView.access$200(AdapterView.java:42)
03-28 18:08:09.356: ERROR/Cursor(4754):     at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:830)
03-28 18:08:09.356: ERROR/Cursor(4754):     at android.os.Handler.handleCallback(Handler.java:587)
03-28 18:08:09.356: ERROR/Cursor(4754):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-28 18:08:09.356: ERROR/Cursor(4754):     at android.os.Looper.loop(Looper.java:123)
03-28 18:08:09.356: ERROR/Cursor(4754):     at android.app.ActivityThread.main(ActivityThread.java:4627)
03-28 18:08:09.356: ERROR/Cursor(4754):     at java.lang.reflect.Method.invokeNative(Native Method)
03-28 18:08:09.356: ERROR/Cursor(4754):     at java.lang.reflect.Method.invoke(Method.java:521)
03-28 18:08:09.356: ERROR/Cursor(4754):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-28 18:08:09.356: ERROR/Cursor(4754):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-28 18:08:09.356: ERROR/Cursor(4754):     at dalvik.system.NativeStart.main(Native Method)

解决方案

dont open and close your database frequently db = adb.openDataBase(); instead closing database close your cursor cursor.close();

Step:

Database : Launcher Activity opens Database and it will remains open until the Activity gets closed. (in onDestroy() recommended)

Cursor: When the work of cursor gets over close it.

这篇关于定稿尚未停用或关闭的游标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆