我正在开发一个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系统上共享一个数据库?
谢谢,