2016-11-19 28 views
0

这个问题是关于管理对SQLiteDatabase的小改动的一种高效且适当的方式。对于disucssion目的,我们可以看看this code,我已经总结如下:如何使用光标支持RecyclerView时管理更新的SQLite数据

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并交换它,或者有更好的方法吗?

+0

答案在这里:https://stackoverflow.com/questions/7973607/android-can-you-update-a-cursor-for-sqlite-results表示游标无法更新,但内容提供商具有该功能。问题是,内容提供商应该在*应用程序之间使用,而不是在它们之间。 – Dale

回答

0

尽管重新运行完整查询的想法似乎效率很低,但this example on github可能用于检查重新查询大量记录的影响。在主要列表活动的onCreate()中,您可能会在repository.insertSome(n);中输入大量数字。对于1000条记录等,设置n为40左右。

现在,当用户对其中一个记录(长按)执行操作时,会更新数据库,模型和视图,并创建一个新的游标通过重新查询。虽然数据库中有很多记录,但查询似乎没有使用太多的资源(即它似乎很快响应)。