【问题标题】:How to manage updated SQLite data when using Cursor supporting RecyclerView使用支持 RecyclerView 的 Cursor 时如何管理更新的 SQLite 数据
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2020-08-18
    • 2018-09-07
    • 1970-01-01
    相关资源
    最近更新 更多