2016-05-22 26 views
0

Visual Studio 2015で空白の汎用アプリケーションを作成し、ボタンをMainPageに追加しました。次に、ボタンのクリックイベントハンドラを作成しました:myButton_Click(...)。あなたは、私はちょうど新しいDBファイルを作成しようとsqlite3_open()関数の結果は、ボタン上に表示されて見ることができるようにVisual Studio(UWP、C++)でSQLiteで.dbファイルを開く/作成できません

void MyTestApp::MainPage::myButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) 
{ 
    sqlite3 *testDB; 
    int result = sqlite3_open("file:///C:/Users/MyName/Downloads/testDB.db", &testDB); 
    myButton->Content = result.ToString(); 
} 

:そこ私は、次のコードを持っています。残念ながら、私はいつもCode 14: SQLITE_CANTOPENを得る。

Visual Studioでは、[ツール] - > [拡張機能と更新]で「SQLite for Universal Windows Platform」をインストールしました。ソリューションエクスプローラの下で、参考文献にSQLite for UWPを追加し、<sqlite3.h>ヘッダーも追加しました。

ファイルを作成できるように特別な権限を割り当てる必要がありますか、何が間違っていますか?

答えて

2

UWPアプリは、既定では自分のプライベートロケーションの外では読み取れません。file access for UWP in MSDNを参照してください。

StorageFile APIを使用してプライベートストレージエリア外の場所にアクセスできますが、ファイル名が必要なSQLiteでは機能しません。現時点では、データベースをローカルストレージエリアに最初にコピーする以外の方法はありません。ピータートルのコメントで

+0

ありがとう。あなたのリンクは私に以前知らなかった新しい情報を私に与えました。あなたのリンクから '' InstalledLocation'''を使ってinsallationフォルダを取得し、私のVSプロジェクトの中に '' 'AppX''ディレクトリを持ってきました。私はコードを '' 'int result = sqlite3_open(" testDB.db "、&testDB);' ''に変更しましたが、コード14を取得しました。また、完全なパス '' 'file:/// C: /.../ AppX/testDB.db'''コード14を再度使用します。ただし、 '' 'sqlite3_open(" file:/// C:/ Users/MyName/AppData/Local/Packages/" ../testDB.db "、&testDB);' '私はSQLite_OKを取得しました。しかし、 '' testDB.db'''ファイルはそこに作成されていませんでした... – Varius

+0

'InstalledLocation'は読み取り専用です。 'ApplicationData.Current'を使ってローカルフォルダを取得します。また、 "file:///"構文を使用する必要もありません。 –

0

は、それが最終的に働いた:

void MyTestApp::MainPage::myButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) 
{ 
    Windows::Storage::StorageFolder^ f = Windows::Storage::ApplicationData::Current->LocalFolder; 

    sqlite3 *testDB; 
    int result = sqlite3_open_v2("C:/Users/MyName/AppData/Local/Packages/538ec661-2ebf-4c45-8845-3a4cb6afd397_4jdacjwc0e74a/LocalState/testDB.db", &testDB, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL); 

    //This works too: 
    //int result = sqlite3_open_v2("C:\\Users\\MyName\\AppData\\Local\\Packages\\538ec661-2ebf-4c45-8845-3a4cb6afd397_4jdacjwc0e74a\\LocalState\\testDB.db", &testDB, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE, NULL); 

    myButton->Content = result.ToString(); 
    //myButton->Content = f->Path; 

    sqlite3_close(testDB); 
} 

testDB.dbはあなたがコードで参照ディレクトリで利用可能になりました。前にも同様のコードを試しましたが、うまくいきませんでした。それは、旗SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITEの違いを作ったようです...

関連する問題