我正在编写一个Android应用程序并收到此错误,但我不确定原因。有人可以帮我理解为什么我会收到这个错误吗?
Cannot make a static reference to the non-static method updateScores(List<Score>) from the type DatabaseHandler
以下是相关代码。
public class ScoreList extends SherlockFragmentActivity {
List<Score> listScore = new ArrayList<Score>();
public void updateListView() {
listViewScore.setAdapter(new ScoreListAdapter(ctx,
R.layout.score_row_item, listScore));
DatabaseHandler.updateScores(listScore);
}
}
这是DatabaseHandler类。我尝试将函数设置为静态,但由于错误,它将无法正常工作。
public class DatabaseHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "scoreKeeper";
private static final String TABLE_GAMES = "games";
private static final String KEY_NAME = "name";
private static final String KEY_CHANGE = "scoreChange";
private static final String KEY_TOTAL = "scoreTotal";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_GAMES_TABLE = "CREATE TABLE " + TABLE_GAMES + "("
+ KEY_NAME + " INTEGER PRIMARY KEY," + KEY_CHANGE + " TEXT,"
+ KEY_TOTAL + " TEXT" + ")";
db.execSQL(CREATE_GAMES_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_GAMES);
onCreate(db);
}
public void addScore(Score score) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, score.getName());
values.put(KEY_CHANGE, score.getScoreChange());
values.put(KEY_TOTAL, score.getScoreTotal());
// Inserting Row
db.insert(TABLE_GAMES, null, values);
db.close();
}
public List<Score> getAllScores() {
List<Score> scoreList = new ArrayList<Score>();
String selectQuery = "SELECT * FROM " + TABLE_GAMES;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
Score score = new Score("","","");
score.setName(cursor.getString(0));
score.setScoreChange(cursor.getString(1));
score.setScoreTotal(cursor.getString(2));
// Adding contact to list
scoreList.add(score);
} while (cursor.moveToNext());
}
return scoreList;
}
public void updateScores(List<Score> score) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DROP TABLE IF EXISTS " + TABLE_GAMES);
onCreate(db);
ContentValues values = new ContentValues();
for(int i = 0; i < score.size(); i++){
values.put(KEY_NAME, score.get(i).getName());
values.put(KEY_CHANGE, score.get(i).getScoreChange());
values.put(KEY_TOTAL, score.get(i).getScoreTotal());
}
}
}
答案 0 :(得分:2)
public void updateScores(List<Score> score)
更改为
public static void updateScores(List<Score> score)
为什么?
因为您使用静态调用
DatabaseHandler.updateScores(listScore)
答案 1 :(得分:2)
因为您正在使用静态引用
访问该方法DatabaseHandler.updateScores(listScore);
表示班级名称..
您必须创建DatabaseHandler
类的实例并使用该方法。
或者将updateScores
设为静态方法,例如
static public void updateScores()
但我怀疑你在DatabaseHandler
课程中有更多代码。 (作为其sqlite数据库助手类,您在此类中使用了Activity上下文)所以最好使DatabaseHandler
类的实例并使用方法updateScores()
和实例。
答案 2 :(得分:1)
将方法updateScores
更改为static
,如下所示:
public static void updateScores(List<Score> score)
答案 3 :(得分:1)
DatabaseHandler dbh = new DatabaseHandler();
dbh.updateScores(listScore);
答案 4 :(得分:1)
您可以制作方法
public void updateScores(List score)
作为静态,或者您可以在调用者类中创建**DatabaseHandler **
的对象:
得分列表
答案 5 :(得分:1)
错误消息告诉您exectly问题:您以静态方式引用非静态方法。 有两种可能性: 1.你想要静态方法(见其他答案) 2.你想要非静态方法。然后使用此调用者代码段:
DatabaseHandler helper = new DatabaseHandler();
helper.updateScores(listScore);
答案 6 :(得分:1)
错误是因为您使用类名调用非静态方法。要克服此错误,您必须执行以下任何一项操作 1。使您的方法updateScores为静态或 2。创建DatabaseHandler的实例并使用该对象调用该方法。
使用类名调用方法需要方法为静态