2017-03-13 1 views
0

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

답변

1

당신의 코드에 따르면, 당신은 SQLite.Net-PCL nuget 패키지를 사용하고 있습니다.

첫째, 위 코드로 문제를 재현 할 수 없습니다. 초기화하고 pBackup 개체를 가져올 수 있습니다.

둘째, 실제로 uwp 응용 프로그램에서 SQLite 파일을 백업하는 복잡한 방법이 필요하지 않습니다. SQLite 백업에는 세 가지 방법이 있으며 그 중 하나는 외부 도구를 사용하여 데이터베이스 파일을 복사하는 것입니다. uwp에는 API가 파일을 복사 할 수 있습니다. StorageFile 클래스의 CopyAsync 메소드를 사용하여 데이터베이스 파일을 백업 할 수 있습니다. 예 :

public static async void BackupDBByCopy() 
{ 
    StorageFolder localfolder = ApplicationData.Current.LocalFolder;   
    StorageFile dboriginal = await localfolder.GetFileAsync("DB.sqlite");   
    await dboriginal.CopyAsync(localfolder, "DBBACKUP.sqlite", NameCollisionOption.ReplaceExisting); 
}