0

免責事項: 誰かに作業を依頼しているわけではありません。これを達成するための最善の方法を求めているだけです。

ページ上の 12 項目のリストに対して 2 つの数値を提示する必要があります。ページは次のようになります (レイアウトはまだ作業中です)
レイアウト

私はもともとこれをスクロールビューと各行の相対的なレイアウトから構築しました。ビューに 80 を超えるビューがあり、パフォーマンスの問題が発生するという Eclipse からの警告が表示されるので、カーソル アダプターと単一のリスト行レイアウトからこれを実行したいと考えています。

問題は、プルしたい記録されたアイテムを含むデータベース テーブルでカーソル アダプターを使用すると、ユーザーが既にリストに記録したアイテムのリストしか取得できないことです。すべての項目を表示して (文字列配列、またはすべての動きを含む別のデータベース テーブルから提供される)、データベースから数値を引き出すことができるかどうか疑問に思っています。(下部のボタンは、データをどこから取得するかを制御します)

カスタム カーソル アダプターを使用したり、カーソル アダプターのバインディングをオーバーライドしたりできるのではないかと考えていましたが、これを実現する方法を知っている人がいれば、私は耳を傾けます。

次のようなすべての動きを含むテーブルがあります。

ID    moveName
----------------
1     Takedown
2     Sweep
3     Reversal

このテーブル全体がリストビューに入力されるようにします (したがって、12 行を取得します)

次に、別のテーブルから # を取得します。

SELECT COUNT(moves) FROM movesHistory WHERE moveName = <name> AND date = NOW - <button pressed>

これは明らかに適切な SQL 構文ではなく、私が使用するものを示しているだけです。これを関数にラップして、月を渡すだけで、ユーザーが下部のボタンを押したときを見つけることができます。

私はこれに似たものを使用します:

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get a cursor with all people
   Cursor c = myDB.rawQuery("SELECT ... FROM " + TableName , null);
    startManagingCursor(c);

    ListAdapter adapter = new SimpleCursorAdapter(this,
            // Use a template that displays a text view
            android.R.layout.simple_list_item_1,
            // Give the cursor to the list adatper
            c,
            // Map the NAME column in the people database to...
            new String[] {Contacts.DISPLAY_NAME},
            // The "text1" view defined in the XML template
            new int[] {android.R.id.text1});
    setListAdapter(adapter);
}

編集 12/14/12:

別のSOリンクを読んだ後、これはある種の結合で簡単に達成できるかもしれません。BJJ 名テーブルからすべてのレコードを選択し、他のテーブルから各移動タイプの合計を選択することが可能かどうかを把握しようとしています。

このテーブルからすべての行を選択することは可能ですか:
柔術が動く

そして、このテーブルからの前後の手の合計数:
柔術の歴史

このようなものを作るには:

Name          Taps   Tapped
Takedown       0       0 
sweep          0       0
reversal       1       0
choke          2       1
arm lock       0       0
leg lock       0       1
guard pass     0       0
guard pull     0       1
back           0       0
sweep          1       0
throw          1       0
guard          1       0

ユーザー名が [Against] 列にある場合、タップされたとカウントされます。ユーザー名が [By] 列にある場合、移動は [タップ] としてカウントされます。などは、ほとんど基本的な Select/Insert/Update/ コマンドに限定されているため、現在は少し混乱しています。

次のページを見つけました: http://www.w3resource.com/sql/aggregate-functions/sum-and-count-using-variable.php

結合で count と sum を使用してリストされていますが、次のことを試みるとエラーが発生します。 エラー

編集#3

成功!

SQL クエリは次のとおりです。

SELECT taps1.moveName, IFNULL( taps1.taps, 0 ) AS Taps  , IFNULL( tapped1.tapped, 0 ) AS Tapped 
FROM (

  SELECT bj.moveName, bh.taps
  FROM BJJ_moves bj
  LEFT JOIN (

    SELECT Move, SUM( MoveCount ) AS taps
    FROM BJJ
    WHERE MoveBy = '<NAME>'
    GROUP BY Move
  )bh ON bh.Move = bj.moveName
)taps1
LEFT JOIN (

  SELECT Move, SUM( MoveCount ) AS tapped
  FROM BJJ
  WHERE AGAINST = '<NAME>'
  GROUP BY Move
)tapped1 ON tapped1.Move = taps1.MoveName

そして、これが生成する結果のテーブルです (NULL を 0 に変更し、列名を変更したことを除いて):
結果表

このクエリをカーソルに入れる必要があるだけで、リストビューにフィードされます。

4

2 に答える 2

0

私はすべて「派手な方法」で何かをしているのですが、テキストと静的データだけを扱っている場合(大量のデータではない)、「Eclipseからの警告」を無視しても問題ありません。ビューには現在80以上のビューがあります。」

確かに、数千のアイテムをビューにロードする際に問題が発生するため、リストビューを使用する必要があります。しかし、あなたが100かそこら、あるいは数百でさえあれば、ほとんどの最新のデバイスは私が経験したことからうまく追いつくことができると思います。

そうは言っても、アプリが拡張したり、はるかに動的になったり、グラフィックが集中したりする場合は、その警告に注意してください。はい、確かにデータベースからこのデータを取得できます。CursorLoaderでListViewを使用することをお勧めします。もちろん、組み込みのandroidsqlliteデータベースエンジンを使用することをお勧めします。このための素晴らしいチュートリアルがたくさんあります。

于 2012-12-14T00:43:44.487 に答える
0

したがって、最終的な結果は、次のSQLクエリを使用したcursoradapter(後で、互換性ライブラリを備えたカーソルローダーですが、最初にそれらについて読む必要があります)になります。

SELECT taps1.moveName AS move, IFNULL(taps1.taps, 0) AS taps, IFNULL(tapped1.tapped,0) AS tapped
FROM (
  SELECT bj.moveName, bh.taps
  FROM BJJ_moves bj
  LEFT JOIN (
    SELECT Move, SUM( MoveCount) AS taps
    FROM BJJ
    WHERE MoveBy = 'Evan Richardson'
    AND Date > DATE_SUB(curdate(), INTERVAL <X> MONTH)
    GROUP BY Move
  )bh ON bh.Move=bj.moveName
)taps1
LEFT JOIN (
   SELECT Move, SUM(MoveCount) AS tapped
   FROM BJJ
   WHERE Against = 'Evan Richardson'
   AND Date > DATE_SUB(curdate(), INTERVAL <X> MONTH)
   GROUP BY Move
)tapped1 ON tapped1.Move = taps1.MoveName

これにより、リストビューに必要な3つの列を含むテーブルが作成され、アダプターを使用してリストに入力できます。「X」を、押されたボタンに基づく可変値に置き換えます。

皆さんありがとう!

于 2012-12-15T20:17:41.520 に答える