0

私は文字通り一日中、Firefox を私の意志に従わせようとしてきました...

が欲しいです :

int c = SELECT COUNT(*) FROM ...

試してみましexecuteAsync({...});たが、結果がすぐに欲しいので、それは間違ったパラダイムだと思います。(そしてmozIStoragePendingStatementエラーになります)

var count = 0;
var conn = Services.storage.openDatabase(dbfile); // Will also create the file if it does not exist
let statement = conn.createStatement("SELECT COUNT(*) FROM edges LIMIT 42;");
console.log("columns: " + statement.columnCount);  // prints "1";
console.log("col name:" + statement.getColumnName(0)); // is "COUNT(*)"

while (statement.executeStep())
    count = statement.row.getResultByIndex(0); // "illegal value"
    count = statement.row.getString(0); // "illegal value", too
    count = statement.row.COUNT(*); // hahaha. still not working
    count = statement.row[0]; // hahaha. "undefinded"
    count = statement.row[1]; // hahaha. "undefinded"
}
statement.reset();

基本的には機能しますが、値がわかりません。すべてのステートメント (ループ内のステートメント) の何が問題になっていますか。

ヒントをありがとう...

4

2 に答える 2

1

count(*) を合計としてエイリアシングしてみて、それをフェッチしてください

于 2012-06-15T06:04:51.147 に答える
1

試してみましexecuteAsync({...});たが、結果がすぐに欲しいので、それは間違ったパラダイムだと思います。

これは望ましくありません。Storage API は何らかの理由で非同期です。データベースへの同期アクセスにより、ランダムな遅延が発生することがあります (ハード ドライブがビジー状態の場合など)。また、コードはメイン スレッド (ユーザー インターフェイスにサービスを提供する同じスレッド) で実行されるため、コードがデータベースの応答を待機している間、ユーザー インターフェイス全体がハングします。Mozilla 開発者は Firefox 3 で同期データベース アクセスを試みましたが、すぐにそれがユーザー エクスペリエンスを低下させることに気付きました。そのため、非同期 API を使用し、データベース処理は何もブロックせずにバックグラウンド スレッドで行われます。

非同期で動作するようにコードを変更する必要があります。たとえば、次のようなことを行う必要があります。

Components.utils.import("resource://gre/modules/Services.jsm");

var conn = Services.storage.openDatabase(dbfile);
if (conn.schemaVersion < 1)
{
  conn.createTable("edges", "s INTEGER, t INTEGER");
  conn.schemaVersion = 1;
}

var statement = conn.createStatement("SELECT COUNT(*) FROM edges");
statement.executeAsync({
  handleResult: function(resultSet)
  {
    var row = resultSet.getNextRow();
    var count = row.getResultByIndex(0);
    processResult(count);
  },
  handleError: function(error) {},
  handleCompletion: function(reason) {}
});

// Close connection once the pending operations are completed
conn.asyncClose();

参照: mozIStorageResultSetmozIStorageRow

于 2012-06-15T05:48:45.947 に答える