【问题标题】:SQLite db not returning any rowsSQLite 数据库不返回任何行
【发布时间】:2016-05-12 16:44:00
【问题描述】:

对于我的应用程序,我正在尝试将高分保存到存储在我的 android 设备上名为“highscores.db”的数据库中。现在我遇到一个问题,mysql 根本没有返回任何行,所以我猜我的插入出错或检索正在进行。我完全不知道出了什么问题(第一次使用 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 更改了 public 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());

【问题讨论】:

  • 你添加了多少行。如果你只添加了一行。根据你的 movetofisrt call n den movenext call ,你不会得到任何数据。
  • 你的代码工作正常,我复制了你的方法,我可以检索值。您的问题是您如何使用这些方法。检查您是否在本课程之外正确处理高分数据。
  • 但是,现在我需要弄清楚一旦我重新启动应用程序后如何从数据库中检索数据,因为它只会在我插入数据时检索数据,然后再检索它,而不是在旧版本上单独检索分贝

标签: android mysql sqlite


【解决方案1】:

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

我只需要更新代码的处理方式。 在同一个 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());

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2011-07-24
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多