2016-02-12 2 views
0

У меня проблема с получением провайдера. Я ищу ответ, но все же у меня нет правильного ответа. Пожалуйста, помогите мне с этим. Вот мой манифест:Не удается получить провайдера

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
package="com.ultramegatech.ey" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:versionCode="1" 
android:versionName="1.0"> 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="19" /> 

<uses-permission android:name="android.permission.VIBRATE" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    android:theme="@style/LightTheme"> 
    <provider 
     android:name="com.ultramegatech.ey.provider.ElementsProvider" 
     android:authorities="com.ultramegatech.ey.provider" 
     android:multiprocess="true" 
     android:exported="false" /> 

    <activity 
     android:name="PeriodicTableActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="landscape" 
     android:theme="@style/LightTheme.NoTitleBar"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="ElementListActivity" 
     android:label="@string/titleElementList" /> 
    <activity 
     android:name="ElementDetailsActivity" 
     android:label="@string/app_name" /> 
    <activity 
     android:name="EyPreferenceActivity" 
     android:label="@string/titlePreferences" /> 
</application> 
</manifest> 

Моя база данных Provider

package com.ultramegatech.ey.provider; 

import android.content.ContentProvider; 
import android.content.ContentUris; 
import android.content.ContentValues; 
import android.content.UriMatcher; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteQueryBuilder; 
import android.net.Uri; 

/** 
* ContentProvider for accessing the chemical element database. 
* 
* @author Steve Guidetti 
*/ 
public class ElementsProvider extends ContentProvider { 
/* Provider authority */ 

public static final String AUTHORITY = "com.ultramegatech.ey.provider"; 

/* Uri matcher ids */ 
private static final int ELEMENTS = 1; 
private static final int ELEMENTS_ID = 2; 
private static final int ELEMENTS_NUMBER = 3; 
private static final int ELEMENTS_SYMBOL = 4; 
private static final int ELEMENTS_FILTER = 5; 

/* Uri matcher */ 
private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 
static { 
    sUriMatcher.addURI(AUTHORITY, "elements", ELEMENTS); 
    sUriMatcher.addURI(AUTHORITY, "elements/#", ELEMENTS_ID); 
    sUriMatcher.addURI(AUTHORITY, "elements/n/#", ELEMENTS_NUMBER); 
    sUriMatcher.addURI(AUTHORITY, "elements/s/*", ELEMENTS_SYMBOL); 
    sUriMatcher.addURI(AUTHORITY, "elements/filter/*", ELEMENTS_FILTER); 
} 

/* SQLiteOpenHelper */ 
private DatabaseOpenHelper mDatabaseOpenHelper; 

@Override 
public boolean onCreate() { 
    mDatabaseOpenHelper = new DatabaseOpenHelper(getContext()); 
    return true; 
} 

@Override 
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 
     String sortOrder) { 
    final SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 
    switch(sUriMatcher.match(uri)) { 
     case ELEMENTS: 
      qb.setTables(Elements.TABLE_NAME); 
      break; 
     case ELEMENTS_ID: 
      qb.setTables(Elements.TABLE_NAME); 
      qb.appendWhere(Elements._ID + " = " + uri.getLastPathSegment()); 
      break; 
     case ELEMENTS_NUMBER: 
      qb.setTables(Elements.TABLE_NAME); 
      qb.appendWhere(Elements.NUMBER + " = " + uri.getLastPathSegment()); 
      break; 
     case ELEMENTS_SYMBOL: 
      qb.setTables(Elements.TABLE_NAME); 
      qb.appendWhere(Elements.SYMBOL + " = "); 
      qb.appendWhereEscapeString(uri.getLastPathSegment()); 
      break; 
     case ELEMENTS_FILTER: 
      qb.setTables(Elements.TABLE_NAME); 
      qb.appendWhere(Elements.NAME + " LIKE "); 
      qb.appendWhereEscapeString(uri.getLastPathSegment() + "%"); 
      qb.appendWhere(" OR " + Elements.SYMBOL + " LIKE "); 
      qb.appendWhereEscapeString(uri.getLastPathSegment() + "%"); 
      break; 
     default: 
      throw new IllegalArgumentException("Invalid URI: " + uri.toString()); 
    } 

    final SQLiteDatabase db = mDatabaseOpenHelper.getReadableDatabase(); 
    final Cursor cursor = qb.query(db, projection, selection, selectionArgs, null, null, 
      sortOrder); 
    cursor.setNotificationUri(getContext().getContentResolver(), uri); 
    return cursor; 
} 

