Android getContext().getContentResolver().notifyChange(uri,null)没有';t通知游标

Android getContext().getContentResolver().notifyChange(uri,null)没有';t通知游标,android,Android,我试图颠覆内容提供商,但我坚持一件事, 光标的通知不起作用,如果我在查询方法中更新光标,一切正常。哪里出错了。谢谢!这是完整的源代码 主要活动 package com.example.lesson101_contentprovider_creation_h; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import a

我试图颠覆内容提供商,但我坚持一件事, 光标的通知不起作用,如果我在查询方法中更新光标,一切正常。哪里出错了。谢谢!这是完整的源代码

主要活动

    package com.example.lesson101_contentprovider_creation_h;

import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.database.Cursor;
import android.databinding.DataBindingUtil;
import android.net.Uri;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.example.lesson101_contentprovider_creation_h.databinding.ActivityMainBinding;
import com.example.lesson101_contentprovider_creation_h.interfaces.IUpdateCursor;
import com.example.lesson101_contentprovider_creation_h.fragments.Insert;
import com.facebook.stetho.Stetho;

import java.util.ArrayList;

public class MainActivity extends FragmentActivity implements IUpdateCursor {
    public final static Uri PROVIDER_URI = Uri.parse("com.example.lesson101_contentprovider_creation_h");
    private Cursor cursor;
    private MyAdapter scAdapter;
    private ActivityMainBinding mainActivity;
    private OnClickListener clickListener;
    private int colId;
    private int colText;
    private ArrayList<Integer> chekedItems = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        stethoInit();


        mainActivity = DataBindingUtil.setContentView(this, R.layout.activity_main);

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
            cursor = getContentResolver().query(MyProvider.CONTENT_URI, null, null, null, null, null);
        }

        colId = cursor.getColumnIndex(MyProvider.ID);
        colText = cursor.getColumnIndex(MyProvider.TEXT);

        String[] from = new String[]{MyProvider.ID, MyProvider.TEXT};
        int[] to = new int[]{R.id.itemId, R.id.itemText};

        scAdapter = new MyAdapter(this, R.layout.item, cursor, from, to, 0);

        mainActivity.listItem.setAdapter(scAdapter);
        scAdapter.notifyDataSetChanged();

        mainActivity.listItem.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                final View v = view;
                final LinearLayout itemUpdateLayout = (LinearLayout)view.findViewById(R.id.itemUpdateLayout);
                final LinearLayout itemViewLayout = (LinearLayout)view.findViewById(R.id.itemViewLayout);

                TextView idView = (TextView)view.findViewById(R.id.itemId);
                TextView textView = (TextView)view.findViewById(R.id.itemText);
                final EditText editText = (EditText)view.findViewById(R.id.updateTextField);
                Button updateButton = (Button)view.findViewById(R.id.updateRecButton);
                editText.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                    }

                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                        Log.d("!!!","onTextChanged -> "+s.toString());
