标签: android-cursorloader

从onLoadFinished()中的游标填充小部件

我想知道如何使用它CursorLoader来填充屏幕上的小部件.在线的所有示例仅用于使用适配器,这非常有用.我需要的是一种可靠的方法来从Cursor和UI线程更新我的屏幕中的视图,而不会因为StaleDataException或者光标被突然停用而崩溃.这是我目前的方法,但我仍然收到用户的一些崩溃报告.

@Override
    public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {
        CursorLoader loader = null;

        switch (id) {
            case LOADER_ID_DATA:
                loader = new CursorLoader(...);
                break;
        }

        return loader;
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, final Cursor cursor) {
        handler.post(new Runnable() {

            @Override
            public void run() {
                if (getActivity() == null)
                    return;

                updateView(cursor);
            }
        });
    }

    @Override
    public void onLoaderReset(Loader<Cursor> arg0) {
    }
Run Code Online (Sandbox Code Playgroud)

一种解决方案是直接在onLoadFinished中检索所有光标字段,并将它们全部传递给处理程序以填充UI线程上的窗口小部件.但这很难看,因为我可能在光标中有很多值.我很想找到一种可靠的无碰撞方式来处理这一切.

android android-cursorloader

6
推荐指数
1
解决办法
2759
查看次数

对CursorLoaders感到困惑并将它们与自定义SQLiteOpenHelper一起使用

我正在编写一个应用程序,允许人们为他们需要做的各种任务设置警报.我目前的计划是将所有相关数据存储到SQLite数据库中.为此,我创建了一个扩展SQLiteOpenHelper的类,并使用方法填充它以处理我期望必须接受的所有CRUD.知道在一个线程上执行所有处理通常是个坏主意,查找了在线程之间分离工作的方法,并找到了CursorLoader和LoaderManager,这看起来很理想,因为它们在Android兼容性库中可用.但是,LoaderManager似乎需要ContentProvider 按照文档中教程进行操作,而我还没有真正看到需要对ContentProviders做任何事情,因为我没有计划允许其他应用程序访问数据.没有ContentProvider,我不知道我应该如何为我的数据库提供一个Uri来提供给CursorLoader.有没有办法让我继续使用我的类扩展SQLiteOpenHelper并仍然实现LoaderManager,以允许我将所有填充的ListFragments与我的光标关闭UI线程?

sqlite android sqliteopenhelper android-loadermanager android-cursorloader

6
推荐指数
1
解决办法
1994
查看次数

在片段android中的CursorLoader中显示进度对话框

好日子,正如标题所说,任何人都知道如何在片段中从CursorLoader加载数据时实现进度对话框.在这方面找不到任何例子.任何有关如何操作的链接或指南将受到高度赞赏.谢谢

android android-fragments android-dialog android-cursorloader

6
推荐指数
1
解决办法
6641
查看次数

使用CursorLoader和Custom CursorAdapter进行ListView过滤

我目前正在做一个项目,涉及根据我当前的位置显示附近的位置列表.

我不久前刚开始使用Android编程,所以在编码阶段我还在学习.

我搜索了所有试图得到一些关于如何继续的线索.阅读和尝试后我仍然被困住了.

我的工作代码目前包括

  • CursorLoader
  • 自定义ResourceCursorAdapter,帮助填充ListView上的条目

问题

  1. 过滤ListView条目的"正确"方法是什么?我在Filter/Filterable界面上看过帖子,但它似乎不适用于我当前的设置?我是否在Custom CursorAdapter中执行过滤?

  2. 执行过滤后,如何刷新ListView?我是否调用getLoaderManager().restartLoader(0,null,this)或adapter.notifyDataSetChanged()?

提前致谢.

android android-listview android-loadermanager android-cursorloader android-cursoradapter

6
推荐指数
1
解决办法
3656
查看次数

Android CursorLoader没有响应ContentProvider通知

我正在更新Android 2.2应用程序以使用CursorLoader(使用v4兼容性库),我正在试图理解onLoadFinished当内容提供程序通知与CursorLoader查询关联的内容发生更改时未调用该方法的原因.

CursorLoader正在查询客户内容提供商.我的提供程序在其查询方法中设置通知URI:

cursor.setNotificationUri(getContext().getContentResolver(), uri);
Run Code Online (Sandbox Code Playgroud)

并通知其插入/更新/删除方法的更改:

getContext().getContentResolver().notifyChange(uri, null);
Run Code Online (Sandbox Code Playgroud)

我已经检查过两种情况下URI是否相同.以前我使用的是同一内容提供商的ManagedQuery,并且查询的内容更新得很好,这让我觉得内容提供商可能还可以.

我看过LoaderCursorSupport示例,有趣的是,当我在Nexus One上运行它时,我看不到它反映了我对联系人名称所做的更改(在示例应用程序和联系人应用程序之间切换).应该是?如果是这样,是否存在一些我不知道的潜在问题?

android android-contentprovider android-cursorloader

5
推荐指数
1
解决办法
3587
查看次数

通过CursorLoader中的'selection'参数过滤ListView

我要么我的语法不正确,要么我还没有理解Loaders如何工作,但我现在有一个ListView显示我的数据库中的所有项目.该活动有一个按钮,显示今天的日期.用户可以单击此按钮以显示日期对话框,或者可以按上一个/上一个按钮更改显示的日期.我想根据显示的日期过滤ListView,因此只显示保存日期的记录.

目前所有记录都显示

public Loader<Cursor> onCreateLoader(int id, Bundle args) {         
    CursorLoader cl = new CursorLoader(this, DBProvider.CONTENT_URI,
            null, null, null, null);
    return cl;
}
Run Code Online (Sandbox Code Playgroud)

