无法获取提供程序(ClassNotFoundException)Xamarin

时间:2017-07-13 07:37:21

标签: c# xamarin visual-studio-2015 xamarin.android android-database

我正在开发一个Xamarin解决方案,其中包含至少4个不同的Android应用程序。

我的目标是为所有这四个应用创建共享内容提供商,以便我可以在一个位置拥有主数据(如果应用程序更新该数据,我可以在另一个应用程序中获得更新版本)。

在Visual Studio中,我创建了一个PCL项目,我在其中定义了内容提供程序(我可以在所有应用程序中引用它并执行CRUD操作)。

我的内容提供商如下:

namespace com.cybertron.android.Provider
{
    public class SectionProvider : ContentProvider
    {
        SectionDatabase sectDb;
        public const string AUTHORITY = "com.cybertron.android.Provider.SectionProvider";
        public const string SECTIONS_MIME_TYPE = ContentResolver.CursorDirBaseType + "/vnd.com.cybertron.android.sections";
        public const string SECTION_MIME_TYPE = ContentResolver.CursorItemBaseType + "/vnd.com.cybertron.android.section";
        static string BASE_PATH = "sections";
        static UriMatcher uriMatcher = BuildUriMatcher();
        public static readonly Android.Net.Uri CONTENT_URI = Android.Net.Uri.Parse("content://" + AUTHORITY + "/" + BASE_PATH);
        const int GET_ALL = 0;
        const int GET_ONE = 1;
        public static class SectionConsts
        {
            public const string SectNo = "SectNo";
            public const string KeyPos = "Key";
            public const string Date = "Date";
            public const string UnitID = "UnitID";
        }

        static UriMatcher BuildUriMatcher()
        {
            var matcher = new UriMatcher(UriMatcher.NoMatch);

            matcher.AddURI(AUTHORITY, BASE_PATH, GET_ALL); 
            matcher.AddURI(AUTHORITY, BASE_PATH + "/#", GET_ONE);
            return matcher;
        }
        public override bool OnCreate()
        {
            sectDb = new SectionDatabase(Context);
            return true;
        }        

        public override string GetType(Android.Net.Uri uri)
        {
            switch (uriMatcher.Match(uri))
            {
                case GET_ALL:
                    return SECTIONS_MIME_TYPE; // list
                case GET_ONE:
                    return SECTION_MIME_TYPE; // single item
                default:
                    throw new Java.Lang.IllegalArgumentException("Unknown Uri: " + uri);
            }
        } 
.
.
.        
    }
}

我在我的Xamarin应用程序项目中引用了我的项目。我没有放置ContentProvider属性,因为我知道如果两个应用程序使用相同的属性,则会发出INSALL_FAILED_CONFLICT错误。相反,我把它放在清单文件中如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
                package="com.cybertron.android.bluecork"
                android:versionCode="1" android:versionName="1.0">
  <uses-sdk android:minSdkVersion="16" />
  <application android:label="com.cybertron.android.bluecork.blueapp">
    <provider
          android:name="com.cybertron.android.Provider.SectionProvider"
          android:authorities="com.cybertron.android.Provider.SectionProvider"
          android:exported="true" />
  </application>          
</manifest>

当我尝试调试此应用程序时,我预先收到错误(当应用程序在模拟器中启动时)

  

java.lang.RuntimeException:无法获取提供者   com.cybertron.android.Provider.SectionProvider:
  java.lang.ClassNotFoundException:没找到类   路径上的com.cybertron.android.Provider.SectionProvider:   DexPathList ......

任何人都可以告诉我为什么会收到此错误。其次,我想知道多个应用程序是否可以在Android系统上共享一个数据库?

谢谢,

0 个答案:

没有答案