2016-05-22 24 views
0

Ich habe eine leere universelle App in Visual Studio 2015 erstellt und nur eine Schaltfläche an die MainPage hinzugefügt. Dann habe ich den Click-Event-Handler für die Schaltfläche erstellt: myButton_Click(...). Dort habe ich den folgenden Code:Kann nicht öffnen/erstellen .db-Datei mit SQLite in Visual Studio (UWP, C++)

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(); 
} 

Wie Sie sehen, ich versuche gerade eine neue Datenbankdatei und das Ergebnis der sqlite3_open() Funktion zu erstellen, wird auf der Schaltfläche angezeigt. Leider bekomme ich immer Code 14: SQLITE_CANTOPEN.

In Visual Studio habe ich "SQLite für Universal Windows Platform" über Extras -> Erweiterungen und Updates installiert. Unter dem Lösungs-Explorer habe ich die SQLite für UWP zu den Referenzen hinzugefügt und auch den <sqlite3.h> Header.

Muss ich der App spezielle Berechtigungen zuweisen, damit sie Dateien erstellen kann oder was mache ich falsch?

Antwort

2

UWP-Apps können standardmäßig nicht außerhalb ihrer eigenen privaten Speicherorte gelesen werden - siehe file access for UWP in MSDN.

Sie können über die APIs StorageFile auf Speicherorte außerhalb Ihres privaten Speicherbereichs zugreifen, sie funktionieren jedoch nicht für SQLite, die einen Dateinamen erwartet. Momentan gibt es keine Möglichkeit, die Datenbank zuerst in Ihren lokalen Speicherbereich zu kopieren.

+0

Danke. Ihr Link gab mir einige neue Informationen, die ich vorher nicht kannte. Ich habe den Installationsordner jetzt mit '' InstalledLocation''' von Ihrem Link genommen und das '' 'AppX'''-Verzeichnis in meinem VS-Projekt gefunden. Ich habe meinen Code zu '' 'int result = sqlite3_open (" testDB.db ", & testDB) geändert;' '' aber wieder habe ich Code 14. Ich habe auch den kompletten Pfad '' 'file: /// C: /.../ AppX/testDB.db''', wieder Code 14. Unter dem AppData-Speicherort jedoch '' 'sqlite3_open (" file: /// C:/Benutzer/MeinName/AppData/Lokal/Pakete /. ../testDB.db ", & testDB);' '' Ich habe SQLITE_OK. Aber dort wurde keine '' 'testDB.db''' Datei erstellt ... – Varius

+0

' InstalledLocation' ist schreibgeschützt. Verwenden Sie 'ApplicationData.Current', um den lokalen Ordner zu erhalten. Außerdem muss die Syntax "file: ///" nicht verwendet werden. –

0

Mit Peter Torr Kommentare es endlich geklappt:

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

Die testDB.db im Verzeichnis ist jetzt verfügbar Sie den Code zu sehen. Ich habe vorher einen ähnlichen Code ausprobiert, aber es hat nicht funktioniert. Es scheint, dass die Flaggen SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE den Unterschied machten ...

Verwandte Themen