概述
1,ContentProvider 的使用 :
首先创建:server端(服务器端),他的作用是提供数据存储位置,以及提供接口给客户端进行数据操作;
提供一个数据库:
public class SqliteHelper extends SQLiteOpenHelper{
private static final String NAME="info.db";
private static final int VERSION =1;
public SqliteHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
public SqliteHelper(Context context) {
super(context, NAME, null, VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sql = "create table person(_id integer primary key,name varchar(16),age integer)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
if(newVersion !=oldVersion){
Log.i("==TAG==", "数据库版本发生改变。。。");
}
}
@Override
public void onOpen(SQLiteDatabase db) {
// TODO Auto-generated method stub
super.onOpen(db);
Log.i("==TAG==", "数据库被打开。。。");
}
}
之后自定义一个ContentProvider:
package org.qianfeng.contentprovider;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
public class MyContentProvider extends ContentProvider{
private SqliteHelper helper ;
private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int QUERY = 1;//查询的返回码
private static final int INSERT = 2;//插入的返回码
private static final int UPDATE = 3;//更新的返回码
private static final int DELETE = 4;//删除的返回码
static {
/**
* 第一个参数:当前contentprovider的权限设置
* 第二个参数:访问uri的地址
* 第三个参数:如果client端的uri访问当前的地址匹配时的返回码
*/
uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "query", QUERY);
uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "insert", INSERT);
uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "update", UPDATE);
uriMatcher.addURI("org.qianfeng.contentprovider.MyContentProvider", "delete", DELETE);
// String str ="content://org.qianfeng.contentprovider.MyContentProvider/query";
}
/**
* 提供给当前程序使用
* 当contentprovider创建时
系统回调方法
*/
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
//得到SqliteHelper对象
helper = new SqliteHelper(getContext());
return false;
}
/**
* 提供给客户端程序访问使用
*
* 作用:查询当前应用程序的数据
返回cursor对象
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
Cursor cursor = null;
if(uriMatcher.match(uri)==QUERY){
SQLiteDatabase db = helper.getWritableDatabase();
cursor=db.query("person", null, selection, selectionArgs, null, null, sortOrder);
}
return cursor;
}
/**
* 返回contentUri的类型
*/
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
/**
* 提供给客户端程序使用
*
* 作用:向当前应用程序添加数据 返回的是当前插入数据的row的uri对象
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
if(uriMatcher.match(uri)==INSERT){
SQLiteDatabase db
= helper.getWritableDatabase();
db.insert("person", null, values);
}
return null;
}
/**
* 提供给客户端程序使用
*
* 作用: 删除当前应用程序的数据
返回的是删除数据row的个数
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
int count =0;
if(uriMatcher.match(uri)==DELETE){
SQLiteDatabase db = helper.getWritableDatabase();
count=db.delete("person", selection, selectionArgs);
}
return count;
}
/**
* 提供给客户端程序使用
*
* 作用:更改当前应用程序的数据 返回的是更新数据row的个数
*/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
int count =0;
if(uriMatcher.match(uri)==UPDATE){
SQLiteDatabase db = helper.getWritableDatabase();
count =db.update("person", values, selection, selectionArgs);
}
return count;
}
}
当然了 ContentProvider是四大主键之一 所以需要注册:
<provider android:name="org.qianfeng.contentprovider.MyContentProvider"
android:authorities="org.qianfeng.contentprovider.MyContentProvider"
android:exported="true"
>
</provider>
这样 ContentProvider服务端就注册完成了;
2,之后我们写客户端(client端):
package org.qianfeng.contentproviderclient;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.Menu;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView lv;
private SimpleCursorAdapter adapter;
private ContentResolver contentResolver;
private static final String queryPath="content://org.qianfeng.contentprovider.MyContentProvider/query";
private static final String insertPath="content://org.qianfeng.contentprovider.MyContentProvider/insert";
private static final String updatePath="content://org.qianfeng.contentprovider.MyContentProvider/update";
private static final String detelePath="content://org.qianfeng.contentprovider.MyContentProvider/detele";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contentResolver = getContentResolver();
lv = (ListView) findViewById(R.id.lv);
Cursor cursor = contentResolver.query(Uri.parse(queryPath), null, null, null, null);
adapter = new SimpleCursorAdapter(MainActivity.this,
R.layout.item,
cursor,
new String[]{"name","age"},
new int []{R.id.textView1,R.id.textView2});
lv.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void onclick (View v){
switch (v.getId()) {
case R.id.btn_add:
insertData();
break;
case R.id.btn_update:
updateData();
break;
case R.id.btn_delete:
deleteData();
break;
case R.id.btn_query:
break;
default:
break;
}
}
public void insertData(){
ContentValues values = new ContentValues();
values.put("_id", 1);
values.put("name", "zhangsan");
values.put("age", 25);
contentResolver.insert(Uri.parse(insertPath), values);
values = new ContentValues();
values.put("_id", 2);
values.put("name", "lisi");
values.put("age", 33);
contentResolver.insert(Uri.parse(insertPath), values);
}
public void updateData(){
ContentValues values=new ContentValues();
values.put("name","赵四");
contentResolver.update(Uri.parse(updatePath), values,"_id=?", new String[]{1+""});
}
public void deleteData(){
int count=contentResolver.delete(Uri.parse(detelePath), "_id=?", new String[]{1+""});
if(count>0){
Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "删除失败", Toast.LENGTH_SHORT).show();
}
}
}
这样 就完成了一个自定义的ContentProvider;
最后
以上就是辛勤向日葵为你收集整理的ContentProvider的使用(2)的全部内容,希望文章能够帮你解决ContentProvider的使用(2)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复