1

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

7 に答える 7

2
public void updateScores(List<Score> score)

への変更

public static void updateScores(List<Score> score) 

なんで?

静的呼び出しを使用しているため

DatabaseHandler.updateScores(listScore)
于 2013-02-07T06:11:54.707 に答える
2

静的参照でメソッドにアクセスしているため

DatabaseHandler.updateScores(listScore);   

クラス名を持つことを意味します..

DatabaseHandlerクラスのインスタンスを作成し、そのメソッドを使用する必要があります。

または、次のupdateScoresような静的メソッドを作成します。

static public void updateScores()

DatabaseHandlerしかし、クラスにもっと多くのコードがあるとは思えません。(そのsqliteデータベースヘルパークラスとして、このクラスでアクティビティコンテキストを使用しています)クラスのインスタンスを作成し、インスタンスでDatabaseHandlerメソッドupdateScores()を使用することをお勧めします。

于 2013-02-07T06:13:18.397 に答える
1

エラーメッセージは、問題を正確に示しています。非静的メソッドを静的な方法で参照しています。2つの可能性があります:1.静的メソッドが必要です(他の回答を参照)2.非静的メソッドが必要です。次に、この発信者スニペットを使用します。

DatabaseHandler helper = new DatabaseHandler();
helper.updateScores(listScore);
于 2013-02-07T06:16:28.253 に答える
1

メソッドupdateScoresstatic次のように変更します。

 public static void updateScores(List<Score> score)
于 2013-02-07T06:13:17.153 に答える
1

エラーは、クラス名を使用して非静的メソッドを呼び出しているためです。このエラーを克服するには、次のいずれかを実行する必要があります 1 。メソッド updateScores を static または 2 にします。DatabaseHandler のインスタンスを作成し、そのオブジェクトを使用してメソッドを呼び出します。

クラス名を使用してメソッドを呼び出すには、メソッドが静的である必要があります

于 2013-02-07T06:24:42.203 に答える
1
DatabaseHandler dbh = new DatabaseHandler();
dbh.updateScores(listScore);
于 2013-02-07T06:16:03.917 に答える
1

メソッドを作成することもできます

public void updateScores(リストスコア)

静的として、または**DatabaseHandler **呼び出し元クラスでのオブジェクトを作成できます。

スコアリスト

于 2013-02-07T06:16:06.427 に答える