【问题标题】:SQLite Database save and retrieve scores in ListView but got 0 scoreSQLite 数据库在 ListView 中保存和检索分数但得到 0 分
【发布时间】:2018-01-05 23:28:52
【问题描述】:

这是我无法弄清楚的事情。我计划在玩家达到 0 生命后使用 SQLite 数据库来保存和检索 ListView 中的每个分数,因为它是一个无限级别。但是,所有的分数都返回 0。我不知道这个问题。

这是我的 DBHelper,

public class DBHelper extends SQLiteOpenHelper {
 private static final int DATABASE_VERSION = 1;
 private static final String DATABASE_NAME = "highscore.db";
 private static final String TABLE_HIGHSCORE = "highscore";
 private static final String COLUMN_ID = "id";
 private static final String COLUMN_SCORE = "score";



 public DBHelper(Context context) {
     super(context, DATABASE_NAME, null, DATABASE_VERSION);
 }

@Override
public void onCreate(SQLiteDatabase db) {
    String createTableSql = "CREATE TABLE " + TABLE_HIGHSCORE + "("
            + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
            + COLUMN_SCORE + " INTEGER " + ");";

    db.execSQL(createTableSql);
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_HIGHSCORE);
    onCreate(db);
}

public void addHighScore(int highscore) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(COLUMN_SCORE, highscore);
    db.insert(TABLE_HIGHSCORE,null,values);
    db.close();
}


public ArrayList<Scores> getAllScores() {
    ArrayList<Scores> scoresList = new ArrayList<>();

    String selectQuery = "SELECT " + COLUMN_ID + ", " + COLUMN_SCORE + " FROM " + TABLE_HIGHSCORE;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    if (cursor.moveToFirst()) {
        do {
            int id = cursor.getInt(0);
            int score = cursor.getInt(1);
            Scores scores = new Scores(id,score);
            scoresList.add(scores);
        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();
    return scoresList;
}

}

【问题讨论】:

  • 你在哪里初始化代码中的生命?我想这就是问题所在,因为它总是返回相同的分数,即 0
  • 我把它放在全局上,比如 left = 10;连分数也一样,但我只初始化为0
  • 我怎么知道你是零,发布完整代码
  • @Salman500 是对的。请发布您的完整代码以清楚地了解问题
  • 代码会很长。请忍受这一点。

标签: android sqlite listview


【解决方案1】:

使用 hashmap ,因为 Scores scores = new Scores(); 总是返回零并移除 score class

public ArrayList<HashMap<String,Integer>> getAllScores() {
    ArrayList<HashMap<String,Integer>> scoresList = new ArrayList<>();

    String selectQuery = "SELECT " + COLUMN_ID + ", " + COLUMN_SCORE + " FROM " + TABLE_HIGHSCORE;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    if (cursor.moveToFirst()) {
        do {
        HashMap<String,Integer> hashmap = new HashMap<>();
            int id = cursor.getInt(0);
            int score = cursor.getInt(1);
            hashmap.put("score",score);
        hashmap.put("id",id);
            scoresList.add(hashmap);
        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();
    return scoresList;
}


public class ScoreAdapter extends ArrayAdapter<HashMap<String,Integer>> {

Context context;
ArrayList<HashMap<String,Integer>> alScore;
int resource;
TextView tvScore;

public ScoreAdapter(Context context, int resource, ArrayList<HashMap<String,Integer>> scores) {
    super(context, resource, scores);
    this.context = context;
    this.resource = resource;
    this.alScore = scores;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View view = inflater.inflate(R.layout.scorerow, parent, false);

    tvScore = (TextView)view.findViewById(R.id.scores);

    HashMap<String,Integer> hashmap = alScore.get(position);
    tvScore.setText("Score: " + String.valueOf(hashmap.get("score"));

    return  view;
}

ListView lv;
ArrayAdapter aa;
ArrayList<HashMap<String,Integer>> al;

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

    lv = (ListView)findViewById(R.id.lvScoreRecord);

    DBHelper db = new DBHelper(ScoreRecords.this);
    al = db.getAllScores();

    aa = new ScoreAdapter(this, R.layout.scorerow, al);
    lv.setAdapter(aa);
    aa.notifyDataSetChanged();
    db.close();
}

【讨论】:

  • 天哪,它有效!非常非常感谢你!还有 2 个问题,如果我想检索最高分并在记录活动中显示。我是否必须在 DBHelper 类中再创建一个方法,例如 call public int getHighScore(int highscore)?另外,Hashmap 是关于什么的?这个我以前从未真正学过,所以我不知道理论以及何时实施这种方法。
  • Hashmap 包含键和值,因为 Hashmap 必须易于维护数据以获取更多信息,请访问 stackoverflow.com/questions/7975802/… tutorialspoint.com/java/java_hashmap_class.htm
  • 我没听懂你的第一个问题
  • 我的意思是,如果我想检索最高分并将其显示在记录活动中,我该怎么做?只需在 DBHelper 中创建另一个方法?
  • 我还有一个问题。我曾计划使用 SearchView,这样用户可以更轻松地根据 ID 进行搜索。但是,它没有工作
【解决方案2】:

正如您在此代码中使用的finish(),这意味着这将结束您当前的活动并转到上一个活动,我猜您以前的活动将是记录活动,这不会运行 onCreate()第二次

在注册活动上使用 onStart() 或使用意图而不是 finish() 我会说使用意图

if (left == 0) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(Level10.this);

                    builder.setTitle("Game Over");
                    builder.setMessage("You gain a total score of " + score + "! Click back!");
                    builder.setCancelable(false);
                    builder.setPositiveButton("Back", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dbHelper.addHighScore(score);
                            dbHelper.close();
                            //finish();
                Intent i = new Intent(this,RegisterActivity.class);
                startActivity(i);


                        }

//注册活动

ListView lv;
ArrayAdapter aa;
ArrayList<Scores> al;

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

    setList();
}



    @Override
    protected void onStart() {
        super.onStart();

        setList();
    }


    public void setList()
    {
        lv = (ListView)findViewById(R.id.lvScoreRecord);

        DBHelper db = new DBHelper(ScoreRecords.this);
        al = db.getAllScores();

        aa = new ScoreAdapter(this, R.layout.scorerow, al);
        lv.setAdapter(aa);
        aa.notifyDataSetChanged();
        db.close();
    }

【讨论】:

  • 你之前的活动是RegisterActivity
猜你喜欢
  • 2017-03-12
  • 2013-06-28
  • 1970-01-01
  • 2012-06-29
  • 2013-06-02
  • 2016-11-18
  • 2011-09-24
  • 2011-12-30
  • 1970-01-01
相关资源
最近更新 更多