2017-07-30 69 views
0

这是我无法弄清楚的。我曾计划使用SQLite数据库在玩家达到0次生命后保存并检索ListView中的每个分数,因为它是无限级别。但是,所有的分数都返回给我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

你在哪里初始化代码中的生活?我猜这就是问题所在,因为它总是返回相同的分数,即0 – Mandy8055

+1

我把它放在全局像左= 10;即使得分也是相同的,但我只初始化为0 –

+1

我应该怎么知道你是零,发完整的代码 – Salman500

回答

2

使用散列映射,因为成绩得分=新分数();总是返回零,并删除比分类

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(); 
} 
+0

Omg,它的工作!非常非常感谢你!还有2个问题,如果我想检索最高分并且还在记录活动中显示。我必须在DBHelper类中创建另一个更多方法,如调用public int getHighScore(int highscore)?另外,什么是Hashmap about?这一个我从来没有真正学过,所以我不知道理论和何时实施这种方法。 –

+0

Hashmap包含key和value作为Hashmap 必须易于维护数据以获取更多信息访问https://stackoverflow.com/questions/7975802/when-to-use-hashmap-over-linkedlist-or-arraylist-and-vice-如果我希望检索最高分并将其显示在记录活动中,我会如何处理这个问题 https://www.tutorialspoint.com/java/java_hashmap_class.htm – Salman500

+0

我不明白你的第一个问题 – Salman500

0

在你的代码使用的是结束(),那意味着这是结束当前的活动,并转到以前的活动,我猜测,你以前的活动将记录活动,这不会对注册活动运行的onCreate()第二次

使用在onStart(),或使用意图,而不是结束() 我想说的使用意图

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(); 
    } 
+0

它仍然给0 ... –

+0

你以前的活动是注册活动 – Salman500