android cursorloader与db来自不同的活动

时间:2018-02-18 14:45:02

标签: android sql sqlite android-cursorloader

我在其他活动中使用的活动中访问数据库。但是当我在数据库上使用getContentResolver.update()时,它不会在我的CursorLoader中更新,尽管它访问相同的数据库(它是相同的queryUri )。当我将查询转储到db时,它会显示更新的值,但CursorLoader不会。

这是我的onCreateLoader方法:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    Uri queryUri;
    if(id == ID_LOADER_PORTFOLIO) {
        String[] projection = null;
        String selection = null;
        String[] selectionArguments = null;
        queryUri = MainFeedContract.CONTENT_URI;

        return new CursorLoader(this,
                queryUri,
                MainActivity.COLUMN_NAMES,
                selection,
                selectionArguments,
                null);
    }

    return null;
}

这是我在相同活动中更新数据库的呼吁:

portfolioBuilder
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                })
                .setPositiveButton("Apply",new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        EditText et_newValue = (EditText) view.findViewById(R.id.et_portfolio);
                        Double value = Double.valueOf(et_newValue.getText().toString());
                        String selectedSpinnerCurrency = spinner.getSelectedItem().toString();
                        ContentValues cv = new ContentValues();
                        cv.put("units",value);
                        getContentResolver().update(MainFeedContract.CONTENT_URI, cv, "name=?", new String[]{selectedSpinnerCurrency});
                        Log.d("QUERY", DatabaseUtils.dumpCursorToString(getContentResolver().query(MainFeedContract.CONTENT_URI, null, null, null, null)));

                    }
                });

我在尝试更新数据库时犯了错误吗? :/

1 个答案:

答案 0 :(得分:0)

您可能需要注册ContentObserver

在onResume()

中调用此方法
 public void registerDataObserver() {
    try {
        getContext().getContentResolver().registerContentObserver(MainFeedContract.CONTENT_URI, true, new DataObserver(new Handler()));
    } catch (IllegalStateException ise) {
    }

}

DataObserver类

class DataObserver extends ContentObserver {

    public DataObserver(Handler handler) {
        super(handler);
    }

    @Override
    public void onChange(boolean selfChange, Uri uri) {
         getLoaderManager().restartLoader(0, null, this);

    }
}