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