Не удалось получить поставщика (ClassNotFoundException) Xamarin

Я работаю над решением в 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?

Спасибо,


person progrAmmar    schedule 13.07.2017    source источник
comment
Насколько мне известно, вы можете использовать базу данных SQlite и получать к ней доступ из нескольких приложений, если она хранится вне каталога установки приложений. Таким образом, он не должен удаляться при удалении одного из ваших приложений. Я не уверен, что это то же самое, что вы пытаетесь сделать выше.   -  person Digitalsa1nt    schedule 13.07.2017
comment
@ Digitalsa1nt Это также может достичь цели. Знаете ли вы, как я могу создать базу данных SQLite вне моего приложения? Я ищу базу данных, к которой могут обращаться несколько приложений. Как этого можно достичь.   -  person progrAmmar    schedule 13.07.2017
comment
некоторые основы можно найти здесь: developer.xamarin.com/recipes/ android/data/databases/sqlite на самом деле вам просто нужно убедиться, что путь, на котором хранится база данных, доступен другим вашим приложениям, а затем, по сути, выполнить проверку/создать, если база данных существует или ее необходимо создать ( это будет зависеть от порядка, в котором установлены ваши приложения, так как всем им нужно будет проверить, что база данных либо уже существует в указанном пути, либо, если ее нет, создать ее.)   -  person Digitalsa1nt    schedule 13.07.2017
comment
Спасибо @Digitalsa1nt, я уже знаю, как создавать базы данных в Xamarin. В Xamarin, когда мы создаем БД с помощью DBHelper, он автоматически помещает ее в package.   -  person progrAmmar    schedule 13.07.2017