对于我的应用程序,我正在尝试将highscores保存到存储在名为“ highscores.db”的android设备上的数据库中。现在我有一个问题,就是mysql不会在al处返回任何行,所以我猜想我的插入有问题或检索正在进行。我完全不知道出了什么问题(第一次使用sqlite用户)。

DBHandler.java

public class DBHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 3;
private static final String DATABASE_NAME = "highscores.db";
public static final String TABLE_HIGHSCORES = "highscores";
public static final String COLUMN_WAVE = "wave";
public static final String COLUMN_MONEY = "money";
public static final String COUKN_ZOMBIEKILL = "zombiekill";

public DBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
    super(context, name, factory, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String query = "CREATE TABLE " + TABLE_HIGHSCORES + "(" + COLUMN_WAVE + " INTEGER, " +
            COLUMN_MONEY + " DOUBLE, " +
            COUKN_ZOMBIEKILL + " INTEGER " + ")";
    db.execSQL(query);
}

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

//add new row
public boolean addHighScore(Highscore highscore) {
    ContentValues values = new ContentValues();
    values.put(COLUMN_WAVE, highscore.getWave());
    values.put(COLUMN_MONEY, highscore.getMoneyLeftOver());
    values.put(COUKN_ZOMBIEKILL, highscore.getZombiekill());
    SQLiteDatabase db = this.getWritableDatabase();
    long result = db.insert(TABLE_HIGHSCORES, null, values);
    if(result == -1){
        return false;
    }else{
        return true;
    }
}

//Get database info
public ArrayList<Highscore> getHighScores(){
    SQLiteDatabase db = getWritableDatabase();
    String query = "SELECT * FROM highscores";

    int wave = 0;
    double money = 0;
    int zombiekill = 0;
    Highscore hs = null;
    ArrayList<Highscore> highscores = new ArrayList<>();
    Cursor c = db.rawQuery(query,null);
    c.moveToFirst();

    while(c.moveToNext()){
        if(c.getString(c.getColumnIndex("wave")) != null){
            wave = Integer.parseInt(c.getString(c.getColumnIndex("wave")));
        }
        if(c.getString(c.getColumnIndex("money")) != null){
            money = Integer.parseInt(c.getString(c.getColumnIndex("money")));
        }
        if(c.getString(c.getColumnIndex("zombiekill")) != null){
            zombiekill = Integer.parseInt(c.getString(c.getColumnIndex("zombiekill")));
        }
        hs = new Highscore(wave,money,zombiekill);
        highscores.add(hs);
    }

    db.close();
    return highscores;
}


}

另外,我不知道在哪里查看此数据库以检查是否正在填充。许多人在哪里可以找到解释,但我不知道该怎么到达。

〜预先感谢

EDIT1.0更改了公共ArrayList getHighScores()

    public ArrayList<Highscore> getHighScores(){
    SQLiteDatabase db = getWritableDatabase();
    String query = "SELECT * FROM highscores";

    int wave = 0;
    double money = 0;
    int zombiekill = 0;
    Highscore hs = null;
    ArrayList<Highscore> highscores = new ArrayList<>();
    Cursor c = db.rawQuery(query,null);
    c.moveToFirst();

    while(!c.isAfterLast()){
        if(c.getString(c.getColumnIndex("wave")) != null){
            wave = Integer.parseInt(c.getString(c.getColumnIndex("wave")));
        }
        if(c.getString(c.getColumnIndex("money")) != null){
            money = Integer.parseInt(c.getString(c.getColumnIndex("money")));
        }
        if(c.getString(c.getColumnIndex("zombiekill")) != null){
            zombiekill = Integer.parseInt(c.getString(c.getColumnIndex("zombiekill")));
        }
        hs = new Highscore(wave,money,zombiekill);
        highscores.add(hs);
        c.moveToNext();
    }

    db.close();
    return highscores;
}


还是行不通

EDIT2.0:这是即时消息处理保存的方式

 DBHandler handler = new DBHandler(getApplicationContext(),null,null,1);
    for (int i = 0; i < 5; i++) {
        handler.addHighScore(new Highscore(10,30,55));
    }


这是即时消息处理检索不同文件的方式:

    DBHandler handler = new DBHandler(getActivity().getApplicationContext(), null, null, 1);
    HighScoreSingleton.getInstance().setHighscores(handler.getHighScores());

最佳答案

感谢BenjamínMolina,我发现我处理输出错误。

我只需要更新代码的处理即可。
在同一java类上进行更新,导入和选择,或创建一个单例以跟踪对dbhandler的调用实例。

DBHandler handler = new DBHandler(getActivity().getApplicationContext(), null, null, 1);
    for (int i = 0; i < 5; i++) {
        handler.addHighScore(new Highscore(10,30,55));
    }

    HighScoreSingleton.getInstance().setHighscores(handler.getHighScores());


但是我仍然发现,如果我关闭应用程序并重新启动它而没有先将新数据添加到数据库中,则所有数据都将丢失,如何从先前制作的数据库中检索该数据。

关于android - SQLite数据库不返回任何行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37192888/

10-11 19:49
查看更多