contentProvider并按名称搜索而不是ID Android

时间:2016-09-13 14:21:16

标签: android

这是我第一次使用内容提供商。 所以我有这个:

public class ContactsContentProvider extends ContentProvider {

    private ContactsDatabaseHelper dbHelper;
    private static final UriMatcher uriMatcher =
            new UriMatcher(UriMatcher.NO_MATCH);    

    private static final int ONE_CONTACT = 1;
    private static final int CONTACTS = 2;
    private static final int CONTACT = 3;
    static {    
        uriMatcher.addURI(ContactsDatabaseDescription.AUTHORITY,
                Contact.TABLE_NAME + "/#", ONE_CONTACT);
        uriMatcher.addURI(ContactsDatabaseDescription.AUTHORITY,
                Contact.TABLE_NAME, CONTACTS);
        uriMatcher.addURI(ContactsDatabaseDescription.AUTHORITY,
                Contact.TABLE_NAME + "/*" , CONTACT);
    }

    @Override
    public boolean onCreate() {    
        dbHelper = new ContactsDatabaseHelper(getContext());
        return true;
    }    

    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Override
    public Cursor query(Uri uri, String[] projection,
                        String selection, String[] selectionArgs, String sortOrder) {    
        SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
        queryBuilder.setTables(Contact.TABLE_NAME);

        switch (uriMatcher.match(uri)) {
            case ONE_CONTACT:
                queryBuilder.appendWhere(
                        Contact._ID + "=" + uri.getLastPathSegment());
                break;
            case CONTACTS:
                break;
             default:
                throw new UnsupportedOperationException(
                        getContext().getString(R.string.invalid_query_uri) + uri);
        }    

        Cursor cursor = queryBuilder.query(dbHelper.getReadableDatabase(),
                projection, selection, selectionArgs, null, null, sortOrder);    

        cursor.setNotificationUri(getContext().getContentResolver(), uri);
        return cursor;
    }

    // insert a new contact in the database
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Uri newContactUri = null;

        switch (uriMatcher.match(uri)) {
            case CONTACTS:
                // insert the new contact--success yields new contact's row id
                long rowId = dbHelper.getWritableDatabase().insert(
                        Contact.TABLE_NAME, null, values);    

                if (rowId > 0) {
                    newContactUri = Contact.buildContactUri(rowId);


                    getContext().getContentResolver().notifyChange(uri, null);
                }
                else
                    throw new SQLException(
                            getContext().getString(R.string.insert_failed) + uri);
                break;
            default:
                throw new UnsupportedOperationException(
                        getContext().getString(R.string.invalid_insert_uri) + uri);
        }

        return newContactUri;
    }    

    @Override
    public int update(Uri uri, ContentValues values,
                      String selection, String[] selectionArgs) {
        int numberOfRowsUpdated; // 1 if update successful; 0 otherwise

        switch (uriMatcher.match(uri)) {
            case ONE_CONTACT:

                String id = uri.getLastPathSegment();    

                numberOfRowsUpdated = dbHelper.getWritableDatabase().update(
                        Contact.TABLE_NAME, values, Contact._ID + "=" + id,
                        selectionArgs);
                break;
            default:
                throw new UnsupportedOperationException(
                        getContext().getString(R.string.invalid_update_uri) + uri);
        }

        if (numberOfRowsUpdated != 0) {
            getContext().getContentResolver().notifyChange(uri, null);
        }

        return numberOfRowsUpdated;
    }    

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int numberOfRowsDeleted;

        switch (uriMatcher.match(uri)) {
            case ONE_CONTACT:

                String id = uri.getLastPathSegment();    

                numberOfRowsDeleted = dbHelper.getWritableDatabase().delete(
                        Contact.TABLE_NAME, Contact._ID + "=" + id, selectionArgs);
                break;
            default:
                throw new UnsupportedOperationException(
                        getContext().getString(R.string.invalid_delete_uri) + uri);
        }    

        if (numberOfRowsDeleted != 0) {
            getContext().getContentResolver().notifyChange(uri, null);
        }

        return numberOfRowsDeleted;
    }
}

我的数据库是

public class ContactsDatabaseDescription {
    public static final String AUTHORITY =
            "com.example.afran.bdcontacts.data";    

    private static final Uri BASE_CONTENT_URI =
            Uri.parse("content://" + AUTHORITY);
        public static final class Contact implements BaseColumns {
            public static final String TABLE_NAME = "contacts"; // table's name
            public static final Uri CONTENT_URI =
                    BASE_CONTENT_URI.buildUpon().appendPath(TABLE_NAME).build();

