Java 本地高分Android应用程序的SQLite数据库。如何打开所有数据,然后覆盖所有数据?

Java 本地高分Android应用程序的SQLite数据库。如何打开所有数据,然后覆盖所有数据?,java,android,database,sqlite,Java,Android,Database,Sqlite,我发现了很多关于SQlite的例子。我没有使用这种语言的经验,但Android建议使用该数据库在本地保存内容。我就是解决不了这个问题。我有以下内容(根据一个例子改编): 在我的(主要)活动中,我有: protected SQLiteDatabase db; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Other code

我发现了很多关于SQlite的例子。我没有使用这种语言的经验,但Android建议使用该数据库在本地保存内容。我就是解决不了这个问题。我有以下内容(根据一个例子改编):

在我的(主要)活动中,我有:

protected SQLiteDatabase db;
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    // Other code
    db = (new DatabaseHelper(this)).getWritableDatabase();
}
要插入我使用的数据,请执行以下操作:

    String dateFormat = "dd/MM";
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
    String date = sdf.format(cal.getTime());

    ContentValues values = new ContentValues();
    values.put("Curscore", score);     // score is a public integer
    values.put("Curmode", gamemode);   // gamemode is a public integer
    values.put("Curdiff", difficulty); // difficulty is a public integer
    values.put("Curdate", date);
    db.insert("scoretable", null, values);
问题:我现在唯一想要的是一个从“scoretable”检索所有数据的函数。然后我将操纵它(我比较分数并插入新分数,如果分数足够高,我将能够自己处理)。之后,我想用新的数据覆盖旧数据。(10-1)为什么我当前的代码无法工作


提前谢谢

您应该使用类的方法从highscores表中检索所有行,这将为您提供一个可以循环的对象。您可以使用、和方法来执行所需的操作。

您所描述的方法没有在现实生活中使用,原因有几个,其中之一是随着数据库变大,您将占用太多的内存空间

如果我很理解您的问题,您甚至不需要检索数据,只需在update方法中传递right where子句

下面的代码只是一种将highscore更改为500的方法,如果highscore当前低于playerId为5的行中的highscore

int highscore = 500;
int playerId = 5;

ContentValues cv=new ContentValues();
cv.put("highscore", highscore);

String where = "id=? AND highscore<?";
String[] whereArgs = {Integer.toString(playerId), Integer.toString(minimalScore};

db.update("scoretable", cv, where , whereArgs);   

您应该查看有关insert语句的sqlite文档。使用android方法,不需要编写真正的SQL代码

@Jan Henk:如果我正确地检查光标,我可以以“数组”的形式检索数据,每个数组都有一个“名称”、“分数”和“游戏模式”。我应该是这样的:游标tmpcursor=db.query(“scoretable”,null,null,null,GroupBy??,null,null,null);然后我让光标从表中的第一个“数据”移动到“最后一个”,将它们保存在循环上的一个数组中?这是否正确?有关如何使用光标的示例,请参阅本文:特别是标题为“读取检索到的数据”的部分。这篇文章是关于内容提供商的,但是使用sqlite数据库是类似的。我确实想在新的分数高于仍然适合“高分屏幕”的最低分数时更新数据库。我只是觉得加载所有数据,然后对其进行操作,然后将其保存回去会更容易。(问题是互联网上的所有教程都使用“execSQL”命令,我一点也不懂)。我将尝试让它工作起来,然后回到这里。我正在使用android提供的特定方法来更新行。您可以使用execSQL来执行,但是您必须自己键入整个SQL语句。execSQL()可用于执行任何非SELECT语句。我建议的方法只是将语句构建从您的手中解放出来,并将注意力集中在应用程序的逻辑上。如果遇到任何问题,请告诉我。我现在了解代码的作用。它检查玩家ID为5的玩家的分数,当分数(500)高于之前的分数时,它将覆盖该分数。这不是我想要的。我希望玩家在比赛结束后填写自己的名字(如果分数足够高的话)。它会将分数与列表中已有的分数进行比较,并将其放在较高分数的下方和较低分数的上方。另外,据我所知,“id=”和HighScore您可以将分数添加到数据库中,而不进行任何比较。排序用于检索数据时。如果您想显示数据并检索数据,只需添加一个ORDER BY子句,用户将以正确的顺序查看所有内容。(最高分数在顶部).The?只是SQL准备语句的一部分。但是,如果存储所有数据,则每次玩游戏时,数据库都会增长?我知道这可能不会占用很多存储空间,但在我看来,删除不再使用的数据是合乎逻辑的(示例:保存前5名分数,删除其余分数,因为它不会显示)。另外,我今天没有时间做我的项目。我将尝试明天修复它。
int highscore = 500;
int playerId = 5;

ContentValues cv=new ContentValues();
cv.put("highscore", highscore);

String where = "id=? AND highscore<?";
String[] whereArgs = {Integer.toString(playerId), Integer.toString(minimalScore};

db.update("scoretable", cv, where , whereArgs);   
int lowestAllowableScore = 100;

db.delete("scoretable", "score<?", new String[] {Integer.toString(lowestAllowableScore)});
ContentValues value=new ContentValues();
    value.put("score", curscore); // We want to put curscore in the new row in the score column
    value.put("mode", curmode);
    value.put("diff", curdiff);
    value.put("date", curdate);
db.insert("scoretable",null,value);