在 c# windows 商店应用程序中使用 SQLite 的 MBTiles 数据库
MBTiles db with SQLite in a c# windows store app
我正在用 c# Xaml 做一个 windows store (8.1) 应用程序来使用 Bing Maps for c# extension 和一个 mbtiles 文件生成地图,我已经使用过便携式底图服务器项目来完成这项工作,但现在我正在尝试使用 SQLite 自己访问 mbtiles 文件中的数据。
我设法从 WPF 中的那种文件中获取图块,但我不知道如何在 windows 商店项目中执行此操作;
我在 WPF 中的代码:
SQLiteConnection _sqlcon;
using (_sqlcon = new SQLiteConnection(String.Format("Data Source={0};Version=3;", "PATH_TO_MBTILES")))
{
_sqlcon.Open();
SQLiteCommand cmd = new SQLiteCommand(string.Format("SELECT tile_data FROM tiles WHERE tile_column={0} AND tile_row={1} AND zoom_level={2}", 2, 5, 3), _sqlcon);
object o = cmd.ExecuteScalar();
if (o != null)
{
byte[] c = (byte[])o;
using (MemoryStream stream = new MemoryStream(c))
{
BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.CacheOption = BitmapCacheOption.OnLoad;
bmp.StreamSource = stream;
bmp.EndInit();
img.Source = bmp;
}
}
}
使用该代码,我获得了第 2 列第 5 行和缩放级别 3 的磁贴。
但是在 windows 商店应用程序中,当我尝试使用相同的文件创建 SQLiteConnection
时,我得到一个 SQLiteException "Could not open database file"(我正在使用 NuGet sqlite-net 和 SqLite对于 Windows 运行时 8.1 扩展)
我在 Windows 应用商店中的代码:
SQLiteConnection _sqlcon;
using (_sqlcon = new SQLiteConnection(String.Format("Data Source={0};Version=3;", "PATH_TO_MBTILES"))) //SQLiteExeption here
{
SQLiteCommand cmd = new SQLiteCommand(string.Format("SELECT tile_data FROM tiles WHERE tile_column={0} AND tile_row={1} AND zoom_level={2}", 2, 5, 3), _sqlcon);
byte[] o = cmd.ExecuteScalar<byte[]>();
//etc...
}
Visual Studio 的调试器将我发送到 sqlite-net NuGet 的 SQLite.cs 文件:
public SQLiteConnection (string databasePath, SQLiteOpenFlags openFlags, bool storeDateTimeAsTicks = false)
{
if (string.IsNullOrEmpty (databasePath))
throw new ArgumentException ("Must be specified", "databasePath");
DatabasePath = databasePath;
#if NETFX_CORE
SQLite3.SetDirectory(/*temp directory type*/2, Windows.Storage.ApplicationData.Current.TemporaryFolder.Path);
#endif
Sqlite3DatabaseHandle handle;
#if SILVERLIGHT || USE_CSHARP_SQLITE
var r = SQLite3.Open (databasePath, out handle, (int)openFlags, IntPtr.Zero);
#else
// open using the byte[]
// in the case where the path may include Unicode
// force open to using UTF-8 using sqlite3_open_v2
var databasePathAsBytes = GetNullTerminatedUtf8 (DatabasePath);
var r = SQLite3.Open (databasePathAsBytes, out handle, (int) openFlags, IntPtr.Zero);
#endif
Handle = handle;
if (r != SQLite3.Result.OK) {
throw SQLiteException.New (r, String.Format ("Could not open database file: {0} ({1})", DatabasePath, r));
}
_open = true; // Debugger Stops here !
StoreDateTimeAsTicks = storeDateTimeAsTicks;
BusyTimeout = TimeSpan.FromSeconds (0.1);
}
我在 WPF 中找到了许多 mbtiles 文件的示例,但 none 在 windows 商店应用程序中。
Windows store dev 的 SQLite 扩展是否支持将 MBTiles 文件作为数据库?
如果是,我做错了什么?
Windows商店应用只能访问自己的目录,不能访问管理员用户的私有文件。
阅读 the documentation,但您可能希望将数据作为应用程序的一部分进行安装。
我正在用 c# Xaml 做一个 windows store (8.1) 应用程序来使用 Bing Maps for c# extension 和一个 mbtiles 文件生成地图,我已经使用过便携式底图服务器项目来完成这项工作,但现在我正在尝试使用 SQLite 自己访问 mbtiles 文件中的数据。
我设法从 WPF 中的那种文件中获取图块,但我不知道如何在 windows 商店项目中执行此操作;
我在 WPF 中的代码:
SQLiteConnection _sqlcon;
using (_sqlcon = new SQLiteConnection(String.Format("Data Source={0};Version=3;", "PATH_TO_MBTILES")))
{
_sqlcon.Open();
SQLiteCommand cmd = new SQLiteCommand(string.Format("SELECT tile_data FROM tiles WHERE tile_column={0} AND tile_row={1} AND zoom_level={2}", 2, 5, 3), _sqlcon);
object o = cmd.ExecuteScalar();
if (o != null)
{
byte[] c = (byte[])o;
using (MemoryStream stream = new MemoryStream(c))
{
BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.CacheOption = BitmapCacheOption.OnLoad;
bmp.StreamSource = stream;
bmp.EndInit();
img.Source = bmp;
}
}
}
使用该代码,我获得了第 2 列第 5 行和缩放级别 3 的磁贴。
但是在 windows 商店应用程序中,当我尝试使用相同的文件创建 SQLiteConnection
时,我得到一个 SQLiteException "Could not open database file"(我正在使用 NuGet sqlite-net 和 SqLite对于 Windows 运行时 8.1 扩展)
我在 Windows 应用商店中的代码:
SQLiteConnection _sqlcon;
using (_sqlcon = new SQLiteConnection(String.Format("Data Source={0};Version=3;", "PATH_TO_MBTILES"))) //SQLiteExeption here
{
SQLiteCommand cmd = new SQLiteCommand(string.Format("SELECT tile_data FROM tiles WHERE tile_column={0} AND tile_row={1} AND zoom_level={2}", 2, 5, 3), _sqlcon);
byte[] o = cmd.ExecuteScalar<byte[]>();
//etc...
}
Visual Studio 的调试器将我发送到 sqlite-net NuGet 的 SQLite.cs 文件:
public SQLiteConnection (string databasePath, SQLiteOpenFlags openFlags, bool storeDateTimeAsTicks = false)
{
if (string.IsNullOrEmpty (databasePath))
throw new ArgumentException ("Must be specified", "databasePath");
DatabasePath = databasePath;
#if NETFX_CORE
SQLite3.SetDirectory(/*temp directory type*/2, Windows.Storage.ApplicationData.Current.TemporaryFolder.Path);
#endif
Sqlite3DatabaseHandle handle;
#if SILVERLIGHT || USE_CSHARP_SQLITE
var r = SQLite3.Open (databasePath, out handle, (int)openFlags, IntPtr.Zero);
#else
// open using the byte[]
// in the case where the path may include Unicode
// force open to using UTF-8 using sqlite3_open_v2
var databasePathAsBytes = GetNullTerminatedUtf8 (DatabasePath);
var r = SQLite3.Open (databasePathAsBytes, out handle, (int) openFlags, IntPtr.Zero);
#endif
Handle = handle;
if (r != SQLite3.Result.OK) {
throw SQLiteException.New (r, String.Format ("Could not open database file: {0} ({1})", DatabasePath, r));
}
_open = true; // Debugger Stops here !
StoreDateTimeAsTicks = storeDateTimeAsTicks;
BusyTimeout = TimeSpan.FromSeconds (0.1);
}
我在 WPF 中找到了许多 mbtiles 文件的示例,但 none 在 windows 商店应用程序中。
Windows store dev 的 SQLite 扩展是否支持将 MBTiles 文件作为数据库? 如果是,我做错了什么?
Windows商店应用只能访问自己的目录,不能访问管理员用户的私有文件。
阅读 the documentation,但您可能希望将数据作为应用程序的一部分进行安装。