@Override 
public String getType(Uri uri) { 
    switch(sUriMatcher.match(uri)) { 
     case ELEMENTS: 
     case ELEMENTS_FILTER: 
      return Elements.DATA_TYPE; 
     case ELEMENTS_ID: 
     case ELEMENTS_NUMBER: 
     case ELEMENTS_SYMBOL: 
      return Elements.DATA_TYPE_ITEM; 
     default: 
      return null; 
    } 
} 

@Override 
public Uri insert(Uri uri, ContentValues values) { 
    String table; 
    switch(sUriMatcher.match(uri)) { 
     case ELEMENTS: 
      table = Elements.TABLE_NAME; 
      break; 
     default: 
      throw new IllegalArgumentException("Invalid URI"); 
    } 

    final SQLiteDatabase db = mDatabaseOpenHelper.getWritableDatabase(); 
    final long rowId = db.insert(table, null, values); 
    if(rowId > 0) { 
     getContext().getContentResolver().notifyChange(uri, null); 
     return ContentUris.withAppendedId(uri, rowId); 
    } 

    throw new SQLException("Failed to insert row into " + uri.toString()); 
} 

@Override 
public int delete(Uri uri, String selection, String[] selectionArgs) { 
    String table; 
    switch(sUriMatcher.match(uri)) { 
     case ELEMENTS: 
      table = Elements.TABLE_NAME; 
      break; 
     case ELEMENTS_ID: 
      table = Elements.TABLE_NAME; 
      final String id = uri.getLastPathSegment(); 
      if(selection == null) { 
       selection = Elements._ID + " = " + id; 
      } else { 
       selection += " AND " + Elements._ID + " = " + id; 
      } 
      break; 
     case ELEMENTS_NUMBER: 
      table = Elements.TABLE_NAME; 
      final String number = uri.getLastPathSegment(); 
      if(selection == null) { 
       selection = Elements.NUMBER + " = " + number; 
      } else { 
       selection += " AND " + Elements.NUMBER + " = " + number; 
      } 
      break; 
     default: 
      throw new IllegalArgumentException("Invalid URI"); 
    } 

    final SQLiteDatabase db = mDatabaseOpenHelper.getWritableDatabase(); 
    final int rowsAffected = db.delete(table, selection, selectionArgs); 
    getContext().getContentResolver().notifyChange(uri, null); 
    return rowsAffected; 
} 

@Override 
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 
    String table; 
    switch(sUriMatcher.match(uri)) { 
     case ELEMENTS: 
      table = Elements.TABLE_NAME; 
      break; 
     case ELEMENTS_ID: 
      table = Elements.TABLE_NAME; 
      final String id = uri.getLastPathSegment(); 
      if(selection == null) { 
       selection = Elements._ID + " = " + id; 
      } else { 
       selection += " AND " + Elements._ID + " = " + id; 
      } 
      break; 
     case ELEMENTS_NUMBER: 
      table = Elements.TABLE_NAME; 
      final String number = uri.getLastPathSegment(); 
      if(selection == null) { 
       selection = Elements.NUMBER + " = " + number; 
      } else { 
       selection += " AND " + Elements.NUMBER + " = " + number; 
      } 
      break; 
     default: 
      throw new IllegalArgumentException("Invalid URI"); 
    } 

    final SQLiteDatabase db = mDatabaseOpenHelper.getWritableDatabase(); 
    final int rowsAffected = db.update(table, values, selection, selectionArgs); 
    getContext().getContentResolver().notifyChange(uri, null); 
    return rowsAffected; 
} 
} 

Вот Logcat:

