ContentResolver——查询数据(表)

 

本例中,对 表content://user_dictionary/words 的查询需要请求读取访问权限
即在manifest中添加
 

content://user_dictionary/words 是words表的uri(统一资源标识符),该表是Android系统提供的表,它的协定类是UserDictionary.Words。前缀content:// 表示是ContentProvider提供的数据

查询数据

以下代码仅仅是作为演示,实际开发中应该在单独的线程上,而不是界面线程中。

本例中contentResolver ---> 系统提供的contentProvider

package com.clc.app11;

import androidx.appcompat.app.AppCompatActivity;

import android.database.Cursor;
import android.os.Bundle;
import android.provider.UserDictionary;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.CursorAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class MainActivity extends AppCompatActivity {
    public static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btn_query).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //定义要查询的字段,相当于sql:select xx,xx,xx from tablexx
                String[] mProjection =
                        {
                                UserDictionary.Words._ID,    // 字段_ID的协定类常量
                                UserDictionary.Words.WORD,   // 字段word的协定类常量
                                UserDictionary.Words.LOCALE  // 字段locale的协定类常量
                        };

                //查询条件,相当于sql:where xx = ?,,,
                String selectionClause = null;

                //查询参数,填充到筛选条件对应?处
                String[] selectionArgs = {""};

                // 用户输入的内容
                String searchString = ((EditText)findViewById(R.id.edittext)).toString();

                if (TextUtils.isEmpty(searchString)) {
                    selectionClause = null;
                    selectionArgs[0] = null;
                } else {
                    // 采用占位符?,避免字符串拼接,防止sql注入
                    selectionClause = UserDictionary.Words.WORD + " = ?";
                    selectionArgs[0] = searchString;
                }

                //对表执行查询并返回cursor对象
                Cursor mCursor = getContentResolver().query(
                                    UserDictionary.Words.CONTENT_URI, //表的URI
                                    mProjection, //要查询的字段,相当于sql:select xx,xx,xx from tablexx
                                    selectionClause, //查询条件,相当于sql:where xx = ?,,,;如果为null,则查询所有
                                    selectionArgs, //查询参数,填充到筛选条件对应?处
                                    null);//排序条件,相当于sql:order by xx;为null不额外排序

                //如果发生错误,一些provider返回null,其他provider则抛出异常
                if (null == mCursor) {
                    /*
                     * 在此处插入代码以处理错误。请不要使用cursor!
                     * 您可能需要调用android.util.Log.e()来记录此错误。
                     */
                    Log.d(TAG, "onClick: null,exception");

                //如果cursor为空,则provider找不到匹配项
                } else if (mCursor.getCount() < 1) {
                    /*
                     *在此处插入代码以通知用户搜索失败
                     *这不一定是个错误。您可能希望向用户提供插入新行或重新键入搜索词的选项。
                     */
                    Log.d(TAG, "onClick: count<1,empty,no match");

                } else {
                    // 在此处插入代码以对结果执行某些操作
                    Log.d(TAG, "onClick: query ok and get data");


                    //————————————————————————————————————————————————————————————————————————————————————
                    /*
                    显示查询结果
                     */
                    String[] wordListColumns =
                            {
                                    UserDictionary.Words.WORD,   // 字段word的协定类常量
                                    UserDictionary.Words.LOCALE  // 字段locale的协定类常量
                            };

                    int[] wordListItems = { R.id.dictWord, R.id.locale};

                    CursorAdapter cursorAdapter = new SimpleCursorAdapter(
                                                        getApplicationContext(), // 应用程序的上下文对象
                                                        R.layout.wordlistrow,  // ListView中一行的XML布局
                                                        mCursor, // 查询的结果
                                                        wordListColumns, // cursor中列名的字符串数组
                                                        wordListItems,  // 行布局中视图id数组
                                                        0); // 标志(通常不需要)

                    ListView listView = findViewById(R.id.listview);
                    listView.setAdapter(cursorAdapter);


                    //————————————————————————————————————————————————————————————————————————————————————
                    /*
                    获取查询结果
                     */
                    if (mCursor != null) {
                        /*
                         *移动到光标的下一行。在光标第一次移动之前,“行指针”是-1,如果您尝试在该位置检索数据,将得到一个异常。
                         */
                        while (mCursor.moveToNext()) {

                            // 确定名为“word”的列的索引值
                            int index = mCursor.getColumnIndex(UserDictionary.Words.WORD);
                            // 从列中获取值。
                            String newWord = mCursor.getString(index);

                            // 处理得到的结果
                        }
                    } else {
                        // 如果cursor为空或提供程序引发异常,请在此处插入代码以报告错误。
                    }


                }
            }
        });
    }
}

你可能感兴趣的:(Android)