0

Android アプリ用の SQLite データベースをいじっています。複数のプレーヤーを含む「プレーヤー」テーブルと、シューティングやリバウンドなどの各プレーヤーのスキル ポイントを持つ 1 対多の「スキル」テーブルがあります。

テキストボックスに実際に入力し、プレーヤーをデータベースに挿入するためのアクティビティがアプリに 1 つあります。ユーザーが「プレイヤーの追加」ボタンを押すと、「プレイヤー」テーブルに行が挿入され、「プレイヤー」テーブルを参照する外部キーを持つ「スキル」テーブルに行が挿入されます。これらの挿入の後、クエリを実行して、「skills」テーブルから「Shooting」の値を読み取り、それをトースト通知に入れることができるかどうかを確認しました。それはうまくいきました。私が使用したコードは次のとおりです。

SQLiteDatabase db2 = dbHelper.getReadableDatabase();

String[] projection = { "shooting" };

String sortOrder = "shooting" + " DESC";

Cursor c = db2.query(
    "skills",       // The table to query
    projection,     // The columns to return
    null,           // The columns for the WHERE clause
    null,           // The values for the WHERE clause
    null,           // don't group the rows
    null,           // don't filter by row groups
    sortOrder       // The sort order
);

c.moveToFirst();

int shooting = c.getInt(c.getColumnIndexOrThrow("shooting"));

Toast.makeText(this, "" + shooting, Toast.LENGTH_SHORT).show();

これが機能していることを確認した後、それをコメントアウトし、プレーヤーとスキルが挿入された後にアプリを「名簿」アクティビティに切り替えるインテントを入れました。「名簿」アクティビティでは、各プレイヤーの「射撃」スキルを取得したいと考えています。上記とまったく同じコード (他のアクティビティから動作) を使用すると、次のようなエラーが表示されます。

06-16 15:59:42.602: E/AndroidRuntime(31537): java.lang.RuntimeException: アクティビティ ComponentInfo を開始できません {com.silveray.messaround/com.silveray.messaround.Roster}: java.lang.IllegalArgumentException: 列「射撃」は存在しない

SQL Create ステートメントに「shooting」列が含まれていることを知っているのに、「shooting」列が存在しないと言っている理由がわかりません。別のアクティビティから同じコードを使用して、まったく同じ列を読み取ることさえできました。

読んでくれてありがとう。何か案は?

編集: これは名簿アクティビティの完全なコードです。

public class Roster extends Activity {

    int teamID = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_roster);

        // CHECK ROSTER

        DatabaseContract dbContract = new DatabaseContract();
        DatabaseContract.DbHelper dbHelper = dbContract.new DbHelper(this);

        SQLiteDatabase dbCheck = dbHelper.getReadableDatabase();

        Intent intent = getIntent();
        int ID = intent.getIntExtra("ID", 1);
        teamID = ID;

        String stringID = String.valueOf(ID);

        String[] projection = { "_id, playerFirstName, playerLastName, playerPosition" };
        String sortOrder = "playerFirstName" + " ASC";

        Cursor c = dbCheck.query(
            "player",
            projection,
            null,
            null,
            null,
            null,
            sortOrder
        );

        c.moveToFirst();

        int rowsAffected = c.getCount();

        if (rowsAffected < 1) {
            TextView rosterList = (TextView) findViewById(R.id.txtListRoster);
            rosterList.setText("Your team doesn't have any players!");
            c.close();
            dbCheck.close();
        } else {
            String players = "";

            for (int l = 0; l < rowsAffected; l++) {            
                String playerName = c.getString(c.getColumnIndexOrThrow("playerFirstName"));
                String playerLastName = c.getString(c.getColumnIndexOrThrow("playerLastName"));     
                String position = c.getString(c.getColumnIndexOrThrow("playerPosition"));
                int playerID = c.getInt(c.getColumnIndexOrThrow("_id"));        
                String player_ID = String.valueOf(playerID);
                String pos = "";

                if (position.equals("Point Guard")) {
                    pos = "PG";
                } else if (position.equals("Shooting Guard")) {
                    pos = "SG";
                } else if (position.equals("Small Forward")) {
                    pos = "SF";
                } else if (position.equals("Power Forward")) {
                    pos = "PF";
                } else if (position.equals("Center")) {
                    pos = "C";
                }

                SQLiteDatabase db2 = dbHelper.getReadableDatabase();

                String[] projection2 = { "shooting" };

                String sortOrder2 = "shooting" + " DESC";

                Cursor c2 = db2.query(
                    "skills",
                    projection2,
                    null,
                    null,
                    null,
                    null,
                    sortOrder2
                );

                c2.moveToFirst();

                //** Everything works until this line:

                int shooting = c2.getInt(c.getColumnIndexOrThrow("shooting"));

                players += playerName + " " + playerLastName + " (" + pos + ") Shooting: ";

                if (l != (rowsAffected - 1)) {
                    players += "\n";
                }

                TextView rosterList = (TextView) findViewById(R.id.txtListRoster);
                rosterList.setText(players);

                if (l != (rowsAffected - 1)) {
                    c.moveToNext();
                }

                c2.close();
            }

            c.close();
            dbCheck.close();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.roster, menu);
        return true;
    }

    public void addPlayer(View view) {

        Intent goToAddPlayer = new Intent(this, AddPlayer.class);
        goToAddPlayer.putExtra("ID", teamID);
        this.startActivity(goToAddPlayer);
        this.finish();
        return;
    }
}
4

1 に答える 1

0
int shooting = c2.getInt(c.getColumnIndexOrThrow("shooting"));

する必要があります

int shooting = c2.getInt(c2.getColumnIndexOrThrow("shooting"));

現在、2 番目のクエリに取り組んでいますが、1 番目から列インデックスを取得しようとしています。

于 2013-06-16T21:02:39.700 に答える