声明:Server指的是提供数据库的应用,Client指的是使用数据库的应用
权限:如果Server的Provider标签没有加入任何权限,那么CLient不用声明任何权限,就是可以操作Server数据
如果Server的Provider标签加入了权限,那么CLient必须声明权限,才可以操作Server数据,而且在Client的权限中<permission> 和<use-permission>都要加上
下面上核心代码:
首先是Server的代码
DataBaseHelper.java
package com.example.contentproviderserver;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper{
private final static String NAME = "test_db";
private String CREATE_TALBE1="create table table1(id INTEGER PRIMARY KEY AUTOINCREMENT,data varchar(20));";
private String CREATE_TALBE2="create table table2(id2 int,data1 varchar(20));";
public DatabaseHelper(Context context) {
super(context, NAME, null, 1);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(CREATE_TALBE1);
db.execSQL(CREATE_TALBE2);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
@Override
public SQLiteDatabase getReadableDatabase() {
// TODO Auto-generated method stub
return super.getReadableDatabase();
}
@Override
public SQLiteDatabase getWritableDatabase() {
// TODO Auto-generated method stub
return super.getWritableDatabase();
}
}
上面代码不做讲解,如果不明白,就去看一下sqlite数据库的知识。
MyProvider.java
package com.example.contentproviderserver;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;
public class MyProvider extends ContentProvider {
private static final UriMatcher sUriMatcher;
private DatabaseHelper mDatabaseHelper;
private String TAG="MyProvider";
static {
sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sUriMatcher.addURI("com.test.provider", "table1", 1);
sUriMatcher.addURI("com.test.provider", "table1/#", 11);
sUriMatcher.addURI("com.test.provider", "table2", 2);
sUriMatcher.addURI("com.test.provider", "table2/#", 22);
//如果有其他的表 可以继续增加。。。
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
int code;
code = sUriMatcher.match(uri);
SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
switch (code) {
case 1:
db.delete("table1", selection, selectionArgs);
break;
case 2:
db.delete("table2", selection, selectionArgs);
break;
case 11:
Log.i(TAG, "匹配了单行。。。");
db.delete("table1", selection, selectionArgs);
break;
case 22:
db.delete("table2", selection, selectionArgs);
break;
}
return 0;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
switch (sUriMatcher.match(uri)) {
case 1:
case 2:
return "vnd.android.cursor.dir/provider"; //匹配整张表
case 11:
case 22:
return "vnd.android.cursor.item/provider"; //匹配单行,个人感觉比较鸡肋。一般不匹配单行,除非效率要求很高
default:
return "error";
}
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
int code;
code = sUriMatcher.match(uri);
SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
long rowID;
Log.i(TAG, "insert code--->"+code);
switch (code) {
case 1:
rowID=db.insert("table1", null, values);
if(rowID<0){
Log.i(TAG, "插入失败");
}else{
Uri rowUri = ContentUris.withAppendedId(uri, rowID);
getContext().getContentResolver().notifyChange(rowUri, null);
return rowUri;
}
break;
case 2:
rowID=db.insert("table2", null, values);
if(rowID<0){
Log.i(TAG, "插入失败");
}else{
Uri rowUri = ContentUris.withAppendedId(uri, rowID);
getContext().getContentResolver().notifyChange(rowUri, null);
return rowUri;
}
break;
case 11:
// db.insert("table1", null, values);
break;
case 22:
// db.insert("table2", null, values);
break;
}
return null;
}
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
mDatabaseHelper = new DatabaseHelper(getContext());
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
}
这里使用了UriMather来匹配Uri找到指定的表,从而操作表。。
Manifest.xml
在<application>标签内部加入
<provider
android:name="com.example.contentproviderserver.MyProvider"
android:authorities="com.test.provider"
android:readPermission="com.myprovider.read"
android:writePermission="com.myprovider.write"
android:enabled="true" >
</provider>
好了 ,Server代码完毕。。
Client代码
MainActivity.java
package com.example.contentproviderclient;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener{
Button bt1;
Button bt2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt1=(Button)findViewById(R.id.bt1);
bt2=(Button)findViewById(R.id.bt2);
bt1.setOnClickListener(this);
bt2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int id = v.getId();
switch(id){
case R.id.bt1:
ContentValues cv = new ContentValues();
cv.put("data", "我爱你");
getContentResolver().insert(Uri.parse("content://com.test.provider/table1"),cv);
break;
case R.id.bt2:
ContentValues cv1 = new ContentValues();
cv1.put("data1", "我爱你");
getContentResolver().insert(Uri.parse("content://com.test.provider/table2"),cv1);
break;
}
}
}
Manifest.xml
<uses-permission android:name="com.myprovider.write" />
<uses-permission android:name="com.myprovider.read" />
<permission android:name="com.myprovider.write" />
<permission android:name="com.myprovider.read" />
这四个标签缺一不可。
很简单,用一个ContentValues来组装数据,从而操作,这里只是举了插入的例子,关于查找,删除的例子,可以自己测试。
欢迎交流,转载请注明出处。谢谢
完整源码下载地址:http://download.youkuaiyun.com/detail/suixiang888/5952209