//                        ed
                    }

                    @Override
                    public void afterTextChanged(Editable s) {

                    }
                });

                final String updId  = idView.getText().toString();
                updateButton.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        ContentValues cv = new ContentValues();

                        String text = editText.getText().toString();

                        Log.d("!!!","clicked text -> "+editText.getText().toString());
                        if(text.length() > 0) {
                            cv.put(MyProvider.TEXT, text);
                            Uri newUri = ContentUris.withAppendedId(MyProvider.CONTENT_URI,Long.valueOf(updId));
                            getContentResolver().update(newUri, cv,null,null);

//                            Cursor cursor = null;
//                            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
//                                cursor = getContentResolver().query(MyProvider.CONTENT_URI,null,null,null,null,null);
//                            }
//                            updateCursor(cursor);
                        }


                        itemUpdateLayout.setVisibility(View.GONE);
                        itemViewLayout.setVisibility(View.VISIBLE);
                    }
                });
                editText.setText(textView.getText());

                itemUpdateLayout.setVisibility(View.VISIBLE);
                itemViewLayout.setVisibility(View.INVISIBLE);


            }
        });

        mainActivity.insert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Fragment insertFragment = new Insert();
                FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                ft.replace(R.id.container, insertFragment);
                ft.addToBackStack(null);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.commit();
            }
        });

        mainActivity.delete.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if(chekedItems.size() > 0){
                    for (int i = 0; i < chekedItems.size(); i++) {
                        Uri newUri = ContentUris.withAppendedId(MyProvider.CONTENT_URI,chekedItems.get(i));
                        getContentResolver().delete(newUri,null,null);
//                        Cursor cursor = null;
//                        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
//                            cursor = getContentResolver().query(MyProvider.CONTENT_URI,null,null,null,null,null);
//                        }
//                        updateCursor(cursor);
                    }
                    chekedItems.clear();
                }else{
                    Toast.makeText(MainActivity.this,"Nothing selected",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }


    private void stethoInit() {
        // Create an InitializerBuilder
        Stetho.InitializerBuilder initializerBuilder =
                Stetho.newInitializerBuilder(this);

        // Enable Chrome DevTools
        initializerBuilder.enableWebKitInspector(
                Stetho.defaultInspectorModulesProvider(this)
        );

        // Enable command line interface
        initializerBuilder.enableDumpapp(
                Stetho.defaultDumperPluginsProvider(this)
        );

        // Use the InitializerBuilder to generate an Initializer
        Stetho.Initializer initializer = initializerBuilder.build();

        // Initialize Stetho with the Initializer
        Stetho.initialize(initializer);
    }


    @Override
    public void updateCursor(Cursor newCusor) {
        scAdapter.changeCursor(newCusor);
        scAdapter.notifyDataSetChanged();
        //hide keyboard
        View view = this.getCurrentFocus();
        if (view != null) {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }


    private class MyAdapter extends SimpleCursorAdapter{
        private int layout;
        public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
            super(context, layout, c, from, to, flags);
            this.layout = layout;
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            final String id = cursor.getString(colId);
            String title = cursor.getString(colText);
            TextView idView = (TextView)view.findViewById(R.id.itemId);
            idView.setText(id);
            TextView textView = (TextView)view.findViewById(R.id.itemText);
            textView.setText(title);
            CheckBox checkBox = (CheckBox)view.findViewById(R.id.itemCheckBox);
            checkBox.setChecked(false);

            checkBox.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(!chekedItems.contains(Integer.valueOf(id))){
                        chekedItems.add(Integer.valueOf(id));
                    }else{
                        chekedItems.remove(chekedItems.indexOf(Integer.valueOf(id)));
                    }
                }
            });
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            View view = getLayoutInflater().inflate(layout,parent,false);
            return view;
        }

        @Override
        public int getItemViewType(int position) {
            return position;
        }

        @Override
        public int getViewTypeCount() {
            return getCount();
        }


    }
}
我的提供者

 package com.example.lesson101_contentprovider_creation_h;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;



/**
 * Created by den on 2017-03-31.
 */

public class MyProvider extends ContentProvider{
    private final String DB_NAME = "my";
    private int DB_VERSION = 1;

