2017-07-14 17 views
0

私のXamarinアプリケーションで内部ストレージにSQLIteデータベースを作成しようとしています。私は少なくとも3つのアプリケーションが共有データと相互接続されているオフライン環境用のシステムを作成しています。したがって、あるアプリケーションが何らかのデータを作成すると、他のアプリケーションはそのデータを読み取ることができます。内部ストレージにSQLiteデータベースを作成するANDROID

データベースプロジェクトは、3つのアプリケーションすべてに含める予定のポータブルクラスライブラリです。次のように

私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.String)System.IO.Directory.CreateDirectoriesInternalにスタックトレース

ある< 3fd174ff54b146228c505f23cf75ce71>で [0x0004b]:0 System.IO.Directory.CreateDirectoryで(可能System.Stringパス)[0x00075] < 3fd174ff54b146228c505f23cf75ce71>で: anchorapp.db.Helper.Database..ctor(AT 0)[0x0002e]

これはパーミッションのためですが、PCLから内部ストレージに書き込むためにはどのようなパーミッションを設定する必要がありますか?

答えて

0

私は私のプロジェクト内sharedIdを作成し、使用することによってこれをしませんでした他のアプリケーションによって作成されたデータベースにアクセスするためのSharedContext

1

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"); 

をあなたは誰もがデータベースを参照して開くことができる道を行けばことを、ご了承ください。

+0

私はそれを行うことができますが、私はこのアプリケーションによって作成されたDBにアクセスするために他のアプリが必要です。別のデータベースによって作成されたデータベースからデータを読み取ることは可能ですか? – 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

私はそれを行うことができますが、私はこのアプリケーションによって作成されたDBにアクセスするために他のアプリが必要です。別のデータベースによって作成されたデータベースからデータを読み取ることは可能ですか? – progrAmmar

+0

マニフェストにandroid:sharedUserIdを定義して、2つのアプリがデータを共有できるようにすることができます。しかし、あなたのアプリが本当にこのアプローチを使用する必要があるかどうかを検討する必要があります。 ContentProviderをチェックして、まずあなたがあなたのアプリを使ってやることを計画しているかどうかを確認してください。 – lowleetak

+0

コンテンツプロバイダーで試した結果、異なるエラーが発生しました。https://stackoverflow.com/questions/45074287/unable-to-get-provider-classnotfoundexception-xamarin atleast 1のデータベースに必ずアクセスする必要があります3からアプリケーションを削除します。私はsharedIdでどのように行うことができますか? – progrAmmar

関連する問題