Przestarzały problem ManagedQuery ()


109

Mam taką metodę:

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);
}

Niestety kompilator pokazuje mi problem na:

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

Ponieważ managedQuery()jest przestarzały.

Jak mogę przepisać tę metodę bez użycia managedQuery()?

Odpowiedzi:


255

Możesz go zamienić na context.getContentResolver().queryi LoaderManager(będziesz musiał użyć pakietu zgodności, aby obsługiwać urządzenia przed wersją API 11).

Wygląda jednak na to, że używasz zapytania tylko raz: prawdopodobnie nawet tego nie potrzebujesz. Może to zadziała?

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 ... no i tak nie działa ... jeśli uri zaczyna się od "file: //" nie zwraca właściwej ścieżki
AndreaF

file://URI generalnie nie można rozwiązać za pomocą contentUri: jeśli masz URI pliku, JUŻ masz prawdziwą ścieżkę.
Femi

Czy mógłbyś podać mi więcej szczegółów? Mam „Uri”, moim problemem jest uzyskanie prawdziwej ścieżki bezwzględnej bez atrybutów file: //, / content: / i innych.
AndreaF

1
W przypadku identyfikatora URI treści będziesz potrzebować programu rozpoznawania nazw, aby uzyskać identyfikator URI pliku, a gdy już masz identyfikator URI pliku, możesz po prostu to zrobić new File(new URI(uri.getPath()));.
Femi

1
Ach, jasne: czy new File(new URI(uri.getPath())).getAbsolutePath();to, czego potrzebujesz, nie?
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

musisz zainicjalizować kursor, ponieważ będzie on zamknięty przed rozpoczęciem metody lub w innym miejscu

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

8
Inicjalizacja kursora pomaga w przypadku przestarzałej metody, naprawdę?
IlyaEremin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.