SimpleCursorAdapter + Sqliteを使用してもListActivityでは機能しないようです

私はちょうど私のアプリのための非常に単純なスコア画面を構築し始めたが、何も起こっていないようだと私は理由を把握することはできません。

ListActivity:

public class HighScoresActivity extends ListActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.high_scores);

        ScoresDatabase db = new ScoresDatabase(this);
        Cursor data = db.getHighScores();

        ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, data, new String[] { "level" }, new int[] { R.id.level_text });
        setListAdapter(adapter);

        data.close();
        db.close();
    }
}

high_scores.xml:

<?xml version="1.0" encoding="utf-8"?>


    

    


エラーメッセージはまったくありません。単純に何も起こりません。 そのカーソルが空でないということではなく、adapter.getCount()メソッドをテストすると、〜30が返されます。これは、まさに期待どおりです。

私はすべての関数名がかなり直感的だと思いますが、何か明確化が必要な場合は、ただ質問してください。

どんな援助も大きく改善されています

0

4 答え

data.close();//DON'T DO THIS

Cursor.close()のドキュメントから

カーソルを閉じて、すべてのリソースを解放し、完全に無効にします。 deactivate()とは異なり、requery()の呼び出しはカーソルを再び有効にしません。

ListView Adapter は 'live' Cursor を持っていなければ機能しません。また、データベースを閉じることは必ずしも良いことではなく、特定のケースで(私の経験では)悪影響を及ぼす可能性があります - それが問題の原因になるかどうかはわかりません。

EDIT: In light of Dave Newton's comment and having checked some of my own code, the problem will be with calling close() on both the Cursor and also the database. In short, remove the following lines...

data.close();
db.close();
1
追加された
@デイブ:はい、そうです。私は約6ヶ月前にSimpleCursorAdapterをListViewとともに使用して書いた独自のコードをチェックしています。明らかに、そこには、(私が当初試みた)データベース上で close()を呼び出さないよう警告するコメントが残っています。
追加された 著者 Squonk,
それは問題を引き起こすので、私の答えのコメントは、私はdb、データではありませんが、私が間違って貼り付けたcuzと述べたが。この問題は他の問題で隠されていたと思いますが、私は思っています。
追加された 著者 Dave Newton,
これは修正されませんでしたが、それはソリューションの一部でした。それを機能させるために、私はLineAdapter = new SimpleCursorAdapter(これはR.layout.high_scores_entry、data、新しいString [] {"level"、 "moves"}、新しいint [] {R. id.level_entry、R.id.moves_entry});この方法では、データがビューに正しくバインドされています。以前はドキュメントを誤解していました
追加された 著者 Mark D,

あなたは電話する必要があります...

db.open();

onCreate()の始めに。

これにより、データベースが開き、データを取得できます。

0
追加された
うーん、私はOPが ScoresDatabase クラスにラップされていることを暗示して、 adapter.getCount()が働いていると思っていますが、それについては推測しています。
追加された 著者 Dave Newton,
Dave氏によると、アダプタの中にはいくつかの要素が含まれていると言われているため、データベースの側面が動作しているように見えます(これを確認するためにカーソル自体をテストしました)。また、SQLiteOpenHelperを継承するScoresDatabaseにはopen()メソッドはありません。
追加された 著者 Mark D,

SimpleCursorAdapter ctorの最後のパラメータは、リストレイアウトのフィールド android.R.id.text1 のIDにする必要があります。

R.id.level_text はヘッダーとして使用しているテキストフィールドのIDです。そのテキストはレイアウトファイル内の文字列リソースから設定するか、レイアウトを再利用する場合は onCreate メソッドで動的に設定する必要があります。

0
追加された
@ Mark あなたのLinearLayoutです。どのような塗りつぶし/折り返しがあるかを確認する。うーん、それはまだ私のために働いている。待って。
追加された 著者 Dave Newton,
@MarkD「レベル」という列がありますか? getHighScores()はどのようなものですか?私はこれがうまくいかないようにすることはできません。
追加された 著者 Dave Newton,
@MarkDこれはdb.close()です。私はあなたがそれをそこに呼びたいとは思わない。クラップ、2つの答えを得るための方法はありません;)
追加された 著者 Dave Newton,
@MarkD 最後に同じことを言っている他の人を見つけました。私は裏付け文書を見つけることができませんでした。 こちらをご覧ください JDBC ResultSet のようなものでしたが、私はまだ公式のドキュメントを見ていません。
追加された 著者 Dave Newton,
私はそれをListAdapterアダプタ=新しいSimpleCursorAdapter(これはandroid.R.layout.simple_list_item_1、データ、新しい文字列[] {"レベル"}、新しいint [] {android.R.id.text1});に変更しました。しかし、まだ同じ結果 - 何も:/
追加された 著者 Mark D,

私の最初のコードには2つの問題がありました。

最初はMisterSquonkが指摘したように、カーソルとデータベースを早めに閉じます。

2つ目は、データをビューに正しくバインドすることでした。

ここに私の今働いている解決策のコードがあります

HighScoresActivity:

public class HighScoresActivity extends ListActivity {

    private Cursor data;
    private ScoresDatabase db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.high_scores);

        db = new ScoresDatabase(this);
        data = db.getHighScores();

        ListAdapter adapter = new SimpleCursorAdapter(
                this, 
                R.layout.high_scores_entry, data, 
                new String[] { "level", "moves" }, 
                new int[] { R.id.level_entry, 
                R.id.moves_entry });

        setListAdapter(adapter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        data.close();
        db.close();
    }
} 

high_scores.xml:

<?xml version="1.0" encoding="utf-8"?>

    

high_scores_entry.xml:

<?xml version="1.0" encoding="utf-8"?>

    
    

最初にデータをバインドした方法は意味をなさない。

0
追加された