IllegalStateException异常:尝试重新打开一个已关闭的对象。 SimpleCursorAdapter问题 [英] IllegalStateException: attempt to re-open an already-closed object. SimpleCursorAdapter problems

查看:310
本文介绍了IllegalStateException异常:尝试重新打开一个已关闭的对象。 SimpleCursorAdapter问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是全新到Android编程。我可以看到这个问题之前已经提出了许多次。但是,我仍然无法看到的问题是什么。我试图从SQLite数据库连接数据到ListView。在ListActivity我的onCreate如下所示:

 公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_init_key);
    getActionBar()setDisplayHomeAsUpEnabled(真)。

    DBHandler DB =新DBHandler(本);

    光标光标= db.getKeyPointCursor(1,山楂);
    //所需列受约束
    的String []列=新的String [] {问题1,answer1};
    //哪个数据将被结合到定义的XML次
    INT []到=新INT [] {R.id.question,R.id.answer};

    SimpleCursorAdapter mAdapter =新SimpleCursorAdapter(此,R.layout.key_list_entry,光标,列,于,0);

    cursor.close();
    this.setListAdapter(mAdapter);

}
 

这引起了以下异常,我希望有人能帮助我。

  09-10 21:52:01.505:W / dalvikvm(10976):主题ID = 1:螺纹退出与未捕获的异常(组= 0x40c8e1f8)
09-10 21:52:01.510:E / AndroidRuntime(10976):致命异常:主要
09-10 21:52:01.510:E / AndroidRuntime(10976):java.lang.RuntimeException的:无法启动的活动ComponentInfo {jem.danskflora / jem.danskflora.InitKeyActivity}:java.lang.IllegalStateException:尝试重新打开一个已经关闭的对象:android.database.sqlite.SQLiteQuery(?MSQL = SELECT * FROM山楂WHERE _id =)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.app.ActivityThread.access $ 600(ActivityThread.java:128)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1161)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.os.Handler.dispatchMessage(Handler.java:99)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.os.Looper.loop(Looper.java:137)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.app.ActivityThread.main(ActivityThread.java:4514)
09-10 21:52:01.510:E / AndroidRuntime(10976):在java.lang.reflect.Method.invokeNative(本机方法)
09-10 21:52:01.510:E / AndroidRuntime(10976):在java.lang.reflect.Method.invoke(Method.java:511)
09-10 21:52:01.510:E / AndroidRuntime(10976):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:993)
09-10 21:52:01.510:E / AndroidRuntime(10976):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
09-10 21:52:01.510:E / AndroidRuntime(10976):在dalvik.system.NativeStart.main(本机方法)
09-10 21:52:01.510:E / AndroidRuntime(10976):java.lang.IllegalStateException:产生的原因试图重新打开一个已关闭的对象:android.database.sqlite.SQLiteQuery(MSQL = SELECT * FROM山楂WHERE _id =?)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:33)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:82)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:164)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:156)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.widget.CursorAdapter.getCount(CursorAdapter.java:196)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.widget.ListView.setAdapter(ListView.java:467)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.app.ListActivity.setListAdapter(ListActivity.java:265)
09-10 21:52:01.510:E / AndroidRuntime(10976):在jem.danskflora.InitKeyActivity.onCreate(InitKeyActivity.java:30)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.app.Activity.performCreate(Activity.java:4562)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
09-10 21:52:01.510:E / AndroidRuntime(10976):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
09-10 21:52:01.510:E / AndroidRuntime(10976):11 ...更多
 

解决方案

不要关闭您的光标定位到的onCreate 方法。它是由适配器引用,但它不被使用<!/ P>

尝试使用LoaderManager / CursorLoader。这是处理游标新的方式:<一href="http://stackoverflow.com/questions/8899497/how-to-transition-from-simplecursoradapter-to-loadermanager-cursorloader">How从SimpleCursorAdapter过渡到LoaderManager / CursorLoader?