            public static final String COLUMN_FIRST_NAME = "firstName";
            public static final String COLUMN_LAST_NAME = "lastName";
            public static final String COLUMN_EMAIL = "email";
            public static final String COLUMN_TYPE = "type";

        public static Uri buildContactUri(long id) {
            return ContentUris.withAppendedId(CONTENT_URI, id);
        }
    }
}

在这个片段上我读了一个姓氏(搜索),我想找到联系人,我不知道如何

public class DetailFragment extends Fragment
        implements LoaderManager.LoaderCallbacks<Cursor> {    

    public interface DetailFragmentListener {
        void onContactDeleted();  
        void onEditContact(Uri contactUri);
    }

    private static final int CONTACT_LOADER = 0;  

    private DetailFragmentListener listener;  
    private Uri contactUri;  

    private TextView prenomTextView;
    private TextView nomTextView;
    private TextView emailTextView;  
    private TextView typeTextView;      

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        listener = (DetailFragmentListener) context;
    }

    @Override
    public void onDetach() {
        super.onDetach();
        listener = null;
    }

    @Override
    public View onCreateView(
            LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        setHasOptionsMenu(true);      

        Bundle arguments = getArguments();

        if (arguments != null)
            contactUri = arguments.getParcelable(MainActivity.CONTACT_URI);    

        View view =
                inflater.inflate(R.layout.fragment_detail, container, false);    

        prenomTextView = (TextView) view.findViewById(R.id.firstNameTextView);
        nomTextView = (TextView) view.findViewById(R.id.lastNameTextView);
        emailTextView = (TextView) view.findViewById(R.id.emailTextView);
        typeTextView = (TextView) view.findViewById(R.id.typeTextView);

        getLoaderManager().initLoader(CONTACT_LOADER, null, this);
        return view;
    }    

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.menu_main, menu);
    }    

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_edit:
                listener.onEditContact(contactUri);
                return true;
            case R.id.action_delete:
                deleteContact();
                return true;
            case R.id.action_search:    
               searchContact();
                return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private void searchContact() {
        final EditText input = new EditText(getContext());

        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string.menuitem_recherche);
        builder.setMessage(R.string.label_lastName);
        builder.setView(input);

        builder.setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int whichButton) {
                String value = input.getText().toString();

                return;
            }
        });
        builder.setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                return;
            }
        });
        builder.create().show();    
    }

    private void deleteContact() {
        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string.confirm_title);
        builder.setMessage(R.string.confirm_message);
        builder.setPositiveButton(R.string.button_delete, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(
                        DialogInterface dialog, int button) {    

                    getActivity().getContentResolver().delete(
                            contactUri, null, null);
                    listener.onContactDeleted();  
                }
            }
        );
        builder.setNegativeButton(R.string.button_cancel, null);
        builder.create().show();  
      }


    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {

        CursorLoader cursorLoader;

        switch (id) {
            case CONTACT_LOADER:
                cursorLoader = new CursorLoader(getActivity(),
                        contactUri,  
                        null,  
                        null,  
                        null,  
                        null);  
                break;
            default:
                cursorLoader = null;
                break;
        }

        return cursorLoader;
    }


    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

        if (data != null && data.moveToFirst()) {

            int firstIndex = data.getColumnIndex(ContactsDatabaseDescription.Contact.COLUMN_FIRST_NAME);
            int lastIndex = data.getColumnIndex(ContactsDatabaseDescription.Contact.COLUMN_LAST_NAME);
            int emailIndex = data.getColumnIndex(ContactsDatabaseDescription.Contact.COLUMN_EMAIL);
            int typeIndex = data.getColumnIndex(ContactsDatabaseDescription.Contact.COLUMN_TYPE);

            prenomTextView.setText(data.getString(firstIndex));
            nomTextView.setText(data.getString(lastIndex));
            emailTextView.setText(data.getString(emailIndex));
            typeTextView.setText(data.getString(typeIndex));    
        }
    }    

    @Override
    public void onLoaderReset(Loader<Cursor> loader) { }
}

1 个答案:

答案 0 :(得分:0)

搜索表格中任何列的匹配很简单。您只需要查询的contentUri,where和whereArgs参数。确保你的Uri指向整个桌子。假设您要匹配名为&#34; first_name&#34;的列。和&#34;姓氏&#34;使用名为firstName和surname的字符串。

String where = "first_name =? and surname =?";
String[] whereArgs = {firstName, surname};

您可以使用括号和&#34;和&#34;和&#34;或&#34;构建更复杂的查询。使用数字字段,您可以使用&gt;和&lt;您必须确保whereArgs具有与&#34;?&#34;

一样多的元素