如何使用contentprovider使用db列的总和填充单个textview

时间:2011-11-02 16:01:32

标签: cursor android-contentprovider

真是个问题! 更清楚地描述它: 我正在使用片段,我的目标是使用TextView显示数据库表列的总和。每当表以不同方式更新(删除,插入,更新)时,应更新此总和。 如果没有contentprovider,我会在DBHelper类中编写一个返回值的方法。但问题开始了。片段中以编程方式更新textview非常困难(直到不可能)。因此,我喜欢使用contentprovider,因为它总是会告诉我的列表视图有关更改,而无需我的任何额外工作。在这种情况下(contentprovider)我有(imho)使用带有cursorloader和uri的loader方法onCreateLoader()和onLoadFinished()。但是他们都返回了一个游标对象,这就是我在这个单一的textview上无法附加的东西。 在浏览列表视图和内容提供者的所有日子之后,我的想法可能过于“过分夸张”,因此我无法看到简单的文本视图的简单解决方案。如果有...

2 个答案:

答案 0 :(得分:4)

我找到了一个,至少是解决方法。如果有人知道更好的解决方案,我将不胜感激。

要使用Loader,您必须覆盖3种方法:

  • onCreateLoader(int id,Bundle arg1)
  • onLoadFinished(Loader loader,Cursor cursor)和
  • onLoaderReset(Loader arg0)

因此,假设我们有一个TextView电视,应该通过ContentProvider进行更新。

onCreateLoader()

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {
        String select = "where _id="+id; //id is definied earlier in this program
        loader = new CursorLoader(getActivity(),
                MaterialContentProvider.READ_SINGLE_MATSTAMM_URI, null, select, null, null);
    }
    return loader;
}

MaterialContentProvider.READ_SINGLE_MATSTAMM_URI是我的URI,它显示要使用的ContentProvider数据库表以及方式。在这种情况下,我会得到一个结果。 我们将通过 onLoadFinished()进行异步处理,这是我的解决方法:

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {

     final TextView tv = (TextView) View.findViewById(R.id.mytextview);
     tv.setText(cursor.getString(cursor.getColumnIndex("myColumn")));
}

从现在开始,每当内容在onCreateLoader()中的uri所针对的表中发生更改时,您的TextView电视都会更新。 “技巧”是不像往常那样放弃光标(使用类似“adapter.swap(cursor)”的东西),因为没有任何适配器。为了得到一列的总和,你必须用光标获得这个特殊列的所有行(这意味着你有一个不同的uri)。

答案 1 :(得分:0)

我使用了here所示的方法。 基本上你需要我们Handler将字符串从Cursor发布到用户界面。 而且你还需要前进到第一个Cursor - 位置:

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    if (cursor.moveToFirst()) {
        final String text =  cursor.getString(cursor.getColumnIndex(""myColumn));
        final TextView tv = (TextView) View.findViewById(R.id.mytextview);
        handler.post(new Runnable() {
            public void run() {
                tv.setText(text);
            }
        });
    }
}

不要忘记在重置Cursor时必须清除用户界面。

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    final TextView tv = (TextView) View.findViewById(R.id.mytextview);
    handler.post(new Runnable() {
        public void run() {
            tv.setText("");
        }
    });
}