02-12 06: 00: 42,041: E/AndroidRuntime (1245): java.lang.RuntimeException: невозможно получить провайдера com.ultramegatech.ey.provider: java.lang.ClassNotFoundException: Не нашел класс "com.ultramegatech.ey.pro vider "по пути: DexPathList [[zip-файл " /data/app/com.ultramegatech.ey-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.ultramegatech.ey-1, /system/lib]] 02-12 06: 00: 42.041: E/AndroidRuntime (1245): at android.app.ActivityThread.installProvider (ActivityThread.java:4774) 02-12 06: 00: 42.041: E/AndroidRuntime (1245): at android.app.ActivityThread.installContentProviders (ActivityThread.java:4366) 02-12 06: 00: 42.041: E/AndroidRuntime (1245): at android.app.ActivityThread.handleBindApplication (ActivityThread.java:4306) 02-12 06: 00: 42.041: E/AndroidRuntime (1245): at android.app.ActivityThread.access $ 1400 (ActivityThread.java:135) 02-12 06: 00: 42.041: E/AndroidRuntime (1245) : at android.app.ActivityThread $ H.handleMessage (ActivityThread.java: 1457) 02-12 06: 00: 42.041: E/AndroidRuntime (1245): at android.os.Handler.dispatchMessage (Handler.java:102) 02-12 06: 00: 42.041: E/AndroidRuntime (1245) : at android.os.Looper.loop (Looper.java:137) 02-12 06: 00: 42.041: E/AndroidRuntime (1245): at android.app.ActivityThread.main (ActivityThread.java:4998) 02 -12 06: 00: 42.041: E/AndroidRuntime (1245): at java.lang.reflect.Method.invokeNative (собственный метод) 02-12 06: 00: 42.041: E/AndroidRuntime (1245): at java.lang .reflect.Method.invoke (Method.java:515) 02-12 06: 00: 42.041: E/AndroidRuntime (1245): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:777) 02-12 06: 00: 42.041: E/AndroidRuntime (1245): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:593) 02-12 0 6: 00: 42.041: E/AndroidRuntime (1245): at dalvik.system.NativeStart.main (родной метод) 02-12 06: 00: 42.041: E/AndroidRuntime (1245): вызвано: java.lang.ClassNotFoundException : Не нашел класс "com.ultramegatech.ey.provider" по пути: DexPathList [[zip-файл "/data/app/com.ultramegatech.ey-1.apk"],nativeLibraryDirectories=[/data/app -lib/com.ultramegatech.ey-1, /system/lib]] 02-12 06: 00: 42.041: E/AndroidRuntime (1245): at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:56) 02-12 06: 00: 42.041: E/AndroidRuntime (1245): at java.lang.ClassLoader.loadClass (ClassLoader.java:497) 02-12 06: 00: 42.041: E/AndroidRuntime (1245): at java.lang.ClassLoader.loadClass (ClassLoader.java:457) 02-12 06: 00: 42.041: E/AndroidRuntime (1245): a t android.app.ActivityThread.installProvider (ActivityThread.java:4759) 02-12 06: 00: 42.041: E/AndroidRuntime (1245): ... 12 далее 02-12 06: 00: 54.471: I/Process (1245): сигнал отправки. PID: 1245 SIG: 9

My .sql находится в папке с исходными текстами, если он имеет отношение к проблеме. Я только что получил код в gitHub, и я изменю его для моей диссертации. Спасибо, и ваши ответы будут высоко оценены. Заранее спасибо!

ответ

0

Проблема заключается в ниже 2 линии:

android:name="com.ultramegatech.ey.provider" 
    android:authorities="com.ultramegatech.ey.provider.ElementsProvider" 

они должны быть наоборот:

android:name="com.ultramegatech.ey.provider.ElementsProvider" 
android:authorities="com.ultramegatech.ey.provider" 

изменить также authority в классе поставщика. android:name должен указывать на имя класса, а не только на пакет. authority может быть именем пакета или чем-либо еще.

+0

Я сделал это, но все же это не сработало. Что не так? Благодарим за дополнительную информацию. Бог благословил. –

+0

Я вижу, что вы обновили код и журналы в вопросе на основе этого. Но ошибка в журнале все еще говорит: «Не нашел класс« com.ultramegatech.ey.provider ». (Я предполагаю, что вы уже пробовали чистую сборку). Его по-прежнему не ищет ElementsProvider, но пакет как имя класса – RocketRandom

+0

Да. ,. Я сделал то, что вы сказали, но это не сработало. Что я могу сделать? Большое спасибо за ваш ответ. Было бы очень полезно. Спасибо .. Непосредственный ответ будет высоко оценен. –

Смежные вопросы