在我退出活动并重新启动之前,我的Android SQLite数据库查询不会返回新插入的数据

时间:2012-05-30 10:26:30

标签: android sqlite sqliteopenhelper

我在我的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()]);
}

这是将名单插入数据库的代码     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;
}

如果有人有任何想法,我会非常感谢这个问题的帮助......

2 个答案:

答案 0 :(得分:0)

很奇怪,但在每次插入后尝试db.commit()?

答案 1 :(得分:0)

好的,我发现了问题。它与Android如何处理Dialogs而不是SQLite有关。来自Android文档...

http://developer.android.com/guide/topics/ui/dialogs.html

  

如果您使用onCreateDialog(int)来管理您的状态   对话框(如上一节所述),然后每次你的   对话框被关闭,Dialog对象的状态被保留   活动。如果您决定不再需要此对象或   国家被清除是很重要的,那么你应该打电话   removeDialog(INT)。这将删除&gt;对其的任何内部引用   对象,如果对话框显示,它将解除它。

确保每次按下“加载按钮”时都完全重新创建对话框,修复了问题。以前,SQLite查询没有重新运行,因此无法为对话框提供新数据。

感谢大家的帮助!