就给大家简单的讲解下本人对 ContentProvider内容提供者 与ContentResolver内容访问者的基础了解吧。
首先在SQLite3工具中,有可以添加或者查询的基础上,也就是把这个项目当做ContentProvider(内容提供者来使用)
也就是为了给ContentResolver(内容访问者)访问做相应的铺垫吧
步骤1:现在SQLite项目中新建一个包,包名随便然后建一个Class文件也就是下面这个类 同时继承ContentProvider重写其中的六个方法。
public class MyContentProvider extends ContentProvider {
private SQLiteDatabase db;
private UriMatcher uriMatcher;
@Override
public boolean onCreate() {
Log.i("test","onCreate");
//创建数据库
DbUtil dbUtil = new DbUtil(getContext(), "G150820.db", null, 2);
db = dbUtil.getReadableDatabase();
//实例化URI匹配器
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//添加规则
//0.1 查询所有
uriMatcher.addURI("com.example.g150820_sqlite666.PERSON","student",1);
//0.2 查询单个
uriMatcher.addURI("com.example.g150820_sqlite666.PERSON","student/#",2);
return false;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
//根据URi匹配器开始匹配uri
int code=uriMatcher.match(uri);
switch (code){
case 1:
//查询所有
Log.i("test","query所有");
//获取数据库中的所有数据
return db.query(false,"student",projection,selection,selectionArgs,null,null,sortOrder,null);
case 2:
//查询单个
//获取 #的值
long id= ContentUris.parseId(uri);
Log.i("test","query单个");
return db.rawQuery("select * from student where _id=?",new String[]{id+""});
}
return null;
}
@Nullable
@Override
public String getType(Uri uri) {
Log.i("test","getType");
return null;
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
Log.i("test","insert");
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
Log.i("test","delete");
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
Log.i("test","update");
return 0;
}
}
注意:记得写完新的类文件的时候记得配置清单文件(也就是AndroidManlfest.xml),如下。
android:authorities="com.example.g150820_sqlite666.PERSON"
android:name="provider.MyContentProvider"
android:exported="true"
>
authorities中配置的也就是SQLite中的包名,PERSON随意加
步骤2:新建一个ContentResolver内容者
直接上代码
public class MainActivity extends ListActivity{
private ContentResolver cr;
private EditText et_main_id;
private Uri uri;
private ListView listView;
private SQLiteDatabase sqLiteDatabase;
private Cursor cursor;
private SimpleCursorAdapter simpleCursorAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取内容访问者
cr = getContentResolver();
et_main_id = (EditText) findViewById(R.id.et_main_id);
//显示ListView数据
listView = getListView();
//创建数据库
DbUtil dbUtil = new DbUtil(this, "G150820.db", null, 2);
sqLiteDatabase = dbUtil.getReadableDatabase();
//查询所有的数据
// queryAll();
//Cursor 游标
//循环游标
//实例化适配器BaseAdapter
//把游标中的数据 全部给了List
//设置适配器
simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.item_list, cursor, new String[]{"_id", "name", "age"}, new int[]{R.id.tv_item_list_id, R.id.tv_item_list_name, R.id.tv_item_list_age});
listView.setAdapter(simpleCursorAdapter);
//给ListView设置长按事件
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView> adapterView, View view, int i, long l) {
LinearLayout root = (LinearLayout) view;
String id = ((TextView) root.findViewById(R.id.tv_item_list_id)).getText().toString();
String name = ((TextView) root.findViewById(R.id.tv_item_list_name)).getText().toString();
String age = ((TextView) root.findViewById(R.id.tv_item_list_age)).getText().toString();
final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
final AlertDialog alertDialog = builder.create();
//点击空白处,不取消对话框
alertDialog.setCancelable(false);
View v = View.inflate(MainActivity.this, R.layout.dialog_list, null);
TextView tv_dialog_list_id = (TextView) v.findViewById(R.id.tv_dialog_list_id);
EditText et_dialog_list_name = (EditText) v.findViewById(R.id.et_dialog_list_name);
EditText et_dialog_list_age = (EditText) v.findViewById(R.id.et_dialog_list_age);
((Button) v.findViewById(R.id.btn_dialog_list_ok)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "执行修改语句", Toast.LENGTH_SHORT).show();
// 关闭当前对话框
alertDialog.dismiss();
}
});
((Button) v.findViewById(R.id.btn_dialog_list_nook)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 关闭当前对话框
alertDialog.dismiss();
}
});
tv_dialog_list_id.setText("修改:" + id);
et_dialog_list_name.setText(name);
et_dialog_list_age.setText(age);
alertDialog.setView(v);
alertDialog.show();
return true;
}
});
}
public void getData(View view) {
//判断输入框的值是否为空
if (TextUtils.isEmpty(et_main_id.getText().toString())) {
//查询所有
//这里content是使用Uri匹配器必要的协议
uri = Uri.parse("content://com.example.g150820_sqlite666.PERSON/student");
} else {
//查询单个
//0.1直接query传参
//02.类似web http://localhost:8080/webProject/xxx.action?id=3
//0.3 Uri匹配器
String id = et_main_id.getText().toString();
uri = Uri.parse("content://com.example.g150820_sqlite666.PERSON/student/" + id);
}
Cursor cursor = cr.query(uri, null, null, null, null);
//SimleCursorAdapter(展示在ListView中的适配器)
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
Log.i("test", id + " " + name + " " + age);
//通知适配器发送变化
simpleCursorAdapter.changeCursor(cursor);
}
}
public void queryAll(String... str) {
String name = null;
int length = str.length;
if (length == 0) {
// Toast.makeText(MainActivity.this, "查询所有", Toast.LENGTH_SHORT).show();
//?,?
//下标 pageSize
//pageNum
//下标=(pageNum-1)*pageSize
cursor = sqLiteDatabase.rawQuery("select * from student limit ?,?", new String[]{2 + "", 2 + ""});
} else {
name = str[0];
Toast.makeText(MainActivity.this, "模糊查询:" + name, Toast.LENGTH_SHORT).show();
cursor = sqLiteDatabase.rawQuery("select * from student where name like ?", new String[]{"%" + name + "%"});
}
}
我这里用LIstActivity的原因就是调用系统自带的id,这里用到了两种查询也就是查询全部与查询单个
uri = Uri.parse("content://com.example.g150820_sqlite666.PERSON/student");
如果是else则是相反的查询的是单个
uri = Uri.parse("content://com.example.g150820_sqlite666.PERSON/student/" + id);
Uri匹配器中实例化步骤一已经说到了
//实例化URI匹配器
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
添加规则上面也说到了
uriMatcher.addURI("com.example.g150820_sqlite666.PERSON","student",1);
//0.2 查询单个
uriMatcher.addURI("com.example.g150820_sqlite666.PERSON","student/#",2);
总结:
总之不管是查询单个还是查询全部 都是调用了query中的方法 ,这样一来我们也可以实现MyContentProvider 中我们常用的增删改查了是吧,我这里是写的从SQLite中获取过来的数据展示在我ContentResolver内容访问者中并做了相应的长按删除,如果不需要的话可以跳过,大概就说到这里了吧 ,本人也是用自己的理解方式简述了 ContentProvider内容提供者 与ContentResolver内容访问者的粗略了解,有不当的或者不理解的地方还请多多见谅。