1

基本的に、データベースからリストビューを作成するメソッドがあります。

カーソルにnullポインタがあり、「アクティビティを停止できません」というエラーが表示されます。

これが私がカーソルを返す方法です:

public Cursor getAppointmentsData() {
    String[] columns = new String[] { KEY_ROWAPPID, KEY_NAMEAPP,
            KEY_TYPEAPP, KEY_TIMEAPP, KEY_DATEAPP, KEY_COMMENTAPP };
    Cursor c = ourDatabase.query(DATABASE_TABLEAPP, columns, null, null,
            null, null, KEY_NAMEAPP + " ASC", null);

    if (c != null) {
        if (c.getCount() > 0 && c.moveToFirst())

        {
            c.moveToFirst();

            return c;

        }

    }
    c.close();
    return null;
}

データベースが空の場合、つまりデータがない場合、データベースはクラッシュします...データがある場合は問題ありません。これにより、カーソルからnull値を返していると思います。

カーソルを返すこのメソッドの問題を確認できますか?

簡単な質問で申し訳ありませんが、コードを分解する前に、ここで質問すると思いました。

新しい編集:

public Cursor getAppointmentsData(){String [] columns = new String [] {KEY_ROWAPPID、KEY_NAMEAPP、KEY_TYPEAPP、KEY_TIMEAPP、KEY_DATEAPP、KEY_COMMENTAPP}; カーソルc=ourDatabase.query(DATABASE_TABLEAPP、columns、null、null、null、null、KEY_NAMEAPP + "ASC"、null);

    if (c != null) {

            c.moveToFirst();

        }
    c.close();
    return c;

}
4

1 に答える 1

1

次のことができるはずです

if (c.moveToFirst()){
    return c;
}

これは、query()メソッドがnullを返さないためです。空のカーソルを返すだけです。したがって、nullかどうかを確認する必要はありません。また、moveToFirst()最初の行に移動できない場合(つまり、カーソルが空の場合)はfalseと評価されます。したがって、カウントチェックは冗長です。

ただし、メソッドからnullを返しても安全ですか?結果がない場合は、明示的にnullを返します。また、戻り後にメソッドが呼び出されることはないことに注意してくださいclose()(結果のあるカーソルがある場合)。

メソッドにカーソルが返されたらどうなるか完全にはわかりませんが、単にカーソルを返すことをお勧めします。しかし、私はあなたが望むのは単に

public Cursor getAppointmentsData() {
    String[] columns = new String[] { KEY_ROWAPPID, KEY_NAMEAPP,
            KEY_TYPEAPP, KEY_TIMEAPP, KEY_DATEAPP, KEY_COMMENTAPP };
    return ourDatabase.query(DATABASE_TABLEAPP, columns, null, null,
            null, null, KEY_NAMEAPP + " ASC", null);
}

更新-カーソルを閉じるタイミングについて

カーソルを閉じると、カーソルを返す前に、メソッドgetAppointmentsData()は閉じたカーソルを返します。私はこれがあなたが求めているものではないと確信しています。この段階ではカーソルが終わっていないので、自分でクリーンアップするには時期尚早です:)

あなたが求めているのはこのようなものです。getAppointmentsData()まず、上で提案した方法を使用します。これはカーソルを閉じず、カーソルを返すだけです。次に、カーソルアダプタを次のように作成します

public CursorAdapter myCursorAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    //... all your stuff
    myCursorAdapter = new CursorAdapter(this, getAppointmentsData());
}

ここで、カーソルアダプタをListViewに渡します。この段階で、ListViewは基になるカーソルを使用できます(閉じられていない:Pのように、まだライブであるため)。次に、アプリケーションでカーソルが不要になったことを確認したら、カーソルを閉じます。あなたの活動が破壊されたときにそれをすることをお勧めします

@Override
public void onDestroy() {
   myCursorAdapter.getCursor().close(); 
}
于 2013-03-14T01:12:09.087 に答える