5

次のコードを使用して画像を削除しています。初めて機能しますが、画像をキャプチャして削除しようとすると、次のようになります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();
        }
    }
}
4

5 に答える 5

42

関数managedQuery()は非推奨です。

をご利用くださいgetContentResolver().query()

パラメータは同じです。

于 2014-06-17T07:46:10.553 に答える
8

あなたのfinallyブロックでは、カーソルを閉じますが、に設定しませんnull。したがって、次にメソッドが呼び出されると、cursor.getString(3)カーソルが閉じられているため、失敗します。

回避策: ブロック内で に設定cursornullますfinally

正しい解決策: にインスタンス変数を使用しないcursorでください。代わりにメソッドでローカル変数を使用してください。

于 2013-08-07T15:35:57.060 に答える
1

このコードは確実に機能します。managedQuery() の代わりに getContentResolver().query() を使用してください。managedQuery() は推奨されていないためです。私にとっては完璧です。

于 2016-06-30T06:58:03.497 に答える
0

また、使用しないでくださいmanagedQuery()。廃止されました。

これを削除します:

protected SQLiteDatabase database;

そしてそれをローカルにします

基本的に 2 つのメソッドが同時に実行され、1 つのメソッドが呼び出されdatabase.close()、2 番目のメソッドがまだデータにアクセスしているため、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;
    }
}
于 2016-05-06T09:25:02.790 に答える