[英]Unable to get provider
I have problem with getting the provider. 我在获取提供者时遇到问题。 I search for an answer but still i can't have the right answer.
我在寻找答案,但仍然找不到正确的答案。 Please help me with this.
请帮我解决一下这个。 Here is my manifest:
这是我的清单:
<?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>
My Database 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;
}
}
Here is the Logcat: 这是Logcat:
02-12 06:00:42.041: E/AndroidRuntime(1245): java.lang.RuntimeException: Unable to get provider com.ultramegatech.ey.provider: java.lang.ClassNotFoundException: Didn't find class "com.ultramegatech.ey.provider" on path: DexPathList[[zip file "/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 andro
02-12 06:00:42.041:E / AndroidRuntime(1245):java.lang.RuntimeException:无法获取提供者com.ultramegatech.ey.provider: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):位于android.app.ActivityThread.installProvider(ActivityThread.java:4774)02-12 06:00:42.041:E / AndroidRuntime(1245) :位于android.app.ActivityThread.installContentProviders(ActivityThread.java:4366)02-12 06:00:42.041:E / AndroidRuntime(1245):位于android.app.ActivityThread.handleBindApplication(ActivityThread.java:4306)02-12 06:00:42.041:E / AndroidRuntime(1245):在android.app.ActivityThread.access $ 1400(ActivityThread.java:135)02-12 06:00:42.041:E / AndroidRuntime(1245):在android.app。 ActivityThread $ H.handleMessage(ActivityThread.java:1457)02-12 06:00:42.041:E / AndroidRuntime(1245):在Andro id.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(Native Method) 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 06:00:42.041: E/AndroidRuntime(1245): at dalvik.system.NativeStart.main(Native Method) 02-12 06:00:42.041: E/AndroidRuntime(1245): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.ultramegatech.ey.provider" on path: DexPathList[[zip file "/data/app/com.ultramegatech.ey-1.apk"],nativeLibraryDirectories=[
id.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):位于android.app.ActivityThread.main(ActivityThread.java:4998)02-12 06:00:42.041:E / AndroidRuntime(1245):位于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):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:777)02-12 06:00:42.041:E / AndroidRuntime(1245):在com.android.internal.os .ZygoteInit.main(ZygoteInit.java:593)02-12 06:00:42.041:E / AndroidRuntime(1245):在dalvik.system.NativeStart.main(本机方法)02-12 06:00:42.041:E / AndroidRuntime(1245):由以下原因引起:java.lang.ClassNotFoundException:在路径:DexPathList [[zip file“ /data/app/com.ultramegatech.ey-1]上找不到类” com.ultramegatech.ey.provider“。 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): at android.app.ActivityThread.installProvider(ActivityThread.java:4759) 02-12 06:00:42.041: E/AndroidRuntime(1245): ... 12 more 02-12 06:00:54.471: I/Process(1245): Sending signal.
/data/app-lib/com.ultramegatech.ey-1,/system/lib]] 12-12 06:00:42.041:E / AndroidRuntime(1245):在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):at android.app.ActivityThread.installProvider(ActivityThread.java:4759)02-12 06: 00:42.041:E / AndroidRuntime(1245):... 12 more 02-12 06:00:54.471:I / Process(1245):正在发送信号。 PID: 1245 SIG: 9
PID:1245 SIG:9
My .sql is on the raw folder if it has regards with the problem. 如果有问题,我的.sql位于原始文件夹中。 I just get the code in gitHub and i will modify it for my thesis.
我只是在gitHub中获取代码,我将根据自己的论文对其进行修改。 Thanks and your answers will be much appreciated.
谢谢,您的回答将不胜感激。 Thanks in advance!
提前致谢!
The issue lies in below 2 lines : 问题在于以下两行:
android:name="com.ultramegatech.ey.provider"
android:authorities="com.ultramegatech.ey.provider.ElementsProvider"
they should be the other way around : 他们应该反过来:
android:name="com.ultramegatech.ey.provider.ElementsProvider"
android:authorities="com.ultramegatech.ey.provider"
Also change the authority
in the provider class. 还要更改提供程序类中的
authority
。 The android:name
should point to the class name and not just the package. android:name
应该指向类名,而不仅仅是包。 The authority
can be the package name or anything else. authority
可以是程序包名称或其他任何名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.