2013-02-19 38 views
3

我確實調用了一個AsyncTask傳遞一個方法來執行,以確定一個方法從一個特定的id返回一個名爲NAME的行。在doInBackground上調用數據庫查詢/原始查詢時,它返回一個空結果的遊標,甚至在TABLE有8條記錄時試圖用查詢SELECT * FROM TABLE進行嘗試。這裏有什麼問題?查詢是否同步?如果是這樣,我應該如何編碼以防止這些問題?android sqlite查詢返回光標0結果

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

調試器總是與空結果

+1

向我們展示一些代碼。 – 2013-02-19 23:08:37

+0

如果您將rawQuery()的第二個參數設置爲null,那麼您的遊標是否仍然返回0結果?另外,你有沒有試圖擺脫WHERE子句?這在你的查詢中並不是真的需要嗎? – Barney 2013-02-19 23:41:47

+0

我擺脫了where子句,仍然得到0結果... – 2013-02-20 00:10:09

回答

0

實際問題表明它是我不得不打電話cursor.moveToFirst()甚至當我只需要得到從答案的行數。
我認爲當查詢調用獲得最後一個結果後google表示遊標時,它們可能意味着您在遍歷行時使用isAfterLast方法檢查的空行。