A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈莹 中级黑马   /  2012-12-11 23:54  /  1046 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈莹 于 2012-12-12 00:02 编辑

我的程序一直报错Failed to find provider info for com.sharpandroid.provider.personprovider,就是找不到provider
谁能帮我看一下程序错在哪?
有一个PersonProvider,用于提供person表中数据的共享
  1. package com.sharpandroid.activity;

  2. import android.content.ContentProvider;
  3. import android.content.ContentUris;
  4. import android.content.ContentValues;
  5. import android.content.UriMatcher;
  6. import android.database.Cursor;
  7. import android.database.sqlite.SQLiteDatabase;
  8. import android.net.Uri;

  9. import com.sharpandroid.activity.dao.DBHelper;

  10. public class PersonProvider extends ContentProvider {
  11.         private DBHelper dbHelper;
  12.         //路径的识别器 UriMatcher
  13.         private static final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);//UriMatcher.NO_MATCH表示不匹配的话返回的码 -1
  14.         private static final int PERSONS = 1;
  15.         private static final int PERSON = 2;
  16.         static{
  17.                 //为UriMatcher对象添加需要匹配的路径
  18.                 matcher.addURI("com.sharpandroid.provider.personprovider", "person", PERSONS);
  19.                 matcher.addURI("com.sharpandroid.provider.personprovider", "person/#", PERSON);
  20.         }
  21.         
  22.         
  23.         //onCreate方法在ContentProvider创建后就会被调用
  24.         @Override
  25.         public boolean onCreate() {
  26.                 //实例化dbHelper
  27.                 dbHelper = new DBHelper(this.getContext());
  28.                 return true;
  29.         }

  30.         @Override
  31.         public Cursor query(Uri uri, String[] projection, String selection,
  32.                         String[] selectionArgs, String sortOrder) {
  33.                 SQLiteDatabase db = dbHelper.getReadableDatabase();
  34.                 switch(matcher.match(uri)){
  35.                 case PERSONS:
  36.                         //查询数据库中所有的数据
  37.                         return db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
  38.                 case PERSON:
  39.                         //查询数据库中特定的数据
  40.                         //从Uri中提取id
  41.                         long id = ContentUris.parseId(uri);
  42.                         //创建查询条件
  43.                         String whereClause = "personid="+id;
  44.                         if(selection!=null&&!"".equals(selection.trim())){
  45.                                 whereClause += "and"+selection;
  46.                         }
  47.                         return db.query("person", projection, whereClause, selectionArgs, null, null, null);
  48.                 default:
  49.                         throw new IllegalArgumentException("Unknow Uri"+uri);
  50.                 }
  51.         }

  52.         @Override
  53.         public String getType(Uri uri) {
  54.                 return null;
  55.         }

  56.         @Override
  57.         public Uri insert(Uri uri, ContentValues values) {
  58.                 return null;
  59.         }

  60.         @Override
  61.         public int delete(Uri uri, String selection, String[] selectionArgs) {
  62.                 return 0;
  63.         }

  64.         @Override
  65.         public int update(Uri uri, ContentValues values, String selection,
  66.                         String[] selectionArgs) {
  67.                 return 0;
  68.         }

  69. }
复制代码
然后在配置文件中已经配置了该provider
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.       package="com.sharpandroid.activity"
  4.       android:versionCode="1"
  5.       android:versionName="1.0">
  6.     <uses-sdk android:minSdkVersion="10" />

  7.     <application android:icon="@drawable/icon" android:label="@string/app_name">
  8.         <uses-library android:name="android.test.runner"/>
  9.         <activity android:name=".PersonActivity"
  10.                   android:label="@string/app_name">
  11.             <intent-filter>
  12.                 <action android:name="android.intent.action.MAIN" />
  13.                 <category android:name="android.intent.category.LAUNCHER" />
  14.             </intent-filter>
  15.         </activity>
  16.                 <!-- 配置ContentProvider -->
  17.                 <provider
  18.                         android:name=".PersonProvider"
  19.                         android:authorities="com.sharpandroid.provider.personprovider"/>
  20.                
  21.     </application>
  22.     <instrumentation
  23.             android:name="android.test.InstrumentationTestRunner"
  24.             android:targetPackage="com.sharpandroid.activity"
  25.             android:label="Tests for My App">
  26.     </instrumentation>
  27. </manifest>
复制代码
然后我又创建了一个应用程序,通过测试代码访问该provider
  1. package com.example.other;

  2. import android.content.ContentResolver;
  3. import android.database.Cursor;
  4. import android.net.Uri;
  5. import android.test.AndroidTestCase;
  6. import android.util.Log;
  7. /**
  8. * AccessContentProvider可以对PersonProvider中的数据进行操作时,
  9. * 可以使用ContentResolver类完成
  10. * @author Administrator
  11. *
  12. */
  13. public class AccessContentProvider extends AndroidTestCase {
  14.         private static final String TAG = "AccessContentProvider";
  15.         public void testQuery()throws Exception{
  16.                 //获取ContentResolver对象
  17.                 ContentResolver resolver = this.getContext().getContentResolver();
  18.                 //定义Uri,查询所有的记录
  19.                 Uri uri = Uri.parse("content://com.sharpandroid.provider.personprovider/person");
  20.                 Cursor cursor = resolver.query(uri, null, null, null, null);
  21.                 while(cursor.moveToNext()){
  22.                         int id = cursor.getInt(cursor.getColumnIndex("personid"));
  23.                         String name = cursor.getString(cursor.getColumnIndex("name"));
  24.                         int age = cursor.getInt(cursor.getColumnIndex("age"));
  25.                         //显示查询结果
  26.                         Log.i(TAG, id+":"+name+":"+age);
  27.                 }
  28.                 //关闭游标
  29.                 cursor.close();
  30.         }
  31. }
复制代码
单元测试并不通过,出现上面所说的异常。那位大侠能帮我看看啊?感激不尽!!


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马