Android ContentResolver:使用游标传递数据而无需重新查询,或者在从活动查询时获取确切执行的游标

发布于 2024-09-17 21:58:06 字数 1304 浏览 4 评论 0原文

假设我有一个 ContentProvider(实际上不执行数据库调用),并且我想通过光标将一些附加数据(例如,调用统计信息)传递给调用者:

public class SomeProvider extends ContentProvider {

    . . .      

    public Cursor query(....) {
        // I can not set extras for cursor here
        return new MyCursorImplementation(iterationData, callStats);
    }

}

在活动中,我想做:

Cursor cursor = getContentResolver().query(...);
CallStats callStats = ((MyCursorImplementation)cursor).getCallStats();

但我无法做到这一点,因为光标已经包裹在 ContentResolver.CursorWrapperInner 中,并且抛出了 ClassCastException

使用 AsyncTask 时会非常方便:

protected class SomeAsyncTask extends AsyncTask<Uri, Void, Cursor> {


     ...


     @Override
     protected Cursor doInBackground(Uri... uris) {
         return getContentResolver().query(uris[0], ...);
     }

     @Override
     protected void onPostExecute(Cursor cursor) {
         if (cursor != null) {
             // update view with cursor data, do other things using cursor

             CallStats callStats = ((MyCursorImplementation)cursor).getCallStats();
             // do some UI changes using call statistics
             // ...but fails here
         } 
     }

}

如何使用游标传递数据或获取与查询返回的完全相同的游标。或者说这是不可能的?

Say, I'm having a ContentProvider (which in fact do not performs database call) and I want to pass some additional data (for example, call statistics) with the cursor to the caller:

public class SomeProvider extends ContentProvider {

    . . .      

    public Cursor query(....) {
        // I can not set extras for cursor here
        return new MyCursorImplementation(iterationData, callStats);
    }

}

In activity, I want to make:

Cursor cursor = getContentResolver().query(...);
CallStats callStats = ((MyCursorImplementation)cursor).getCallStats();

But I can't make this because cursor is already wrapped in ContentResolver.CursorWrapperInner and ClassCastException is thrown.

It'd be very handy when using AsyncTask:

protected class SomeAsyncTask extends AsyncTask<Uri, Void, Cursor> {


     ...


     @Override
     protected Cursor doInBackground(Uri... uris) {
         return getContentResolver().query(uris[0], ...);
     }

     @Override
     protected void onPostExecute(Cursor cursor) {
         if (cursor != null) {
             // update view with cursor data, do other things using cursor

             CallStats callStats = ((MyCursorImplementation)cursor).getCallStats();
             // do some UI changes using call statistics
             // ...but fails here
         } 
     }

}

How can I pass the data with the cursor or get exactly the same cursor that I've returned from query. Or it is impossible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文