本例中,对 表content://user_dictionary/words 的查询需要请求读取访问权限
即在manifest中添加
<uses-permission android:name="android.permission.READ_USER_DICTIONARY" />
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";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.btn_query).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//定义要查询的字段,相当于sql:select xx,xx,xx from tablexxString[] 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, //表的URImProjection, //要查询的字段,相当于sql:select xx,xx,xx from tablexxselectionClause, //查询条件,相当于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为空或提供程序引发异常,请在此处插入代码以报告错误。}}}});}
}