我根据我在网上看到的内容尝试了一些变化,但实质上我试图包含一个'选择',将今天的日期显示为一个字符串(它已经通过SimpleDateFormatter并设置为按钮上的文本).

public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    String[] selectDate = { btn_logbook_date.getText().toString() };
    CursorLoader cl = new CursorLoader(this, DBProvider.CONTENT_URI,
            null, "Date=?", selectDate , null);
    return cl;
}
Run Code Online (Sandbox Code Playgroud)

public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    String selectDate = btn_logbook_date.getText().toString();
    String selection = "(" + AddDBHelper.KEY_DATE + "=" + selectDate + ")";

    CursorLoader cl = new CursorLoader(this, DBProvider.CONTENT_URI, …
Run Code Online (Sandbox Code Playgroud)

sqlite android filter where-clause android-cursorloader

5
推荐指数
1
解决办法
9455
查看次数

使用Android SimpleCursorAdapter和CursorLoader

我是Android的新手,我正试图让我的标题围绕SimpleCursorAdapterCursorLoader类.根据我的理解,我见过的所有示例都使用这两个类将数据加载到ListView后台线程中(不阻止UI).

我对此很好,并且已经将这种通用方法与我自己的项目列表一起使用,但是我现在希望能够单击列表中的项目并获取项目的完整信息.通常的做法是使用SimpleCursorAdapterCursorLoader检索单个项目的详细信息吗?或者它们只是用于列表?

谢谢.

android android-contentprovider android-listview android-cursorloader android-cursoradapter

5
推荐指数
1
解决办法
1万
查看次数

带有startManagingCursor()的CursorLoader

我在我的App中使用CursorLoader进行数据库事务.

我的应用程序也有调用startManagingCursor()的方法,该方法已被弃用.

我只是想替换这个方法调用,所以我该怎么做?

android android-cursorloader

5
推荐指数
1
解决办法
1万
查看次数

获取其中包含歌曲的类型名称列表

我正在使用CursorLoder类从android的媒体内容提供者获取Genre列表.下面是我的光标查询来获取类型列表.

 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        // currently filtering.
        Uri baseUri;
        baseUri = MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI;
        String[] STAR = { "*" };
        return new CursorLoader(getActivity(), baseUri, STAR, null, null, null );
    }
Run Code Online (Sandbox Code Playgroud)

现在,我从媒体内容提供商处获得了所有类型列表,但是我得到的数据存在问题.我也得到了之前创建的流派名称,但现在我没有歌曲.

我只想要有歌曲的流派,而不是没有歌曲的流派名称.

任何人都可以帮助我吗?

UPDATE

我可以使用下面的代码获取所有类型及其歌曲...

private void getGenresList() {

        //-------------------------------------

        int index;
        long genreId;
        int count;
        Uri uri;
        Cursor genrecursor;
        Cursor tempcursor;
        String[] proj1 = {MediaStore.Audio.Genres.NAME, MediaStore.Audio.Genres._ID};   
        String[] proj2={MediaStore.Audio.Media.DISPLAY_NAME};

         genrecursor=getActivity().getContentResolver().query(MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI,proj1,null, null, null);
         if(genrecursor.moveToFirst())
         {
             do{
                index = genrecursor.getColumnIndexOrThrow(MediaStore.Audio.Genres.NAME);            
                System.out.println("GENRE NAME: "+genrecursor.getString(index));
                System.out.println("======================================");

                index = genrecursor.getColumnIndexOrThrow(MediaStore.Audio.Genres._ID);             
                genreId=Long.parseLong(genrecursor.getString(index));
                uri = …
Run Code Online (Sandbox Code Playgroud)

android android-contentprovider simplecursoradapter android-cursorloader

5
推荐指数
1
解决办法
2176
查看次数

Loader <Cursor>仅加载选定的行+下一行

活动A中,我正在加载一个包含我表中所有值的列表,并设置了一个setOnItemClickListener来启动活动B并通过发送数据发送带有所选项的id [ 1 ] 的uri

[ 1 ] Uri currentTestUri = ContentUris.withAppendedId(TestEntry.CONTENT_URI, id);

活动B中,我的onCreateLoader包含投影:

String[] projection = {
       TestEntry._ID,
       TestEntry.COLUMN_TEST_ONE,
       TestEntry.COLUMN_TEST_TWO}
Run Code Online (Sandbox Code Playgroud)

...带有return语句

return new CursorLoader(this,  
    mCurrentTestUri, //Got this from Activity A         
    projection,             
    null,                   
    null,                   
    null);  
Run Code Online (Sandbox Code Playgroud)

我的onLoadFinished看起来像这样:

if (cursor.moveToFirst()) {
      int oneColumnIndex = cursor.getColumnIndex(TestEntry.COLUMN_TEST_ONE);
      int twoColumnIndex = cursor.getColumnIndex(TestEntry.COLUMN_TEST_TWO);

      String currentOne = cursor.getString(oneColumnIndex);
      String currentTwo = cursor.getString(twoColumnIndex);

      textViewOne.setText(currentOne);
      textViewTwo.setText(currentTwo);
}
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,现在我希望显示下一行(右下方)的值,但是使用不同的投影(我只需要_IDCOLUMN_TEST_ONE)并且onLoadFinished显示COLUMN_TEST_ONE的值textViewThree.

[两行的值应该同时显示,而不是一个或另一个]

我可以使用[ …

sqlite android android-cursorloader android-loader android-sqlite

5
推荐指数
1
解决办法
295
查看次数