2017-03-13 12 views
0

私のプロジェクトでは、SQLiteDatabase.query関数を使ってDBからデータを取得しています。クエリは次のとおりです。アンドロイドのSQlite WHERE句が機能しません

Cursor c = db.query("event as ev left join logo as l ON ev.logo_id = l.logo_id", 
      new String[] {"ev.event_id", "ev.name", "ev.event_date", "ev.type", "l.path"}, 
      "strftime('%m', 'now') <= ? OR (strftime('%d', 'now') <= ? " + 
        "AND strftime('%m', 'now') == ?)", 
      new String[] {"strftime('%m', ev.event_date)", "strftime('%d', ev.event_date)", 
        "strftime('%m', ev.event_date)"}, null, null, 
      "strftime('%m', ev.event_date), strftime('%d', ev.event_date) ASC", limit); 

イベントテーブルの内容:

1|День Рождения|1964-09-10 00:00:00|birthday|1 
2|День Рождения|1964-06-10 00:00:00|birthday|2 
3|День Рождения|1985-01-01 00:00:00|birthday|3 
4|День Рождения|1992-05-11 00:00:00|birthday|4 

ロゴテーブルの内容:

1|/data/data/com.example.app/app_imageDir/imageavatar_14e18a68-7049-433f-9954-fb3fea6000e1.png 
2|/data/data/com.example.app/app_imageDir/imageavatar_5dda2aec- 136e-468d-af04-ca6e74804765.png 
3|/data/data/com.example.app/app_imageDir/imageavatar_d1626db3-3f7c-474d-8294-c498f40c6892.png 
4|/data/data/com.example.app/app_imageDir/imageavatar_d2f995a1-ae3c-41fd-8bdd-c69b1566239a.png 

クエリから次のようにカーソルがEVENT_IDでイベントだけが含まれている必要があります1,2,4(3月13日にテスト済み) しかし、私がアプリケーションを起動すると、すべてのイベントが画面に表示されます。 このクエリを書き直してsqliteのコンソールから実行すると、すべて正常に動作します。

カーソルからデータを取得するためのコードは次のとおりです。

public List<Map<String, String>> getAll(Cursor c) { 
    List<Map<String, String>> data = new ArrayList<>(); 
    int counter = 0; 

    if (c.moveToFirst()) { 
     do { 
      Map<String, String> map = new HashMap<String, String>(); 
      for (String cn : c.getColumnNames()) { 
       map.put(cn, c.getString(c.getColumnIndex(cn))); 
      } 
      data.add(counter, map); 
      counter++; 
     } while (c.moveToNext()); 
    } 

    return data; 
} 

問題は何ですか?

答えて

3

変数と引数のバインディングは、文字列リテラルなどのリテラル値に対してのみ使用できます。?strftime('%m', ev.event_date)のようなバインディング式には使用できません。文字列リテラルとしてバインドされます。

式をSQLクエリ自体の一部として移動します。

関連する問題