sharp - sqlite c# example visual studio 2017
¿Cómo resolver una ruta incorrecta a la base de datos SQLite? (1)
Descripción general : he agregado un código para copiar una base de datos existente en la carpeta local del dispositivo. Hasta ahora, la primera condición si el db existente no existe ya funciona bien.
Problema : pero cuando se ejecuta la línea de código para copiar el archivo db existente de la carpeta de la solución a la carpeta del dispositivo, aparece un error de SQLite. El error me dice que el archivo db no se pudo abrir.
Durante la depuración, veo que DBPath es igual a la ubicación del archivo en mi solución. Entonces no estoy muy seguro de lo que podría estar mal en el camino.
(El archivo db se adjunta como contenido y se establece en "copiar siempre").
La ruta completa al archivo db en el paquete es:
C:/Users/Brian/Documents/Visual Studio 2013/Projects/Parking Tag Picker WRT/Parking Tag Picker WRT/Databases/ParkingZoneDatabase.db
Pregunta : ¿Cómo puedo resolver la ruta db a la ruta correcta requerida por la clase SQLite?
Registro de errores : el volcado exacto de la excepción que se genera aquí es el siguiente en la clase SQLite:
SQLite.SQLiteException was unhandled by user code
HResult=-2146233088
Message=Could not open database file: C:/Data/Users/DefApps/APPDATA/Local/Packages/6d00c25c-39d2-443f-a29b-2c30c8ce7e99_gevy8cezwa384/LocalState/Databases/ParkingZoneDatabase.db (CannotOpen)
Source=Parking Tag Picker WRT
StackTrace:
at SQLite.SQLiteConnection..ctor(String databasePath, SQLiteOpenFlags openFlags, Boolean storeDateTimeAsTicks)
at SQLite.SQLiteConnection..ctor(String databasePath, Boolean storeDateTimeAsTicks)
at Parking_Tag_Picker_WRT.Helpers.DatabaseHelper.ReadZones(String tableName)
at Parking_Tag_Picker_WRT.ViewModel.TagRequestViewModel.InitZoneInfoAsync()
at Parking_Tag_Picker_WRT.TagRequestPage.OnNavigatedTo(NavigationEventArgs e)
InnerException:
Código de DBHelper : (código que copia el archivo de base de datos existente a la carpeta local en el dispositivo)
public const string DBPath = @"Databases/ParkingZoneDatabase.db";
/// <summary>
/// Load SQL_LiteTable from Solution
/// </summary>
/// <param name="DBPATH"></param>
/// <returns></returns>
public async Task<bool> Init()
{
bool isDatabaseExisting = false;
try
{
StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync(DBPath);
isDatabaseExisting = true;
}
catch
{
isDatabaseExisting = false;
}
if (!isDatabaseExisting)
{
//Fails at this line when retrieving the existing db
StorageFile databaseFile = await Package.Current.InstalledLocation.GetFileAsync(DBPath);
await databaseFile.CopyAsync(ApplicationData.Current.LocalFolder);
}
return true;
}
También verifiqué los permisos en el archivo db, que no está configurado para LEER SOLAMENTE -
En primer lugar, gracias por el repositorio. El problema es la ruta que estás especificando.
Cuando utiliza await databaseFile.CopyAsync(ApplicationData.Current.LocalFolder);
, eso significa que está copiando los datos seleccionados a la carpeta Local (no dentro de la carpeta Base de datos) para copiarlos dentro de una carpeta de base de datos que necesita para crear primero una carpeta de Base de Datos y luego copiar el archivo dentro de esa carpeta.
Por ahora estoy dando la solución simple de hacer cambios a su AppDBPath
para arreglar el error. Esta solución copia la base de datos a su carpeta local solo dentro de la carpeta de la base de datos.
public const string AppDBPath = @"ParkingZoneDatabase.db";
public const string PackageDBPath = @"Databases/ParkingZoneDatabase.db";
/// <summary>
/// Load SQL_LiteTable from Solution
/// </summary>
/// <param name="DBPATH"></param>
/// <returns></returns>
public async Task<bool> Init()
{
bool isDatabaseExisting = false;
try
{
StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync(AppDBPath);
isDatabaseExisting = true;
}
catch
{
isDatabaseExisting = false;
}
if (!isDatabaseExisting)
{
StorageFile databaseFile = await Package.Current.InstalledLocation.GetFileAsync(PackageDBPath);
await databaseFile.CopyAsync(ApplicationData.Current.LocalFolder);
}
return true;
}
Como está utilizando AppDBPath
como referencia para su base de datos, el resto del código debería funcionar perfectamente.