UWP 앱에서 SQLite3 용 데이터베이스 백업을 만들려고합니다. SQLite (https://www.sqlite.org/backup.html)의 온라인 백업 API를 기반으로 아래 방법을 작성했습니다. backup_init
SQLite는 문서에서 확장 오류 코드 7. 정의를 반환 :UWP의 SQLite 백업 C#
(7) SQLITE_NOMEM
SQLITE_NOMEM 결과 코드 SQLite는 모두를 할당 할 수 없음을 나타냅니다> 메모리는이 작업을 완료하는 데 필요한. 즉, 작업을 계속하기 위해> 할당 된 메모리가 필요한 경우 sqlite3_malloc() 또는 sqlite3_realloc()에 대한 internal> 호출이 실패했습니다.
저는 C#의 포인터에 익숙하지 않아서 오류가 있다고 생각합니다. 어떤 도움을 주셔서 감사합니다.
public static string BackupDB()
{
IntPtr pDb = Marshal.StringToHGlobalUni(Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "DB.sqlite")); //Database to backup
string zFilename = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "DBBACKUP.sqlite"); //destination db path
string debug = "";
IntPtr pFile; //Database connection opened on zFilename
IntPtr pBackup; //Backup handle used to copy data
/* Open the database file identified by zFilename. */
var rc = SQLite3.Open(zFilename, out pFile);
debug += rc.ToString();
if (rc == SQLite.Net.Interop.Result.OK)
{
/* Open the sqlite3_backup object used to accomplish the transfer */
pBackup = SQLite3.sqlite3_backup_init(pFile, "main", pDb, "main");
if (pBackup != null)
{
/* Each iteration of this loop copies 5 database pages from database
** pDb to the backup database. If the return value of backup_step()
** indicates that there are still further pages to copy, sleep for
** 250 ms before repeating. */
do
{
rc = SQLite3.sqlite3_backup_step(pBackup, 5);
//xProgress(
// sqlite3_backup_remaining(pBackup),
// sqlite3_backup_pagecount(pBackup)
//);
if (rc == SQLite.Net.Interop.Result.OK || rc == SQLite.Net.Interop.Result.Busy || rc == SQLite.Net.Interop.Result.Locked)
{
SQLite3.sqlite3_sleep(250);
}
} while (rc == SQLite.Net.Interop.Result.OK || rc == SQLite.Net.Interop.Result.Busy || rc == SQLite.Net.Interop.Result.Locked);
/* Release resources allocated by backup_init(). */
SQLite3.sqlite3_backup_finish(pBackup);
}
debug += SQLite3.sqlite3_extended_errcode(pBackup);
}
/* Close the database connection opened on database file zFilename
** and return the result of this function. */
SQLite3.Close(pFile);
return debug;
}