3

NAME特定の ID から名前が付けられた行を返すメソッドを確実にするために、実行するメソッドを渡す AsyncTask を呼び出します。doInBackground でデータベース クエリ/生のクエリを呼び出すとSELECT * FROM TABLE、TABLE に 8 つのレコードがある場合にクエリで試しても、結果が null のカーソルが返されます。ここで何が問題なのですか?クエリは同期されていませんか? もしそうなら、この種の問題を防ぐためにどのようにコーディングすればよいですか?

EDIT

...
final TextView tv = (TextView)findViewById(R.id.textView);

dao.retrieveMovieByIdAsync(1, new AsyncTaskCaller() {
    @Override
    public void execute(Movie result) {
        tv.setText(result.get_Name());
    }});
...

private class AsyncRetieveQuery extends AsyncTask<Method, Void, Movie>
{
    private Object args;
    private AsyncTaskCaller signal;

    public AsyncRetieveQuery(Object args, AsyncTaskCaller signal) {
        this.args = args;
        this.signal = signal;
    }

    @Override
    protected Movie doInBackground(Method... params) {
        params[0].setAccessible(true);
        try {
            return (Movie) params[0].invoke(DBUtils.this, new Object[] {args});
        } catch (Exception e) {
            return null;
        }
    }

    @Override
    protected void onPostExecute(Movie result) {
        signal.execute(result);
        super.onPostExecute(result);
    }
}
...
public void retrieveMovieByIdAsync(int id, AsyncTaskCaller resultMethod)
{
    try {
        new AsyncRetieveQuery(id,resultMethod).execute(DBUtils.class.getDeclaredMethod("retrieveMovieById", int.class));
    } catch (NoSuchMethodException e) {}
}
...
private Movie retrieveMovieById(int id)
{
    Cursor cursor = database.rawQuery("SELECT * FROM " + SQLiteHelper.TABLE_MOVIES_NAME + " WHERE _Id = ?", new String[] {String.valueOf(id)});

デバッガーは常に null の結果を表示します

4

1 に答える 1

0

実際の問題はcursor.moveToFirst()、回答から行数を取得するだけでよい場合でも、呼び出す必要があったことです。
クエリ呼び出しが最後の結果を取得した後にグーグルがカーソルを言ったとき、それらはおそらく行isAfterLastを反復するときにメソッドでチェックするヌル行を意味していたと思います。

于 2013-03-27T22:10:13.857 に答える