2017-03-13 25 views
0

UWPアプリケーションでSQLite3のデータベースバックアップを作成しようとしています。 SQLiteのオンラインバックアップAPI(https://www.sqlite.org/backup.html)に基づいて、以下のメソッドを記述しました。 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ナゲットパッケージを使用しています。

まず、上記のコードで問題を再現できません。私はinitを実行してpBackupオブジェクトを取得できます。

第2に、実際にuwpアプリケーションでSQLiteファイルをバックアップするために複雑な方法は必要ありません。 SQLiteバックアップには3つの方法があり、その1つは外部ツールを使用してデータベースファイルをコピーすることです。 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); 
} 
関連する問題