0

Android アプリケーションで SQLite DB を使用して、サッカー選手を保存し、所属する名簿を維持しています。これらの名簿を管理するアクティビティには、2 つのダイアログ ウィンドウを開く機能があります。1 つは現在の名簿をデータベースに保存するため、もう 1 つはデータベースから既存の名簿をロードするためです。

名簿が保存され、名簿をロードするためのダイアログが開かれると、新しく保存された名簿が既存の名簿のクエリで見つかりません。アクティビティを終了して再開すると、新しい名簿がリストされ、問題なくロードできます。

DB に既存の名簿名を照会するコードは次のとおりです。

public String[] fetchRosterNames() {        

    String query = "SELECT "+ _ID + ", " + ROSTER_NAME + ", COUNT(" + ROSTER_NAME + ") As `NUM_PLAYERS`" +
            " FROM " + TABLE_NAME + 
            " GROUP BY " + ROSTER_NAME;
    SQLiteDatabase db = getReadableDatabase();
    Cursor cursor = db.rawQuery(query, null);

    ArrayList<String> rosterNames = new ArrayList<String>();
    if(cursor.getCount() > 0){
        while(!cursor.isLast()){
            cursor.moveToNext();
            rosterNames.add(cursor.getString(1));
        }
    }       
    cursor.close();
    db.close();
    return rosterNames.toArray(new String[rosterNames.size()]);
}

名簿をDBに挿入するコードは次のとおりです public void insertRoster(String roster_name, LeagueRoster roster){

    SQLiteDatabase db = getWritableDatabase();
    Iterator<Player> players = roster.getFullRoster();

    while(players.hasNext()){

        Player player = players.next();         

        ContentValues values = new ContentValues();
        Log.e("MySQLiteHelper: insertRoster()", player.getName());

        values.put(PlayerStats.NAME.name(), player.getName());
        values.put(PlayerStats.POSITION.name(), player.getPosition().name());
        values.put(PlayerStats.TEAM.name(), player.getTeam().name());           
        values.put(ROSTER_NAME, roster_name);   

        db.insertOrThrow(TABLE_NAME, null, values);
    }

    db.close();
}

最後に、2 つの異なるダイアログを作成するアクティビティ内のコードを次に示します。

protected Dialog onCreateDialog(int id){

    AlertDialog.Builder builder = new AlertDialog.Builder(this);

    switch(id) {
    case 1:         
        final MySQLiteHelper rosterData = new MySQLiteHelper(this);
        final String[] items = rosterData.fetchRosterNames();
        builder.setTitle("Select the roster you would like to load");
        builder.setItems(items, new DialogInterface.OnClickListener(){

            @Override
            public void onClick(DialogInterface dialog, int which) {
                Log.e("Roster Names Dialog", items[which]);
                LeagueRoster loadedRoster = rosterData.fetchRoster(items[which]);
                if(loadedRoster != null){
                    roster = loadedRoster;
                    db.setRoster(roster);
                    redrawTables();
                }
            }               
        });

        dialog = builder.create();
        break;
    case 2:
    default:
        LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
        View saveRosterView = inflater.inflate(R.layout.saveroster_dialog, null);
        builder.setView(saveRosterView);

        final EditText nameField = (EditText)saveRosterView.findViewById(R.id.saveroster_dialog_editText);
        Button saveButton = (Button)saveRosterView.findViewById(R.id.saveroster_dialog_button);

        saveButton.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                MySQLiteHelper rosterData = new MySQLiteHelper(RosterActivity.this);
                String rosterName = nameField.getText().toString();
                rosterData.insertRoster(rosterName, roster);
                dialog.dismiss();
            }               
        });

        dialog = builder.create();
        break;
    }
    return dialog;
}

誰かが何かアイデアを持っていれば、この問題について助けていただければ幸いです...

4

2 に答える 2

0

奇妙ですが、各挿入後に db.commit() を試してみてください。

于 2012-05-30T10:40:07.360 に答える