    private static final String AUTHORITY = "com.example.lesson101_contentprovider_creation_h";
    private static final String PATH = "table";

    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + PATH);
    public static final String DB_TABLE = "MYTABLE";
    public static final String ID = "_id";
    public static final String TEXT = "text";

    private final String CREATE_DB = "CREATE TABLE " + DB_TABLE + " ("
            + ID + " integer primary key autoincrement, "
            + TEXT + " text);";

    private DBHelper dbHelper;
    private SQLiteDatabase database;
    private static final int TABLE = 1;
    private static final int TABLE_ID = 2;

    static final String CONTACT_CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd."
            + AUTHORITY + "." + PATH;

    private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    static {
        uriMatcher.addURI(AUTHORITY, PATH, TABLE);
        uriMatcher.addURI(AUTHORITY, PATH + "/#", TABLE_ID);
    }

    @Override
    public boolean onCreate() {
        dbHelper = new DBHelper(getContext());

        return true;
    }


    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection,
                        @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        database = dbHelper.getWritableDatabase();
        switch (uriMatcher.match(uri)){
            case TABLE:
                sortOrder = ID;
                break;
            case TABLE_ID:
                String id = uri.getLastPathSegment();
                sortOrder = TEXT;
                break;
        }
        Cursor cursor = database.query(DB_TABLE,projection,selection,selectionArgs,null,null,sortOrder);
        Log.d("!!!","query -> "+uri.toString());
        cursor.setNotificationUri(getContext().getContentResolver(),CONTENT_URI);
        return cursor;
    }


    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        switch (uriMatcher.match(uri)){
            case TABLE:

                break;
            case TABLE_ID:
                return CONTACT_CONTENT_ITEM_TYPE;
        }
        return null;
    }


    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        database = dbHelper.getWritableDatabase();
        Log.d("!!!","insert -> "+uri.toString());
        if(uriMatcher.match(uri) != TABLE)
            throw new IllegalArgumentException("Wrong URI: "+uri);

        long id = database.insert(DB_TABLE,null,values);
        Uri resultUri = ContentUris.withAppendedId(CONTENT_URI,id);
        Log.d("!!!","insert after -> "+resultUri.toString());
        getContext().getContentResolver().notifyChange(resultUri,null);
        return resultUri;
    }


    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        database = dbHelper.getWritableDatabase();
        switch (uriMatcher.match(uri)){
            case TABLE:
                break;
            case TABLE_ID:
                String id  = uri.getLastPathSegment();
                selection = ID + " = " + id;
                break;
        }
        int c =  database.delete(DB_TABLE,selection,selectionArgs);
        getContext().getContentResolver().notifyChange(uri, null);
        return c;
    }


    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        database = dbHelper.getWritableDatabase();
        switch (uriMatcher.match(uri)){
            case TABLE:
                break;
            case TABLE_ID:
                String id = uri.getLastPathSegment();
                selection = ID + " = " +id;
                Log.d("!!!",id);
                break;
        }
        int c =  database.update(DB_TABLE,values,selection,null);
        getContext().getContentResolver().notifyChange(uri, null);
        return c;
    }





    private class DBHelper extends SQLiteOpenHelper{


        public DBHelper(Context context) {
            super(context,DB_NAME,null,DB_VERSION);
        }


        @Override
        public void onCreate(SQLiteDatabase db) {
            updateDB(db,0,DB_VERSION);
        }


        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        }


        private void updateDB(SQLiteDatabase db, int oldVersion, int newVersion){
            if(oldVersion < 1)
                db.execSQL(CREATE_DB);
        }
    }



}
package com.example.lesson101\u contentprovider\u creation\u h;
导入android.content.ContentProvider;
导入android.content.ContentUris;
导入android.content.ContentValues;
导入android.content.Context;
导入android.content.UriMatcher;
导入android.database.Cursor;
导入android.database.sqlite.SQLiteDatabase;
导入android.database.sqlite.SQLiteOpenHelper;
导入android.net.Uri;
导入android.support.annotation.NonNull;
导入android.support.annotation.Nullable;
导入android.util.Log;
/**
*由den于2017年3月31日创建。
*/
公共类MyProvider扩展了ContentProvider{
私有最终字符串DB_NAME=“my”;
私有int DB_版本=1;
private static final String AUTHORITY=“com.example.lesson101\u contentprovider\u creation\u h”;
私有静态最终字符串PATH=“table”;
公共静态最终Uri内容\u Uri=Uri.parse(“内容:/“+权限+”/“+路径);
公共静态最终字符串DB_TABLE=“MYTABLE”;
公共静态最终字符串ID=“\u ID”;
公共静态最终字符串TEXT=“TEXT”;
私有最终字符串CREATE_DB=“CREATE TABLE”+DB_TABLE+”(“
+ID+“整数主键自动递增,”
+TEXT+“TEXT);”;
私人DBHelper DBHelper;
专用数据库;
专用静态最终整数表=1;
私有静态最终int表_ID=2;
静态最终字符串CONTACT\u CONTENT\u ITEM\u TYPE=“vnd.android.cursor.ITEM/vnd。”
+权限+“+”路径;
私有静态UriMatcher UriMatcher=新UriMatcher(UriMatcher.NO_匹配);
静止的{
addURI(权限、路径、表);
addURI(AUTHORITY,PATH+“/#”,TABLE_ID);
}
@凌驾
公共布尔onCreate(){
dbHelper=newdbhelper(getContext());
返回true;
}
@可空
@凌驾
公共游标查询(@NonNull Uri,@null字符串[]投影,
@可空字符串选择、@Nullable String[]selectionArgs、@Nullable字符串排序器){
database=dbHelper.getWritableDatabase();
开关(uriMatcher.match(uri)){
案例表:
sortOrder=ID;
打破
病例表编号:
String id=uri.getLastPathSegment();
排序器=文本;
打破
}
Cursor=database.query(数据库表、投影、选择、选择、空、空、排序器);
Log.d(“!!!”,“query->”+uri.toString());
cursor.setNotificationUri(getContext().getContentResolver(),CONTENT_URI);
返回光标;
}
@可空
@凌驾
公共字符串getType(@NonNull Uri){
开关(uriMatcher.match(uri)){
案例表:
打破
病例表编号:
返回联系人\内容\项目\类型;
}
返回null;
}
@可空
@凌驾
公共Uri插入(@NonNull-Uri,@null-ContentValues){
database=dbHelper.getWritableDatabase();
Log.d(“!!!”,“插入->”+uri.toString());
if(uriMatcher.match(uri)!=表)
抛出新的IllegalArgumentException(“错误的URI:+URI”);
long id=database.insert(DB_TABLE,null,value);
uriresulturi=ContentUris.withAppendedId(CONTENT\u Uri,id);
Log.d(“!!!”,“在->之后插入”+resultUri.toString());
getContext().getContentResolver().notifyChange(resultUri,null);
返回结果;
}
@凌驾
public int delete(@NonNull Uri、@Nullable String selection、@Nullable String[]selectionArgs){
database=dbHelper.getWritableDatabase();
开关(uriMatcher.match(uri)){
案例表:
打破
病例表编号:
String id=uri.getLastPathSegment();
选择=ID+“=”+ID;
打破
}
int c=database.delete(DB_TABLE,selection,selectionArgs);
getContext().getContentResolver().notifyChange(uri,null);
返回c;
}
@凌驾
公共int更新(@NonNull Uri、@Nullable ContentValues values、@Nullable String selection、@Nullable String[]selectionArgs){
database=dbHelper.getWritableDatabase();
开关(uriMatcher.match(uri)){
案例表:
打破
病例表编号:
String id=uri.getLastPathSegment();
选择=ID+“=”+ID;
Log.d(“!!!”,id);
打破
}
int c=database.update(DB_表,值,选择,null);
getContext().getContentResolver().notifyChange(uri,null);
返回c;
}
私有类DBHelper扩展了SQLiteOpenHelper{
公共DBHelper(上下文){
super(上下文,数据库名称,空,数据库版本);
}
@凌驾
public void onCreate(SQLiteDatabase db){
更新的数据库(db,0,db_版本);
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
}
私有void updateDB(SQLiteDatabase db,int-oldVersion,int-newVersion){
如果(旧版本<1)
execSQL(创建数据库);
}
}
}

您是否检查了setNotificationUri中使用的uri是否与getContext()中使用的uri匹配。getContentResolver().notifyChange()中使用的uri匹配

将为的下划线uri注册

getContext().getContentResolver().notifyChange(uri, null); 
在ContentProvider的insert()、update()和delete()调用时调用,因此将通知游标(has setNotificationUri())

如果您使用的是CursorAdapter,则
Cursor.setNotificationUri() 
getContext().getContentResolver().notifyChange(uri, null);