2017-07-14 86 views
0

我想在我的Xamarin应用程序的内部存储上创建一个SQLIte数据库。我正在为离线环境创建一个系统,其中至少有3个应用程序与共享数据相互连接。所以如果一个应用程序创建了一些数据,另一个应用程序应该能够读取它。在内部存储ANDROID上创建SQLite数据库

数据库项目是一个可移植的类库,我打算在所有三个应用程序中包含它。

我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<Orders>(); 
     _connection.CreateTable<Items>();  

    } 
    catch(Exception ex) 
    { } 

} 

我得到错误,说

访问路径 “/data/data/Anchor.Main” 被拒绝。

以下是堆栈跟踪

在System.IO.Directory.CreateDirectoriesInternal(System.String路径) [0x0004b]在< 3fd174ff54b146228c505f23cf75ce71>:0在 System.IO.Directory.CreateDirectory (System.String路径)[0x00075]在 < 3fd174ff54b146228c505f23cf75ce71>:0在 anchorapp.db.Helper.Database..ctor()[0x0002e]

我知道这是因为权限,但是我需要设置什么权限才能从PCL写入内部存储?

回答

0

我通过我的项目中创建一个sharedId和使用这样做SharedContext访问由其他应用程序创建的数据库

1

Android和iOS不能这样工作。每个平台都将应用程序保存在沙盒环境中。如果你想创建并在App Store中的数据,你需要创建一个类似于下面的示例的路径:在你的Android项目

var docFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal); 
_dbPath = System.IO.Path.Combine(docFolder, "Anchor.db"); 

还设置权限ReadExternalStorage和WriteExternalStorage

而不是写一个私人的文件夹,你可以创建一个公共的数据库。这样做的docFolder将变为:

var docFolder = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, "YourDirectoryName"); 

被告知请,如果你去每个人都这样,才能看到并打开数据库。

+0

我可以做到这一点,但我需要其他应用程序来访问由此应用程序创建的数据库。是否可以从另一个数据库创建的数据库中读取数据? – progrAmmar

1

您正在访问“/data/data/Anchor.Main”的Android系统文件夹。 您的应用程序内部存储将在

/data/data/@[email protected]/files 

您可以使用下面的代码来获取文件夹来存储数据库:

// Equal to /data/data/@[email protected]/files 
var homePath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); 
_dbPath = System.IO.Path.Combine(homePath, "Anchor.db"); 
_connection = new SQLiteConnection(_dbPath); 
+0

我可以做到这一点,但我需要其他应用程序来访问由此应用程序创建的数据库。是否可以从另一个数据库创建的数据库中读取数据? – progrAmmar

+0

您可以在清单中定义android:sharedUserId以启用2应用程序共享数据。但是,您应该考虑您的应用程序是否真的需要使用这种方法。查看ContentProvider并查看它是否可以完成您计划首先对您的应用程序执行的操作。 – lowleetak

+0

我尝试与内容提供商,导致不同的错误https://stackoverflow.com/questions/45074287/unable-to-get-provider-classnotfoundexception-xamarin 我绝对需要访问数据库,至少1应用程序不在3.我如何使用sharedId来完成它。 – progrAmmar