0

Windows Store C++ アプリからsqlite-winrtを使用しようとしています。このパッケージの通常の C APIとは対照的に、このパッケージでは特に Windows ランタイム ラッパーを使用したいと考えています。コードプレックスのページにある C# の例を見ようとしています。


C# コード

  // Get the file from the install location  
  var file = await Package.Current.InstalledLocation.GetFileAsync("cities.db");  

  // Create a new SQLite instance for the file 
  var db = new Database(file);  

  // Open the database asynchronously
  await db.OpenAsync(SqliteOpenMode.OpenRead);

  // Prepare a SQL statement to be executed
  var statement = awaitdb.PrepareStatementAsync(
    "SELECT rowid, CityName FROM Cities;"); 

  // Loop through all the results and add to the collection
  while (awaitstatement.StepAsync())
     items.Add(statement.GetIntAt(0) + ": "+ statement.GetTextAt(1));

しかし、そのコードに相当する正確な C++ を理解することはできません。これは私がこれまでに持っているものです:


C++ コード

       auto installLoc = Windows::ApplicationModel::Package::Current->InstalledLocation;

       task<Windows::Storage::StorageFile^>(installLoc->GetFileAsync("cities.db")).then([](Windows::Storage::StorageFile^ file){
              auto db = ref new SQLiteWinRT::Database(file);

              task<void>(db->OpenAsync(SQLiteWinRT::SqliteOpenMode::OpenRead)).then([db](){
                     task<SQLiteWinRT::Statement^>(db->PrepareStatementAsync("SELECT rowid, CityName FROM Cities;")).then([](SQLiteWinRT::Statement^ stmt){
                           // Don't know how to simulate the while loop
                           //task<bool>(stmt->StepAsync()).then([](bool ret){
                           //});
                     });
              });
       });

C# で while ループを使用して行われる反復の動作をシミュレートする方法を完全に理解することはできません。ポインタはありますか?

4

4 に答える 4

1

Visual C++ コンパイラ 2013 年 11 月 CTPの最新リリース、およびこのリリースに付属する再開可能と待機のサポートにより、C++ コードは以下のスニペットのように読みやすくなりました。

void MainPage::DoStuff() __resumable
{
    auto items = ref new Vector<String^>();

    auto file = __await Package::Current->InstalledLocation->GetFileAsync("cities.db");
    auto db = ref new SQLiteWinRT::Database(file);
    __await db->OpenAsync(SQLiteWinRT::SqliteOpenMode::OpenRead);
    auto stmt = __await db->PrepareStatementAsync("SELECT rowid, CityName FROM Cities;");
    while (__await stmt->StepAsync())
        items->Append(stmt->GetIntAt(0) + ": " + stmt->GetTextAt(1));
}
于 2013-12-17T04:34:06.300 に答える
1

それが最も簡単な方法かどうかはわかりませんが、1 つの方法はループを再帰呼び出しに変換することです。たとえば、次のようなものです。

task<void> stepInfoRecursive(std::function<void()> actionToExecute,SQLiteWinRT::Statement^ stmt)
{
    return task<bool>(stmt->StepAsync()).then([actionToExecute,stmt](bool ret){
                        actionToExecute();

                        if (ret){
                             return stepInfoRecursive(actionToExecute,stmt);
                        }
                        return create_task([]{});

                    });
}

actionToExecute は、ループ内で実行したいことすべてになります。

于 2013-10-13T01:14:45.360 に答える
0

DatabasesCx の方が簡単だと思いますhttp://www.almanacsoft.com/databasescx

        String^ pathName = Windows::Storage::ApplicationData::Current->LocalFolder->Path + "\\cities.db";
        SQLiteCx^ mySql = ref new DatabasesCx::SQLiteCx(pathName);
        auto rowsOut = ref new Vector<RowCx^>();
        Concurrency::create_task(mySql->GetAsync(L"SELECT rowid, CityName FROM Cities", rowsOut))
       .then([this, rowsOut]()
       {  
          itemsViewSource->Source = rowsOut; // Data Binding to control
       }, task_continuation_context::use_current());
于 2014-03-15T06:03:47.587 に答える