IllegalStateException:尝试重新查询已经关闭的游标

时间:2014-01-09 13:54:25

标签: android database listview cursor restart

在我的应用中,我收到一个我无法理解的错误:

当我将带有listview的活动传递给详细信息然后我回到应用程序崩溃时给出了这个错误:

IllegalStateException:尝试重新查询已关闭的游标

我看到很多关于这个问题的问题,我读了它们,我尝试了各种方法,但没有任何改变。

实际上,在我的活动中,我将打开一个调用webservice的AsyncTask 这个web服务的结果我读了它,我插入了appview的内部数据库中listview的适配器。

当我按下其中一个按钮来更改列表元素的输出时,请对数据库执行查询并在列表视图中重新创建微调器。

这是我与数据库交互并立即打开它并在我完成后立即关闭之前问他的两个案例。

为什么我不明白为什么返回其他活动给我那个错误,因为没有动作来处理数据库它会nell'onResume nell'onRestart。

我附在我的活动下面,有人可以帮助我吗?

public class SinistriInCorso extends SherlockActivity{

    private static String...  //All my Shared preferences

    ProgressDialog dialog;

    ListView listSX;
    TextView nothingFound;

    String[] idSX = new String[1];
    String[] dataSX = new String[1];
    String[] luogoSX = new String[1];

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.sinistri_incorso);

        //ActionBar - Abilitazione del pulsante Home per tornare indietro
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        //Dichiaro la ListView
        listSX = (ListView) findViewById(R.id.sinistri_list);
        nothingFound = (TextView) findViewById(R.id.sinistri_norecordfound);

        //Controllo se c'è la CONNESSIONE
        Boolean connessione = false;
        connessione = Utilty.isConnected(getApplicationContext());

        if (connessione == true)
        {         
            new MyAsyncTask().execute(this);
        }
        //True CONNESSIONE          
        else
        {
            //AVVISO che OFFLINE non è possibile Visualizzare l'Activity
            new AlertDialog.Builder(SinistriInCorso.this)
            .setTitle("Attenzione")
            .setMessage( "Non è presente alcuna connessione e non si dispone di dati per la consultazione offline.\nL'applicazione tornerà alla schermata precedente.")
            .setNeutralButton("OK", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                //Torno alla Pagina Precedente
                                finish();
                                }
                        })
            .show();
        }//Else CONNESSIONE 

        //Click su una singola riga della ListView
        listSX.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                String idSinistro = ((TextView) view.findViewById(R.id.sinistri_id)).getText().toString();

                //Save the id in shared preferences that i have arledy declared.
                getSharedPreferences(PREFS_NAME2,MODE_PRIVATE)
                .edit()
                .putString(ID_SINISTRO, idSinistro)
                .putString(FROM_SX, "inCorso")
                .commit();

                //Avvio l'Activity Open
                Intent i = new Intent(getApplicationContext(), SinistriInCorsoDettaglio.class);
                startActivity(i);
            }
        });

        //Pulsanti
        final ImageView btnSei = (ImageView) findViewById(R.id.sinistri_SeiMesi);
        final ImageView btnAnno = (ImageView) findViewById(R.id.sinistri_Anno);
        final ImageView btnTutti = (ImageView) findViewById(R.id.sinistri_All);

        //Click su ULTIMI 6 MESI
        btnSei.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                btnSei.setEnabled(false);
                btnAnno.setEnabled(true);
                btnTutti.setEnabled(true);
                btnSei.setImageResource(R.drawable.ic_6mesi_blu);
                btnAnno.setImageResource(R.drawable.ic_anno_grigio);
                btnTutti.setImageResource(R.drawable.ic_tutti_grigio);
                new MyAsyncTaskSearchDB("seiMesi").execute(SinistriInCorso.this); 
            }
        });

        //Click su ULTIMO ANNO
        btnAnno.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                btnAnno.setEnabled(false);
                btnSei.setEnabled(true);
                btnTutti.setEnabled(true);
                btnAnno.setImageResource(R.drawable.ic_anno_blu);
                btnSei.setImageResource(R.drawable.ic_6mesi_grigio);
                btnTutti.setImageResource(R.drawable.ic_tutti_grigio);
                new MyAsyncTaskSearchDB("unAnno").execute(SinistriInCorso.this);    
            }
        });

        //Click su TUTTI
        btnTutti.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                btnTutti.setEnabled(false);
                btnSei.setEnabled(true);
                btnAnno.setEnabled(true);
                btnTutti.setImageResource(R.drawable.ic_tutti_blu);
                btnSei.setImageResource(R.drawable.ic_6mesi_grigio);
                btnAnno.setImageResource(R.drawable.ic_anno_grigio);
                new MyAsyncTaskSearchDB("tutti").execute(SinistriInCorso.this); 
            }
        });

    }//Chiusura onCreate

    //Istruzione per visualizzare il Menu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getSupportMenuInflater().inflate(R.menu.maintot, menu);
        return true;
    };

    //Menu - Redirect dei vari Elementi
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) 
        {
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    //Pressione del Back Button
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
            if ((keyCode == KeyEvent.KEYCODE_BACK)) 
            { 
                NavUtils.navigateUpFromSameTask(this);
            }
            return false;
    }


    //MyAsynTask
    private class MyAsyncTask extends AsyncTask<Context, Integer, String> {

        SoapObject result;

        @Override
        protected void onPreExecute() { 
            dialog = new ProgressDialog(SinistriInCorso.this);
            dialog.setMessage("Caricamento sinistri in corso...");
            dialog.setCanceledOnTouchOutside(false);
            dialog.show();
        }

        @Override
        protected String doInBackground(Context... params) {

            //Call the webservice                                   
            result = Utilty.callWebService(etc...)

            return "";
        }

        protected void onProgressUpdate(Integer... progress) {
          }

        protected void onPostExecute(String resultss) {

            if ((result != null) && (!(result.toString().equals("anyType{}"))))
            {               
                int tot = result.getPropertyCount();
                idSX = new String[tot];
                dataSX = new String[tot];
                luogoSX = new String[tot];

                DataBase db = new DataBase(getApplicationContext());
                db.open();
                db.dropTable(db.mDb, 1, 2, "sinistricorso");

                if (result != null)
                {
                    for (int i = 0; i < tot; i++) 
                    {                       
                        SoapObject multa = (SoapObject) result.getProperty(i);

                        idSX[i] = multa.getProperty("id").toString(); 
                        dataSX[i] = multa.getProperty("data").toString().substring(0, 10);
                        luogoSX[i] = multa.getProperty("luogo").toString();

                        String date = multa.getProperty("data").toString().substring(0, 10);
                        String giorno = date.substring(0, 2);
                        String mese = date.substring(3, 5);
                        String anno = date.substring(6, 10);
                        date = anno + "-" + mese + "-" + giorno;

                        db.insertSinistriInCorso(multa.getProperty("id").toString(), 
                                date,
                                multa.getProperty("luogo").toString());
                    }
                }

                db.close();

                AdapterSinistriArchiviati adapter = new AdapterSinistriArchiviati (SinistriInCorso.this, idSX, dataSX, luogoSX);
                listSX.setAdapter(adapter);
            }
            else
            {
                //AVVISO che OFFLINE non è possibile Visualizzare l'Activity
                new AlertDialog.Builder(SinistriInCorso.this)
                .setTitle("Attenzione")
                .setMessage( "Non sono presenti dati relativi ai sinistri.\nL'applicazione tornerà alla schermata precedente.")
                .setNeutralButton("OK", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    finish();
                                    }
                            })
                .show();
            }

            if (dialog.isShowing()) {
                dialog.dismiss();
            }
        }
    }//Chiusura MyAsynTask

    //MyAsynTaskSearchDB
    private class MyAsyncTaskSearchDB extends AsyncTask<Context, Integer, String> {

        String[] id;
        String[] data;
        String[] luogo;

        String fromString= "";

        int tot = 0;

        public MyAsyncTaskSearchDB(String from) {
            this.fromString = from;
        }

        @Override
        protected void onPreExecute() { 
            dialog = new ProgressDialog(SinistriInCorso.this);
            dialog.setMessage("Caricamento in corso...");
            dialog.setCanceledOnTouchOutside(false);
            dialog.show();
        }

        @SuppressWarnings("deprecation")
        @Override
        protected String doInBackground(Context... params) {
            String sql = "";

            if (fromString.equals("tutti"))
            {
                sql = "SELECT * FROM sinistricorso";
            }
            else
            {
                Calendar cal = Calendar.getInstance();
                //cal.set(2013, 03 , 10); //Per settarlo al 10-Aprile-2013

                int annoAttuale = cal.get(Calendar.YEAR);
                int meseAttuale = (cal.get(Calendar.MONTH) + 1);
                int giorAttuale = cal.get(Calendar.DAY_OF_MONTH);

                int annoQuery = 0;
                int meseQuery = 0;

                String meseAttS = "";
                String giorAttualeS = "";
                String meseQueryS = "";

                if (fromString.equals("seiMesi"))
                {
                    if (meseAttuale <= 5) 
                    {
                        int a =  6 - meseAttuale;
                        int b = (12 - a) + 1;
                        meseQuery = b;
                        annoQuery = annoAttuale - 1;
                    }
                    else
                    {
                        meseQuery = meseAttuale - 6;
                        annoQuery = annoAttuale;
                    }
                }
                else if (fromString.equals("unAnno"))  //Se si cercano i Record di un Anno fa, scalo semplicemente l'Anno di 1
                {
                    meseQuery = meseAttuale;
                    annoQuery = annoAttuale - 1;
                }

                if (meseAttuale <= 9) {
                    meseAttS = "0" + String.valueOf(meseAttuale);
                }
                else {
                    meseAttS = String.valueOf(meseAttuale);
                }

                if (giorAttuale <= 9) {
                    giorAttualeS = "0" + String.valueOf(giorAttuale);
                }
                else {
                    giorAttualeS = String.valueOf(giorAttuale);
                }

                if (meseQuery <= 9) {
                    meseQueryS = "0" + String.valueOf(meseQuery);
                }
                else {
                    meseQueryS = String.valueOf(meseQuery);
                }

                sql = "SELECT * FROM sinistricorso WHERE date(sx_data) " +
                        "BETWEEN date('" + annoQuery + "-" + meseQueryS + "-01') " +
                        "AND date('" + annoAttuale + "-" + meseAttS + "-" + giorAttualeS + "') " +
                        "ORDER BY sx_data DESC";

            }

            DataBase db = new DataBase(getApplicationContext());
            db.open();
            Cursor c = db.generalQuery(sql, null);
            startManagingCursor(c);

           tot = c.getCount();
           System.out.println("c.getCount(): " + c.getCount());

            if (c.getCount() > 0)
            {     
                id = new String[c.getCount()];
                data = new String[c.getCount()];
                luogo = new String[c.getCount()];
                int i = 0;
                if(c.moveToFirst())
                {
                    do 
                    {
                        id[i] = c.getString(1);
                        String dataFromDB = c.getString(2);
                        String dataPerListView = dataFromDB.substring(8, 10) +  "/" +
                                                 dataFromDB.substring(5, 7) +  "/" +
                                                 dataFromDB.substring(0, 4);
                        data[i] = dataPerListView;  
                        luogo[i] = c.getString(3);
                        i++;
                    } 
                    while (c.moveToNext());//iteriamo al prossimo elemento
                }  
            }
            db.close();

            return "";
        }

        protected void onProgressUpdate(Integer... progress) {
          }

        protected void onPostExecute(String resultss) {

            if (tot > 0)
            {
                AdapterSinistriArchiviati adapter = new AdapterSinistriArchiviati (SinistriInCorso.this, id, data, luogo);
                listSX.setAdapter(adapter);
                listSX.setVisibility(View.VISIBLE);
                nothingFound.setVisibility(View.GONE);
            }
            else
            {
                listSX.setVisibility(View.GONE);
                nothingFound.setVisibility(View.VISIBLE);
            }

            if (fromString.equals("tutti"))
            {
                listSX.setVisibility(View.VISIBLE);
                nothingFound.setVisibility(View.GONE);
            }

            if (dialog.isShowing()) {
                dialog.dismiss();
            }
        }
    }//Chiusura MyAsynTaskSearchDB

}

0 个答案:

没有答案