我有一些代码对数据库执行两个查询并返回两个游标对象.有没有什么方法可以将这两个游标组合起来,以便所有游戏都ListView可以获取数据?
当重写ArrayAdapter我知道使用这样的模式是正确的:
if(view != null){
...create new view setting fields from data
}else
return view; //reuse view
Run Code Online (Sandbox Code Playgroud)
使用CursorAdapters的这种模式也是正确的吗?我的问题是我有一个根据光标字段可以是红色或蓝色的文本颜色,所以我不希望任何错误像一个需要蓝色字段的单元格上的红色.我的bindView代码是这样的:
if(c.getString(2).equals("red"))
textView.setTextColor(<red here>);
else
textView.setTextColor(<blue here>);
Run Code Online (Sandbox Code Playgroud)
如果我重复使用视图,我可以确定红色是红色,而蓝色是蓝色吗?
谷歌文档指出不使用第CursorAdapters一个构造函数,
CursorAdapter(Context context, Cursor c)
Run Code Online (Sandbox Code Playgroud)
只有两个选项,
CursorAdapter(Context context, Cursor c, boolean autoRequery)
Run Code Online (Sandbox Code Playgroud)
这说
允许控制自动重新查询的构造函数.建议您不要使用它,而是使用CursorAdapter(Context,Cursor,int).使用此构造函数时,将始终设置FLAG_REGISTER_CONTENT_OBSERVER
和
CursorAdapter(Context context, Cursor c, int flags)`
Run Code Online (Sandbox Code Playgroud)
这说它是推荐的构造函数.
问题是这里只有两个标志用于最后一个构造函数,FLAG_AUTO_REQUERY(int 1)和FLAG_REGISTER_CONTENT_OBSERVER(int 2).使用FLAG_AUTO_REQUERY没有意义,因为我现在使用CursorLoader在后台管理它并更新它.有FLAG_REGISTER_CONTENT_OBSERVER,它表示使用时不需要CursorLoader.
现在我问,我通过什么整数CursorAdapter(Context context, Cursor c, int flags)才能使它与我的工作正常CursorAdapter?让我担心的是如何正确管理旧光标.我不确定这样做的正确方法.
如果我使用FLAG_REGISTER_CONTENT_OBSERVER,那么我必须做一些事情onContentChanged(),但swapCursor()在我使用时LoaderManager,由于光标未关闭,我可以做adapter.swapCursor(cursor).close().但会与冲突onContentChanged()的CursorAdapter?目标是不会导致任何内存泄漏并且效率很高.
android android-contentprovider android-loadermanager android-cursorloader android-cursoradapter
我和我的Android团队有问题.我们有一个应用程序,可以显示用户的联系簿,并提供扩展信息.
当前设置
我们的应用程序读取Android OS的联系人提供程序.将此信息发送到我们的服务器,为我们计算几个必要的字段.稍后我们的应用程序会提取此信息,并将此信息保存在SQLite数据库中.我们在数据库中最终得到的是两个表格.一个包含所有数字和服务器为我们计算的所有额外信息.另一个表是所有联系人(一个联系人可以有多个号码).此联系人表仅为性能而创建; 我们可以让Cursor在为用户呈现联系簿时选择CursorAdapter中此Contacts表中的所有行.因此,在向用户呈现联系簿时,我们只需要从我们自己的SQLite数据库中读取并且只需要读取一个表(例如,没有JOIN).
主要问题
有很多同步正在进行中.由于数据是重复的,我们需要检查添加/更改/删除,并需要同步所有的fing时间.此外,当我们现在要更改表示层中的特定内容时,我们需要更改Contacts表以包含此特定信息.
我们的优先事项
1st:向用户出示联系簿时的表现.
第二:代码可维护性.
因此,不要评论"不要重复数据 - 它是所有问题的根源".对我们来说,更重要的是用户没有性能问题,因为开发人员不得不花费额外的时间来编写良好的同步算法.
解决方案?
我不知道为什么,但我一直认为CursorAdapter(读取一个表中的所有行)的表现要比带有List对象(保存在内存中)的ArrayAdapter好得多.谁知道这是真的吗?因为一个能够帮助我们至少一半的解决方案是在启动时加入Contacts Provider(本地联系簿)和我们的扩展信息,将其保存在内存列表中并使用ArrayAdapter显示.
创建自己的内容提供商?我对创建自己的内容提供商知之甚少.任何人都试图创建一个内容提供者来扩展本地联系簿的信息并加入这些内容.也许与这个接口的实现:ContactsContract.DataColumnsWithJoins?有人试过类似的东西?在CursorAdapter中显示此信息时的性能如何?
请询问我可能忘记的任何更多信息,我会更新问题!
非常感谢所有有用的提示和解决方案!
sqlite performance android android-contentprovider android-cursoradapter
我正在使用不推荐使用的SimpleCursorAdapter来显示从Cursor到ListView的数据.我添加了附加参数0,它删除了代表性的警告,但我想使用更好的方式来显示数据.我已经阅读了一些内容Loader,但不知道如何实现它.什么是下面代码的更好的替代品?如何将此代码转换为使用Loader?
Cursor c = mDbHelper.getAllRecords();
startManagingCursor(c); //this is also deprecated
String[] from = new String[] { "Name" };
int[] to = new int[] { R.id.text1 };
SimpleCursorAdapter names =
new SimpleCursorAdapter(this, R.layout.names_row, c, from, to, 0);
setListAdapter(names);
Run Code Online (Sandbox Code Playgroud) 我的应用程序CursorLoader用于从主表加载数据.数据将ListView在帮助下显示CursorAdapter.ListView中显示的视图还需要子表中的数据.表的关系是一对多的.
如果我在查询期间加入两个表,则组合记录将与子记录一样多,因此ListView,它将在主表中为一个记录显示多个项目.
如果我不加入表,我不确定CursorLoader在通过游标传递数据后检索子记录的最佳方法是什么.有人能帮帮我吗?
我正在修改我的Android应用程序以使用ORMLite,它目前使用了许多CursorAdapter,我非常希望尽量减少编码.
我不是100%肯定但是看起来当ORMLite在db中创建一个id字段时,它总是使用id,而CursorAdapter需要_id.
可以使用如下查询来解决此问题:
select id as _id ......
Run Code Online (Sandbox Code Playgroud)
但该Dao.queryRaw()方法返回一个列表,而不是Cursor,所以我这样做的方法是打开另一个SQLiteOpenHelper数据库连接并使用rawQuery().
这有效,但有没有更好的方法呢?拥有两个独立的数据库连接似乎有点过头了,以后可能会存在麻烦.
我从未对我的自定义CursorAdapter上的代码感到满意,直到今天我决定复习它并修复一个困扰我很长时间的小问题(有趣的是,我的应用程序的用户都没有报告过这样的问题).
这是我的问题的一个小描述:
我的自定义CursorAdapter覆盖newView(),bindView()而不是getView()我看到的大多数示例.我在这两种方法之间使用ViewHolder模式.但我的主要问题是我为每个列表项使用的自定义布局,它包含一个ToggleButton.
问题是当列表项视图滚出视图然后滚动回视图时,按钮状态不会保留.这个问题之所以存在,cursor是因为当ToggleButton按下时数据库数据发生了变化,并且它总是在拉动相同的数据.我在点击时尝试重新查询光标ToggleButton并解决了问题,但速度非常慢.
我已经解决了这个问题,我将全班发布在这里进行审核.我已经对这个特定问题彻底评论了代码,以便更好地解释我的编码决策.
这段代码对你来说好看吗?你会以某种方式改进/优化或改变它吗?
PS:我知道CursorLoader是一个明显的改进,但我暂时还没有时间处理这么大的代码重写.这是我在路线图中的一些东西.
这是代码:
public class NotesListAdapter extends CursorAdapter implements OnClickListener {
private static class ViewHolder {
ImageView icon;
TextView title;
TextView description;
ToggleButton visibility;
}
private static class NoteData {
long id;
int iconId;
String title;
String description;
int position;
}
private LayoutInflater mInflater;
private NotificationHelper mNotificationHelper;
private AgendaNotesAdapter mAgendaAdapter;
/*
* This is used to store the state of the …Run Code Online (Sandbox Code Playgroud) 我有一个自定义ContentProvider管理SQLite数据库的访问.要在a中加载数据库表的内容ListFragment,我使用LoaderManagerwith a CursorLoader和a CursorAdapter:
public class MyListFragment extends ListFragment implements LoaderCallbacks<Cursor> {
// ...
CursorAdapter mAdapter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new CursorAdapter(getActivity(), null, 0);
setListAdapter(mAdapter);
getLoaderManager().initLoader(LOADER_ID, null, this);
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(getActivity(), CONTENT_URI, PROJECTION, null, null, null);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor c) {
mAdapter.swapCursor(c);
}
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
}
Run Code Online (Sandbox Code Playgroud)
SQLite数据库由后台任务更新,后台任务从Web服务获取大量项目,并通过ContentProvider批处理操作将这些项目插入数据库(ContentResolver#applyBatch()). …
sqlite android cursor android-contentprovider android-cursoradapter
我现在可以将CursorAdapter绑定到ListView.并且ListView可以在修改数据库时自动更新.
对于数据库中的数据行,字段为"类型",它们可以是"每日","每周","每月",.etc.我想在ExpandableListView中显示行,以便每种类型的行可以组合在一起.我还希望ExpandableListView可以在修改数据库时自动更新.如何将CursorAdapter和ExpandableListView组合在一起?
我google了很多,但找不到解决方案,谢谢你的关注!