【发布时间】:2016-11-19 20:28:06
【问题描述】:
这个问题是关于管理对 SQLiteDatabase 的小更改的有效且适当的方法。为了讨论的目的,我们可以看看this code,我在这里总结了:
CursorRecyclerViewAdapter.java
public abstract class CursorRecyclerViewAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
public CursorRecyclerViewAdapter(Context context, Cursor cursor) {
public Cursor getCursor() {
public int getItemCount() {
@Override public long getItemId(int position) {
@Override public void setHasStableIds(boolean hasStableIds) {
public abstract void onBindViewHolder(VH viewHolder, Cursor cursor);
@Override public void onBindViewHolder(VH viewHolder, int position) {
public void changeCursor(Cursor cursor) {
public Cursor swapCursor(Cursor newCursor) {
private class NotifyingDataSetObserver extends DataSetObserver {
@Override public void onChanged() {
@Override public void onInvalidated() {
MyListCursorAdapter.java
public class MyListCursorAdapter extends CursorRecyclerViewAdapter<MyListCursorAdapter.ViewHolder>{
public MyListCursorAdapter(Context context,Cursor cursor){
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View view) {
@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
@Override public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor) {
场景如下:应用程序的用户采取了一些动作,需要对数据库中的一条记录进行翻转。在该操作的侦听器中,很容易更改数据库中的一条记录,并确保视图随更改而更新。但是我的光标不再同步。我“解决”问题的方法是重新查询数据库并换入生成的新游标。但这似乎是用锤子杀死一只苍蝇。我希望 RecyclerView.notifyDataSetChanged() 方法能带来一些魔力,但它什么也没做。
那么,给定一个加载数据的Cursor 和一个小的更改,再次运行查询、获取新的Cursor 并交换它是否有效且合适,还是有更好的方法?
【问题讨论】:
-
这里的答案:stackoverflow.com/questions/7973607/… 表示游标不能更新,但内容提供者有这个功能。问题是,内容提供者应该用于在应用程序之间,而不是在它们内部。
标签: java android sqlite cursor android-recyclerview