0

私はコードをデバッグしましたが、sqlite クエリが AsynkTask スレッドを停止するようです:

    Log.d(LOG_TAG, "Getting params");
Cursor c = null;
try {
  String[] queryParams = new String[]{String.valueOf(commandQueueId), String.valueOf(DIRECTION_OUT)};
  // ↓↓↓ STOPPING HERE ↓↓↓
  c = dataSource.query(TABLE_USER_COMMAND, "queue_id = ? AND direction = ? AND _id > " + fromId, queryParams);

  Log.d(LOG_TAG, "After query");
  if (c.moveToFirst()) {
    UserCommand command;
    do {
      // Something with cursor
    } while (c.moveToNext());
  }

} catch (Exception e) {
  Log.e(LOG_TAG, "Error while querying", e);
} finally {
  Log.d(LOG_TAG, "Finnaly executed");
  if (null != c)
    c.close();
}

"Getting params" 文字列のみを表示する LogCat で、何も表示されません (エラーも何も表示されません)。AsyncTask で実行されるコード、dataSource オブジェクトでは、すべてのメソッドが同期されます。UIスレッドクエリではうまく機能します。それは何でしょうか?

4

3 に答える 3

0

_idあなたはあなたの状態の中で何も渡していません

"queue_id = ? AND direction = ? AND _id > "

それは次のようになるはずです

"queue_id = ? AND direction = ? AND _id > 1(or may other integer parameter)" + fromId, queryParams

それが役立つことを願っています

于 2013-02-09T12:09:14.583 に答える
0

dataSource オブジェクトにはすべてのメソッドが同期されています

デッドロックに注意!読み取り中にデータを変更するリスクがないため、書き込みメソッド (挿入、削除、更新)のみを同期し、読み取りメソッド (クエリ) も同期しないでください PS: 質問が少し古いことは知っています。

于 2013-05-07T16:21:00.517 に答える
0

問題は、_id-parameter (fromId) を query-String に含めようとしていることにあると思います。そのため、クエリ関数はクエリ文字列を構築できない可能性があります

"queue_id = ? AND direction = ? AND _id > " + fromId

代わりに、fromId を selectionArgs (queryParams) に追加する必要があります。queryParams と fromId を含む String-Array を作成します。その後、動作するはずです。

String[] queryParams = new String[]{String.valueOf(commandQueueId), String.valueOf(DIRECTION_OUT), String.valueOf(fromId)};
c = dataSource.query(TABLE_USER_COMMAND, "queue_id = ? AND direction = ? AND _id > ? ", queryParams ); //queryParams which include your fromId
于 2013-02-09T12:49:52.067 に答える