下面是我的项目之一(我没有测试code)的一个例子:

 公共类AdditionalActivitiesListFragment扩展ListActivity实现LoaderManager.LoaderCallbacks&LT;光标&gt;中OnItemClickListener,OnClickListener
{
    私人SimpleCursorAdapter适配器;


    公共无效的onCreate(包savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        的String []列=新的String [] {你,DB,列};
        INT []到=新INT [] {R.id.your,R.id.fields,R.id.toMapWith};

        getLoaderManager()initLoader(0×02,空,这一点)。

        适配器=新SimpleCursorAdapter(activity.getApplicationContext(),R.layout.row_layout,空,列于SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        setListAdapter(适配器);
    }

    公共装载机&LT;光标&GT; onCreateLoader(INT为arg0,捆绑ARG1)
    {
        返回新SimpleCursorLoader(本){
            @覆盖
            公共光标loadInBackground(){
                光标C = //您的光标

                返回℃;
            }
        };
    }

    公共无效onLoadFinished(装载机&LT;光标&GT;为arg0,光标光标)
    {
        adapter.swapCursor(光标);
    }

    公共无效onLoaderReset(装载机&LT;光标&GT;为arg0)
    {
        adapter.swapCursor(空);
    }
}
 

在SimpleCursorLoader来源: https://gist.github.com/1217628 (通过<一个HREF =htt​​p://stackoverflow.com/a/7422343/615882> http://stackoverflow.com/a/7422343/615882 )

I'm totally new to android programming. I can see that this problem has been raised many times before. However, I am still not able to see what the problem is. I'm trying to connect the data from an SQLite database to a listview. In the ListActivity my onCreate looks like the following:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_init_key);
    getActionBar().setDisplayHomeAsUpEnabled(true); 

    DBHandler db = new DBHandler(this);

    Cursor cursor = db.getKeyPointCursor(1, "Crataegus");
    // the desired columns to be bound
    String[] columns = new String[] { "question1","answer1" };
    // the XML defined views which the data will be bound to
    int[] to = new int[] { R.id.question, R.id.answer };

    SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.key_list_entry, cursor, columns, to, 0);

    cursor.close();
    this.setListAdapter(mAdapter);

}

It raises the following exception, which I hope somebody can help me with.

09-10 21:52:01.505: W/dalvikvm(10976): threadid=1: thread exiting with uncaught exception (group=0x40c8e1f8)
09-10 21:52:01.510: E/AndroidRuntime(10976): FATAL EXCEPTION: main
09-10 21:52:01.510: E/AndroidRuntime(10976): java.lang.RuntimeException: Unable to start activity ComponentInfo{jem.danskflora/jem.danskflora.InitKeyActivity}: java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT * FROM Crataegus WHERE _id=?) 
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.app.ActivityThread.access$600(ActivityThread.java:128)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.os.Looper.loop(Looper.java:137)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.app.ActivityThread.main(ActivityThread.java:4514)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at java.lang.reflect.Method.invokeNative(Native Method)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at java.lang.reflect.Method.invoke(Method.java:511)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at dalvik.system.NativeStart.main(Native Method)
09-10 21:52:01.510: E/AndroidRuntime(10976): Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT * FROM Crataegus WHERE _id=?) 
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:33)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:82)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:164)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:156)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.widget.CursorAdapter.getCount(CursorAdapter.java:196)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.widget.ListView.setAdapter(ListView.java:467)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.app.ListActivity.setListAdapter(ListActivity.java:265)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at jem.danskflora.InitKeyActivity.onCreate(InitKeyActivity.java:30)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.app.Activity.performCreate(Activity.java:4562)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
09-10 21:52:01.510: E/AndroidRuntime(10976):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
09-10 21:52:01.510: E/AndroidRuntime(10976):    ... 11 more

解决方案

Do not close your cursor in your onCreate method. It is referenced by your adapter, but it is not already used !

Try using a LoaderManager / CursorLoader. It is the new way for handling cursors : How to transition from SimpleCursorAdapter to LoaderManager/CursorLoader?

Here is an example from one of my projects (I did not test this code):

public class AdditionalActivitiesListFragment extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, OnClickListener
{
    private SimpleCursorAdapter adapter;


    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        String[] columns = new String[] { "your", "db", "columns" };
        int[] to = new int[] { R.id.your, R.id.fields, R.id.toMapWith };

        getLoaderManager().initLoader(0x02, null, this);

        adapter = new SimpleCursorAdapter(activity.getApplicationContext(), R.layout.row_layout, null, columns, to, SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        setListAdapter(adapter);
    }

    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1)
    {
        return new SimpleCursorLoader(this) {
            @Override
            public Cursor loadInBackground() {
                Cursor c = // Your cursor

                return c;
            }
        };
    }

    public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor)
    {
        adapter.swapCursor(cursor);
    }

    public void onLoaderReset(Loader<Cursor> arg0)
    {
        adapter.swapCursor(null);
    }
}

Source of the SimpleCursorLoader : https://gist.github.com/1217628 (via http://stackoverflow.com/a/7422343/615882 )

这篇关于IllegalStateException异常:尝试重新打开一个已关闭的对象。 SimpleCursorAdapter问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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