Uri uri = Uri.parse("content://com.example.AccountProvider/query");
parse就有解析的意思
content://相当于http://
com.example.AccountProvider 相当于域名
/query 相当于域名下的具体应用路径
package com.example.readotherdatabase;
import android.support.v7.app.ActionBarActivity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//通过上下文获取内容解析者获得其他进程的数据库
Uri uri = Uri.parse("content://com.example.AccountProvider/query");
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
System.out.println("获取contentprovidertest的数据库");
if(cursor!=null&&cursor.getCount()>0){
while (cursor.moveToNext()) {
String name=cursor.getString(1);
String pass=cursor.getString(2);
System.out.println(name+"~~~~~~"+pass);
}
}
}
}
package com.example.contextprovidertest;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
public class AccountProvider extends ContentProvider {
private MyOpenHelper dbHelper;
//定义一个uriMatcher路径匹配器
//uri就是自己给路径取的别名,可以自己任意命名
//路径匹配器顾名思义,就是根据路径调用不同的方法
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int QUERYSUCCESS = 0;
//定义静态代码块创建匹配规则,静态代码块创建类时就运行,而且只运行一次
static{
//第一个参数auhtority:com.example.AccountProvider必须和清单文件配置的一样,相当于域名
//第二个参数也自己任意写个字符串,调用者也许是用这个判断,具体调用那个方法,相当于一个页面不是很恰当意思差不多
// QUERYSUCCESS如果调用者的uri匹配成功就返回定义的这个常量,说明匹配成功
sURIMatcher.addURI("com.example.AccountProvider", "query", QUERYSUCCESS);
}
//oncreate方法会首先被自动执行,加载时就要执行
@Override
public boolean onCreate() {
//getContext() contentProvier里面获取上下文
dbHelper=new MyOpenHelper(getContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~内容提供者query方法~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
//query方法是给其它程序调用的,这里面调用者传的参数uri里面也有个code码,然后匹配出来,看这是哪个匹配码,根据匹配码判断执行
int code = sURIMatcher.match(uri);
if(code==QUERYSUCCESS){
System.out.println("路径匹配成功");
//匹配成功就执行query对数据库进行查询操作
//拿到数据库对象
SQLiteDatabase db = dbHelper.getReadableDatabase();
//操作数据库
//projection查询的列
Cursor cursor = db.query("info", projection, selection, selectionArgs, null, null, sortOrder);
return cursor;
}else{
throw new IllegalArgumentException("参数不匹配");
}
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.contextprovidertest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name="com.example.contextprovidertest.AccountProvider"
android:authorities="com.example.AccountProvider">
</provider>
</application>
</manifest>