Android 在AsyncTask中从数据库获取数据有时会引发异常

Android 在AsyncTask中从数据库获取数据有时会引发异常,android,cursor,android-asynctask,Android,Cursor,Android Asynctask,我正在AsyncTask中从数据库检索数据。有时它可以完美地检索数据,但有时会引发以下异常 08-08 12:14:13.140: E/AndroidRuntime(3659): FATAL EXCEPTION: AsyncTask #5 08-08 12:14:13.140: E/AndroidRuntime(3659): java.lang.RuntimeException: An error occured while executing doInBackground() 08-08 12

我正在AsyncTask中从数据库检索数据。有时它可以完美地检索数据,但有时会引发以下异常

08-08 12:14:13.140: E/AndroidRuntime(3659): FATAL EXCEPTION: AsyncTask #5
08-08 12:14:13.140: E/AndroidRuntime(3659): java.lang.RuntimeException: An error occured while executing doInBackground()
08-08 12:14:13.140: E/AndroidRuntime(3659):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
08-08 12:14:13.140: E/AndroidRuntime(3659):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
08-08 12:14:13.140: E/AndroidRuntime(3659):     at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
08-08 12:14:13.140: E/AndroidRuntime(3659):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
08-08 12:14:13.140: E/AndroidRuntime(3659):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
08-08 12:14:13.140: E/AndroidRuntime(3659):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
08-08 12:14:13.140: E/AndroidRuntime(3659):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
08-08 12:14:13.140: E/AndroidRuntime(3659):     at java.lang.Thread.run(Thread.java:1019)
08-08 12:14:13.140: E/AndroidRuntime(3659): Caused by: android.database.sqlite.SQLiteMisuseException: library routine called out of sequence: , while compiling: SELECT _id, puzzle_number, path FROM puzzle_file_infors ORDER BY puzzle_number
08-08 12:14:13.140: E/AndroidRuntime(3659):     at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
08-08 12:14:13.140: E/AndroidRuntime(3659):     at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
08-08 12:14:13.140: E/AndroidRuntime(3659):     at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
08-08 12:14:13.140: E/AndroidRuntime(3659):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
08-08 12:14:13.140: E/AndroidRuntime(3659):     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
08-08 12:14:13.140: E/AndroidRuntime(3659):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42)
这是我的任务

public class BackgroundTask extends AsyncTask<String, Void, Cursor>{
    private final ProgressDialog m_cProgressDialog = new ProgressDialog(m_cContext);

     @Override
        protected void onPreExecute() {
            m_cProgressDialog.setMessage("Please Wait....");
            m_cProgressDialog.show();
        }

    @Override
    protected Cursor doInBackground(String... params) {
        m_cAdapter.open();
        m_cCursor = m_cAdapter.getAllPuzzles();
        startManagingCursor(m_cCursor);
        return m_cCursor;
    }

    @Override
    protected void onPostExecute(Cursor result) {
        startManagingCursor(result);
        if(result != null){
            m_cPuzzlesAdapter = new PuzzlesAdapter(PuzzlesActivity.this, result, m_cFromActivity);
            m_cGridView.setAdapter(m_cPuzzlesAdapter);
            m_cAdapter.close();
            if (m_cProgressDialog.isShowing()) {
                m_cProgressDialog.dismiss();
            }
        }
    }
}

我错在哪里?这是因为我没有在适当的位置关闭光标造成的吗?为此,我使用了startManagingCursor,但它仍然不起作用。请指导我。

我认为您在访问光标时应该使用锁,可能您正在尝试使用两种不同的线程访问光标。类似的问题,可能您会在这里找到解决方案。还有一个@nandeesh你能告诉我如何在访问游标时锁定吗?