개요 -기존 데이터베이스를 장치의 로컬 폴더에 복사하는 코드를 추가했습니다. 지금까지 기존 db가 아직 존재하지 않는 경우 첫 번째 조건 이 제대로 작동합니다.
문제 -그러나 솔루션 폴더에서 장치 폴더로 기존 db를 복사하는 코드 줄이 실행되면 SQLite 오류가 발생합니다. 오류는 db 파일을 열 수 없다는 것을 나타냅니다.
디버깅하는 동안 DBPath가 솔루션의 파일 위치와 동일하다는 것을 알 수 있습니다. 그래서 나는 경로에 무엇이 문제가 될 수 있는지 잘 모르겠습니다.
(db는 컨텐츠로 첨부되며 "항상 복사"로 설정됩니다.)
패키지에있는 db 파일의 전체 경로는 다음과 같습니다.
C:\Users\Brian\Documents\Visual Studio 2013\Projects\Parking Tag Picker WRT\Parking Tag Picker WRT\Databases\ParkingZoneDatabase.db
질문 : SQLite 클래스에 필요한 올바른 경로에 대한 db 경로를 어떻게 확인할 수 있습니까?
오류 로그 -여기서 발생하는 예외의 정확한 덤프는 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:
DBHelper 코드 : (기존 DB를 장치의 로컬 폴더에 복사하는 코드)
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;
}
읽기 전용으로 설정 되지 않은 db 파일 자체에 대한 권한도 확인했습니다.
먼저 repo에 감사드립니다. 문제는 지정하는 경로입니다.
를 사용 await databaseFile.CopyAsync(ApplicationData.Current.LocalFolder);
하면 선택한 데이터를 데이터베이스 폴더 내부가 아닌 로컬 폴더에 복사하여 데이터베이스 폴더 내부에 복사한다는 의미입니다. 먼저 데이터베이스 폴더를 만든 다음 해당 폴더 안에 파일을 복사해야합니다.
지금 AppDBPath
은 오류를 수정하기 위해 변경하는 간단한 솔루션을 제공하고 있습니다 . 이 솔루션은 데이터베이스 폴더 내부가 아닌 로컬 폴더에만 데이터베이스를 복사합니다.
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;
}
AppDBPath
DB에 대한 참조로 사용 하고 있으므로 나머지 코드는 완벽하게 작동합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다