我正在开发一款应用程序并且目前卡住了。我要做的是在用户界面上显示数据之前处理来自数据库的数据。
我的应用会像这样收集数据并存储在数据库中。
+--------------------+ | Name Used_time(s) | +--------------------+ | C 10 | | B 12 | | A 23 | | C 11 | | A 14 | +--------------------+
我以基本方式实现了CursorLoader和自定义CursorAdapter,它正确显示我的原始数据库数据及其更新!对我有好处!
但我想要做的是在列表视图中显示应用程序的聚合时间,如下所示。
+--------------------+ | Name Used_time(s) | +--------------------+ | C 21 | | B 12 | | A 37 | +--------------------+
我曾尝试修改我的游标适配器以在适配器中进行求和,但它会自动获取每个游标的光标位置,并返回listview位置的视图,无论我是否触摸Used_time数据。我找不到解决方法。
我在活动类中的当前加载程序代码..
private void loadDB() {
getLoaderManager().initLoader(0, null, this);
cursorAdapter = new MyCursorAdapter(this, null);
setListAdapter(cursorAdapter);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String[] projection = MyTable.MY_COLUMNS ;
CursorLoader cursorLoader= new CursorLoader(this, MyContentProvider.CONTENT_URI_APPS, projection, null, null, null);
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
cursorAdapter.swapCursor(cursor);
}
适配器代码。
public MyCursorAdapter(Context context, Cursor cursor) {
super(context, cursor);
LayoutInflater inflater = LayoutInflater.from(context);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return inflater.inflate(R.layout.app_row, parent, false);
}
@Override
public void bindView (View view, Context context, Cursor cursor) {
TextView NameTv = (TextView)view.findViewById(R.id.name);
TextView TimeTv = (TextView)view.findViewById(R.id.time);
String Name = cursor.getString(1);
appNameTv.setText(Name);
int Time = (int)(cursor.getLong(2));
TimeTv.setText(String.valueOf(Time));
}
我还想创建一个新表,共享首选项或散列映射来存储聚合数据,但我认为这些是不必要的开销,因为应用程序保持收集数据,并且有办法通过处理适配器来解决这个问题。
有人能建议一种有效的方法吗?提前谢谢。
答案 0 :(得分:1)
听起来好像您正在寻找以下查询,但由于CursorLoader
没有为您提供执行聚合功能的选项,因此您陷入困境:
SELECT Name, COUNT(Used_time) FROM MyTable GROUP BY Name;
您应该阅读这篇文章,了解如何使用URI
创建自定义ContentProvider
并使用SQLiteQueryBuilder
,以便使用CursorLoader
来执行此查询