Vấn đề ManagedQuery () không được chấp nhận


109

Tôi có phương pháp này:

public String getRealPathFromURI(Uri contentUri) {
    String[] proj = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(contentUri, proj, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}

Thật không may, trình biên dịch cho tôi thấy một vấn đề về:

Cursor cursor = managedQuery(contentUri, proj, null, null, null);

managedQuery()không được dùng nữa.

Làm thế nào tôi có thể viết lại phương pháp này mà không sử dụng managedQuery()?

Câu trả lời:


255

Bạn có thể thay thế nó bằng context.getContentResolver().queryLoaderManager(bạn sẽ cần sử dụng gói tương thích để hỗ trợ các thiết bị trước phiên bản API 11).

Tuy nhiên, có vẻ như bạn chỉ sử dụng truy vấn một lần: bạn có thể thậm chí không cần điều đó. Có lẽ điều này sẽ làm việc?

public String getRealPathFromURI(Uri contentUri) {
    String res = null;
    String[] proj = { MediaStore.Images.Media.DATA };
    Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
    if(cursor.moveToFirst()){;
       int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
       res = cursor.getString(column_index);
    }
    cursor.close();
    return res;
}

ops ... không không làm việc trong mọi trường hợp ... nếu bắt đầu uri với "file: //" không trả lại con đường đúng đắn
AndreaF

file://Các URI thường không thể được giải quyết bằng cách sử dụng contentUri: nếu bạn có URI tệp, bạn LUÔN có đường dẫn thực.
Femi

Bạn có thể cho tôi biết thêm chi tiết? Tôi có một "Uri", vấn đề của tôi là lấy đường dẫn tuyệt đối thực mà không có thuộc tính tệp: //, / content: / và các thuộc tính khác.
AndreaF

1
Đối với URI nội dung, bạn sẽ cần một trình phân giải để lấy URI tệp và sau khi có URI tệp, bạn có thể thực hiện new File(new URI(uri.getPath()));.
Femi

1
À, chắc chắn rồi: new File(new URI(uri.getPath())).getAbsolutePath();có phải thứ bạn cần không?
Femi

3
public void getBrowserHist(Context context) {
        Cursor mCur = context.getContentResolver().query(Browser.BOOKMARKS_URI,
                Browser.HISTORY_PROJECTION, null, null, null);
        mCur.moveToFirst();
        if (mCur != null && mCur.moveToFirst() && mCur.getCount() > 0) {
            while (mCur.isAfterLast() == false) {
                Log.e("hist_titleIdx",
                        mCur.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX));
                Log.e("hist_urlIdx",
                        mCur.getString(Browser.HISTORY_PROJECTION_URL_INDEX));
                mCur.moveToNext();
            }
        }
    }

-6

bạn cần khởi tạo con trỏ vì nó sẽ đóng trước khi bắt đầu phương thức hoặc một số nơi khác

cursor = null;
public void method(){
// do your stuff here 
cursor.close();
}

8
Khởi tạo con trỏ có giúp ích gì với phương pháp không dùng nữa không?
IlyaEremin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.