2017-07-14 92 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