您的位置:首页 > 编程语言 > PHP开发

ContentProvider的使用(2)

2015-07-24 08:56 726 查看
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: