使用AsyncTask Thread在android中执行sqlite查询

时间:2014-05-15 08:23:24

标签: android android-asynctask android-sqlite

我在做什么 ::

  • 我试图在AsyncTask中运行一个sqlite查询(因为它执行 单独的线程中的交易。)。
  • 我收到了显示的日志错误
  • 当我调试时,我发现生成了错误 getDataFromSqlite();代码

问题 ::

  • 我出错的地方
  • 我如何纠正自己

代码段 ::

@Override
    public void onStart() {
        // TODO Auto-generated method stub
        super.onStart();

        txtBufTime.setText(sendBufTime);
        txtBufDistance.setText(sendDistance);
        txtOnlinePrice.setText(sendOnlinePrice);
        txtReservePrice.setText(sendReservePrice);
        txtBuffetDesc.setText(sendDescription);
        txtBufType.setText(sendBufType);
        setRating(sendRating);
        new LongOperation().execute();
    }


    private class LongOperation extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            getDataFromSqlite();
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
           Toast.makeText(getActivity(), "DOne", Toast.LENGTH_SHORT).show();
        }

        @Override
        protected void onPreExecute() {}

        @Override
        protected void onProgressUpdate(Void... values) {}
    }



        public void getDataFromSqlite() {
            ///
            Cursor cursor = null;
            DatabaseHandler mHelper = new DatabaseHandler(getActivity().getApplicationContext());
            SQLiteDatabase db = mHelper.getWritableDatabase();
            String queryString="select menu_type_id , cuisine_type_name , item_name" +
                               " from buffets " +
                               "where buff_off_id = " + sendBuffetId;
            Log.d("queryString", queryString.toString());


            try {
                cursor = db.rawQuery(queryString, null);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                cursor.close();
            }

        }

日志 ::

    **05-15 13:41:17.547: E/AndroidRuntime(2743): FATAL EXCEPTION: AsyncTask #5
05-15 13:41:17.547: E/AndroidRuntime(2743): java.lang.RuntimeException: An error occured while executing doInBackground()
05-15 13:41:17.547: E/AndroidRuntime(2743):     at android.os.AsyncTask$3.done(AsyncTask.java:278)
05-15 13:41:17.547: E/AndroidRuntime(2743):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
05-15 13:41:17.547: E/AndroidRuntime(2743):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
05-15 13:41:17.547: E/AndroidRuntime(2743):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
05-15 13:41:17.547: E/AndroidRuntime(2743):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-15 13:41:17.547: E/AndroidRuntime(2743):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
05-15 13:41:17.547: E/AndroidRuntime(2743):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-15 13:41:17.547: E/AndroidRuntime(2743):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
05-15 13:41:17.547: E/AndroidRuntime(2743):     at java.lang.Thread.run(Thread.java:856)
05-15 13:41:17.547: E/AndroidRuntime(2743): Caused by: java.lang.NullPointerException
05-15 13:41:17.547: E/AndroidRuntime(2743):     at com.findmybuffet.fragments.FragBuffetContents.getDataFromSqlite(FragBuffetContents.java:154)
05-15 13:41:17.547: E/AndroidRuntime(2743):     at com.findmybuffet.fragments.FragBuffetContents$LongOperation.doInBackground(FragBuffetContents.java:120)
05-15 13:41:17.547: E/AndroidRuntime(2743):     at com.findmybuffet.fragments.FragBuffetContents$LongOperation.doInBackground(FragBuffetContents.java:1)
05-15 13:41:17.547: E/AndroidRuntime(2743):     at android.os.AsyncTask$2.call(AsyncTask.java:264)
05-15 13:41:17.547: E/AndroidRuntime(2743):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)**

1 个答案:

答案 0 :(得分:0)

来自评论:

  

154行是cursor.close();

Cursor cursor = null;

//...

try {
    cursor = db.rawQuery(queryString, null);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    cursor.close();
}

如果发生异常,cursornull并尝试在其上调用方法会导致NPE。移动cursor.close()块中的try,或用if (cursor != null)条件包围它。

如果存在SQL语法问题,为什么rawQuery()抛出。要获得相关帮助,请发布您在catch块中登录的例外的例外。