关闭后尝试访问游标

时间:2013-08-07 15:24:27

标签: android

我正在使用以下代码删除图片。它第一次工作,但是当我尝试捕获图像并将其删除时           我得到了StaleDataException

08-07 14:57:24.156: E/AndroidRuntime(789): java.lang.RuntimeException: Unable to               
       resume activity {com.example.cap_im/com.example.cap_im.MainActivity}:  
       android.database.StaleDataException: Attempted to access a cursor after it has been closed.

public void deleteImageFromGallery(String captureimageid) {
    Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

    getContentResolver().delete(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            BaseColumns._ID + "=?", new String[] { captureimageid });

    String[] projection = { MediaStore.Images.ImageColumns.SIZE,
            MediaStore.Images.ImageColumns.DISPLAY_NAME,
            MediaStore.Images.ImageColumns.DATA, BaseColumns._ID, };

    Log.i("InfoLog", "on activityresult Uri u " + u.toString());

    try {
        if (u != null) {
            cursor = managedQuery(u, projection, null, null, null);
        }
        if ((cursor != null) && (cursor.moveToLast())) {

            int i = getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    BaseColumns._ID + "=" + cursor.getString(3),   null);
            Log.v(TAG, "Number of column deleted : " + i);
        }
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

5 个答案:

答案 0 :(得分:36)

功能,managedQuery()已弃用。

请使用getContentResolver().query()

参数相同。

答案 1 :(得分:7)

finally块中,关闭光标,但不要将其设置为null。因此,下次调用方法时,cursor.getString(3)会失败,因为游标已关闭。

解决方法:在cursor区块中将null设置为finally

正确解决方案:不要为cursor使用实例变量,而是在方法中使用局部变量。

答案 2 :(得分:2)

我有类似的问题。在我的情况下,代码很好,但我使用了已弃用的方法' managedQuery'而不是汤姆林建议的那个

public String getPath(Uri uri) {
    if (uri == null) {
        return null;
    }
    String result = null;

    String[] projection = {MediaStore.Images.Media.DATA};
    Cursor cursor = getContentResolver().query(uri, projection, null, null, null);

    // deprecated:
    // Cursor cursor = managedQuery(uri, projection, null, null, null);

    if (cursor != null) {

        int columnIndex = 0;
        try {
            columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            result = cursor.getString(columnIndex);
        } catch (IllegalArgumentException e) {
            Log.e("While getting path for file", e);
        } finally {
            try {
                if (!cursor.isClosed()) {
                    cursor.close();
                }
                cursor = null;
            } catch (Exception e) {
                Log.e("While closing cursor", e);
            }
        }
    }
    return result;
}

如果我使用弃用的方法,如果省略finally,它仍然有效。在doc中也明确声明在使用此方法时不应关闭光标

答案 3 :(得分:1)

绝对使用此代码,使用getContentResolver()。query()而不是managedQuery()。因为不推荐使用managedQuery()。它为我工作完美。谢谢你

答案 4 :(得分:0)

也不要使用managedQuery()它已被弃用。

删除它:

protected SQLiteDatabase database;

并将其设为本地

基本上2个方法同时执行,一个名为database.close()的方法和第二个方法仍在访问数据,因此Exception

使用它:

   public class db {

    DataBaseHelper dbHelper;
    Context mContext;


    public db(Context context) {
        this.mContext = context;
    }

    public db open() throws SQLException {
        dbHelper = new DataBaseHelper(mContext);
        return this;
    }


    public void close() {
        dbHelper.close();
    }

    public void insertdb( int id,String ph_num, String call_type, String calldate, String call_duration, String upload_status) {
        SQLiteDatabase database = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(DataBaseHelper.id,id);
        values.put(DataBaseHelper.phone_number, ph_num);
        values.put(DataBaseHelper.call_type, call_type);
        values.put(DataBaseHelper.call_date, calldate);
        values.put(DataBaseHelper.call_duration, call_duration);
        values.put(DataBaseHelper.upload_status, upload_status);
        database.insert(DataBaseHelper.table_name, null, values);
        database.close();
        // Log.d("Database helper", "values inserted");
    }


    public ArrayList<HashMap<String, String>> getAllUsers() {
        ArrayList<HashMap<String, String>> wordList;
        wordList = new ArrayList<HashMap<String, String>>();
        String selectQuery = "SELECT  * FROM call_logtable";
        SQLiteDatabase database = dbHelper.getWritableDatabase();
        Cursor cursor = database.rawQuery(selectQuery, null);
        if (cursor.moveToFirst()) {
            do {
                HashMap<String, String> map = new HashMap<String, String>();
                map.put("id", cursor.getString(0));
                map.put("phone_number", cursor.getString(1));
                map.put("call_type", cursor.getString(2));
                map.put("call_date", cursor.getString(3));
                map.put("call_duration", cursor.getString(4));
                wordList.add(map);
            } while (cursor.moveToNext());
        }
        cursor.close(); // just added
        database.close();
        return wordList;
    }

    /**
     * Compose JSON out of SQLite records
     * @return
     */
    public String composeJSONfromSQLite(){
        ArrayList<HashMap<String, String>> wordList;
        wordList = new ArrayList<HashMap<String, String>>();
        String selectQuery = "SELECT  * FROM call_logtable where upload_status = '"+"no"+"'";
        SQLiteDatabase database = dbHelper.getWritableDatabase();
        Cursor cursor = database.rawQuery(selectQuery, null);
        if (cursor.moveToFirst()) {
            do {
                HashMap<String, String> map = new HashMap<String, String>();
                map.put("id", cursor.getString(0));
                map.put("phone_number", cursor.getString(1));
                map.put("call_type", cursor.getString(2));
                map.put("call_date", cursor.getString(3));
                map.put("call_duration", cursor.getString(4));
                wordList.add(map);
            } while (cursor.moveToNext());
        }
        cursor.close(); // just added
        database.close();
        Gson gson = new GsonBuilder().create();
        //Use GSON to serialize Array List to JSON
        return gson.toJson(wordList);
    }


    public int dbSyncCount(){
        int count = 0;
        String selectQuery = "SELECT  * FROM call_logtable where upload_status = '"+"no"+"'";
        SQLiteDatabase database = dbHelper.getWritableDatabase();
        Cursor cursor = database.rawQuery(selectQuery, null);
        count = cursor.getCount();
        cursor.close(); // just added
        database.close();
        return count;
    }


    public void updateSyncStatus(String id, String status){
        SQLiteDatabase database = dbHelper.getWritableDatabase();
        String updateQuery = "Update call_logtable set upload_status = '"+ status +"' where id="+"'"+ id +"'";
        Log.d("query", updateQuery);
        database.execSQL(updateQuery);
        database.close();
    }

    public Cursor getinformation()
    {
        SQLiteDatabase database = dbHelper.getReadableDatabase();
        String[] columns={DataBaseHelper.phone_number,DataBaseHelper.call_type,DataBaseHelper.call_date,DataBaseHelper.call_duration,DataBaseHelper.upload_status};
        return database.query(DataBaseHelper.table_name,columns,null,null,null,null,null);
    }

    public void delete()
    {
        SQLiteDatabase database = dbHelper.getWritableDatabase();
        // String[] columns={DataBaseHelper.phone_number,DataBaseHelper.call_type,DataBaseHelper.call_date,DataBaseHelper.call_duration};
        database.delete(DataBaseHelper.table_name, null, null);
    }


    StringBuffer readSpecificfrom_db(String type)
    {
        String ph_number=null;
        String call_type=null;
        String call_date=null;
        String call_duration=null;
        String upload_status=null;
        StringBuffer sb = new StringBuffer();
        //sb.append("Call Log :");
        Cursor cursor_object=getinformation();
        cursor_object.moveToFirst();
        do {
            if((cursor_object.getString(1)).equals(type)) {
                ph_number = cursor_object.getString(0);
                call_type = cursor_object.getString(1);
                call_date = cursor_object.getString(2);
                call_duration = cursor_object.getString(3);
                if(type=="Missed") {
                    sb.append("\nPhone Number:--- " + ph_number +
                                    " \nCall Type:--- " + call_type +
                                    " \nCall Date:--- " + call_date
                            //   + " \nCall duration in sec :--- " + call_duration
                    );
                    sb.append("\n----------------------------------");
                }
                else
                {
                    sb.append("\nPhone Number:--- " + ph_number +
                            " \nCall Type:--- " + call_type +
                            " \nCall Date:--- " + call_date
                            + " \nCall duration in sec :--- " + call_duration);
                    sb.append("\n----------------------------------");
                }
            }
        }while(cursor_object.moveToNext());
        cursor_object.close(); // just added
        return sb;

    }

    StringBuffer readfrom_db()
    {
        String ph_number=null;
        String call_type=null;
        String call_date=null;
        String call_duration=null;
        String upload_status;
        //  int id=0;
        StringBuffer sb = new StringBuffer();
        // sb.append("Call Log :");
        Cursor cursor_object=getinformation();
        cursor_object.moveToFirst();
        do {
            ph_number=cursor_object.getString(0);
            call_type=cursor_object.getString(1);
            call_date=cursor_object.getString(2);
            call_duration=cursor_object.getString(3);
            sb.append("\nPhone Number:--- " + ph_number +
                    " \nCall Type:--- " + call_type +
                    " \nCall Date:--- " + call_date
                    + " \nCall duration in sec :--- " + call_duration);
            sb.append("\n----------------------------------");

        } while(cursor_object.moveToNext());
        cursor_object.close(); // just added
        return sb;
    }
}