1

getdate(string data) 関数からの文字列と等しい日付を持つ行のみを表示したいので、SELECT from ... コマンドを使用してリストビューにデータベースからすべてのエントリを表示していた作業関数を変更しようとしましたが、そうではありませんでした '動作しません。カレンダーからこれらのイベントを取得するにはどうすればよいですか?

私のデータベースコード全体

正しく動作する機能:

public Cursor getAllContacts() 
{
    return database.query("calendar_events", new String[] {"_id", "event"}, 
     null, null, null, null, "date");
}

私はそれを次のように変更したかった:

public Cursor getdate(String data){
    return database.rawQuery("SELECT event FROM calendar_events WHERE date = '" + data + "'", new String[] { "event"});
}

私が変更した関数のフラグメント:getAllContacts(コードは正しく機能し、カレンダーからイベントをリストビューに表示していました。クリックすると、このデータベースエントリからすべてのデータに入力できます)からgetdate( "2012-12-30") :

 private class GetContacts extends AsyncTask<Object, Object, Cursor> 
{
   DatabaseConnector dbConnector = new DatabaseConnector(DayPlan.this);

   @Override
   protected Cursor doInBackground(Object... params)
   {
      dbConnector.open();
      return dbConnector.getdate("2012-12-30"); 
   } 

   @Override
   protected void onPostExecute(Cursor result)
   {
      conAdapter.changeCursor(result); // set the adapter's Cursor
      dbConnector.close();
   } 
}

このクラスのコード全体:

私が持っているエラー:

01-02 14:32:13.828: E/AndroidRuntime(809): FATAL EXCEPTION: AsyncTask #1
01-02 14:32:13.828: E/AndroidRuntime(809): java.lang.RuntimeException: An error occured while executing doInBackground()
01-02 14:32:13.828: E/AndroidRuntime(809):  at android.os.AsyncTask$3.done(AsyncTask.java:299)
01-02 14:32:13.828: E/AndroidRuntime(809):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
01-02 14:32:13.828: E/AndroidRuntime(809):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
01-02 14:32:13.828: E/AndroidRuntime(809):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
01-02 14:32:13.828: E/AndroidRuntime(809):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-02 14:32:13.828: E/AndroidRuntime(809):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-02 14:32:13.828: E/AndroidRuntime(809):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-02 14:32:13.828: E/AndroidRuntime(809):  at java.lang.Thread.run(Thread.java:856)
01-02 14:32:13.828: E/AndroidRuntime(809): Caused by: java.lang.IllegalArgumentException: Cannot bind argument at index 2 because the index is out of range.  The statement has 0 parameters.
01-02 14:32:13.828: E/AndroidRuntime(809):  at android.database.sqlite.SQLiteProgram.bind(SQLiteProgram.java:212)
01-02 14:32:13.828: E/AndroidRuntime(809):  at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:166)
01-02 14:32:13.828: E/AndroidRuntime(809):  at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200)
01-02 14:32:13.828: E/AndroidRuntime(809):  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
01-02 14:32:13.828: E/AndroidRuntime(809):  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
01-02 14:32:13.828: E/AndroidRuntime(809):  at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
01-02 14:32:13.828: E/AndroidRuntime(809):  at com.examples.android.calendar.DatabaseConnector.getdate(DatabaseConnector.java:87)
01-02 14:32:13.828: E/AndroidRuntime(809):  at com.examples.android.calendar.DayPlan$GetContacts.doInBackground(DayPlan.java:70)
01-02 14:32:13.828: E/AndroidRuntime(809):  at com.examples.android.calendar.DayPlan$GetContacts.doInBackground(DayPlan.java:1)
01-02 14:32:13.828: E/AndroidRuntime(809):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
01-02 14:32:13.828: E/AndroidRuntime(809):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-02 14:32:13.828: E/AndroidRuntime(809):  ... 4 more

2012-12-30 の日付のみでイベントを表示するにはどうすればよいですか?

4

1 に答える 1

2

rawQuery非常に特定のクエリでのみ使用し、他の方法で実行できない場合にのみ使用することです。

クエリはかなり単純で、次のように表現する必要があります。

return database.query("calendar_events", new String[] {"_id", "event"}, 
             "date = ?", new String[] { data }, null, null, "date");

パラメータは次のとおりです。

  1. テーブル名
  2. 射影 (必要な列)。_id は非常に重要です。CursorAdapter はそれを使用してデータ内で自分の方法を見つけます。イベントはあなたが興味のあるコラムです
  3. where句。それはあなたの質問です。? 引数に置き換えられます
  4. whereArgs. ? を置き換えるために使用されます。エスケープと引用符は完全に sqlite によって処理されることに注意してください。
  5. グループ化
  6. 持つ
  7. 注文
于 2013-01-02T14:24:06.450 に答える