我正在尝试在我的Xamarin应用程序中的内部存储上创建一个SQLIte数据库。 我正在为离线环境创建一个系统,其中至少有3个应用程序与共享数据相互连接。 因此,如果一个应用程序创建了一些数据,则其他应用程序应该能够读取该数
Database项目是一个可移植类库,我打算将其包含在所有三个应用程序中。
我的DbHelper如下:
public Database()
{
string folder ="/data/data/Anchor.Main";
_dbPath = System.IO.Path.Combine(folder,"Anchor.db");
try
{
if (!System.IO.Directory.Exists(folder))
{
System.IO.Directory.CreateDirectory(folder); //Getting error here
}
_connection = new SQLiteConnection(_dbPath);
_connection.CreateTable();
_connection.CreateTable();
}
catch(Exception ex)
{ }
}
我得到了错误
Access to the path"/data/data/Anchor.Main" is denied.
以下是堆栈跟踪
at System.IO.Directory.CreateDirectoriesInternal (System.String path)
[0x0004b] in <3fd174ff54b146228c505f23cf75ce71>:0 at
System.IO.Directory.CreateDirectory (System.String path) [0x00075] in
<3fd174ff54b146228c505f23cf75ce71>:0 at
anchorapp.db.Helper.Database..ctor () [0x0002e]
我理解这是因为权限,但我需要设置哪些权限才能从PCL写入内部存储?
您正在访问"/data/data/Anchor.Main"的Android系统文件夹。
您的应用内部存储空间将在
/data/data/@PACKAGE_NAME@/files
您可以使用以下代码获取存储数据库的文件夹:
// Equal to /data/data/@PACKAGE_NAME@/files
var homePath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
_dbPath = System.IO.Path.Combine(homePath,"Anchor.db");
_connection = new SQLiteConnection(_dbPath);
我可以这样做,但我需要其他应用程序来访问此应用程序创建的数据库。 是否可以从另一个数据库创建的数据库中读取数据?
您可以在清单中定义android:sharedUserId以启用2个应用程序来共享数据。 但是,您应该考虑您的应用是否真的需要使用此方法。 查看ContentProvider,看看它是否能够首先实现您计划对应用程序执行的操作。
我尝试使用内容提供程序,导致了一个不同的错误stackoverflow.com/questions/45074287/我肯定需要访问数据库中的至少1个应用程序。我怎样才能使用sharedId。
Android和iOS无法正常工作。 每个平台都将应用程序保存在沙盒环境中。 如果要在应用程序中创建和存储数据,则需要创建如下示例的路径:
var docFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
_dbPath = System.IO.Path.Combine(docFolder,"Anchor.db");
还要在Android项目中设置权限ReadExternalStorage和WriteExternalStorage
您可以在公共文件夹中创建数据库,而不是写入私人文件夹。 为此,docFolder将更改为:
var docFolder = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath,"YourDirectoryName");
请注意,如果你这样走,每个人都可以看到并打开数据库。
我可以这样做,但我需要其他应用程序来访问此应用程序创建的数据库。 是否可以从另一个数据库创建的数据库中读取数据?
我通过在项目中创建sharedId并使用SharedContext访问其他应用程序创建的数据库来实现此目的