2016-10-07 11 views
0

ジャンルに基づいて音楽をクエリしようとしています。そして、それぞれの音楽には異なるジャンルが設定されています。だから私のList<Music> genreの値はpop, rnbです。しかし、私はこれで行のデータを取得することができません。私は1つのStringを使ってデータを取得することしかできませんでしたが、List<String>ではデータを取得できませんでした。私はList<Music> musicListList<String> genreを渡すと値は得られません。私もコードをデバッグしようとし、null値を取得しています。 List<String>の値を使用してどのように結果を得ることができますか?android sqliteリストを使用して行を選択<String>

例 音楽テーブル

id | title  | genre | artist 
----------------------------------- 
1 | MusicTest | pop, rnb | John 
4 | Test  | rnb  | Jude 

Genre 
id genre 
1 pop 
2 rnb 
3 rock 

Genre Tags 
id genre_id music_id 
1  1   1 
2  1   1 
3  3   4 

期待される結果がでなければなりません

Music 
Test 

これは私の検索クエリ方法です。私はこれは私がデータ

トーストにそれを取得する方法であると私は値にpop, rnb

を得ることができた

public List<Music> getMusic(List<String> genres) { 
     List<Music> musicList= new ArrayList<>(); 
     int size = genre.size(); 
     Music music = new Music(); //getting null here 

     sqLiteDatabase = this.getReadableDatabase(); 
     try { 
      for(int i = 0; i < size; i++) { 
       Cursor cursor = sqLiteDatabase.rawQuery("SELECT a.title AS MusicTitle" 
        + ", GROUP_CONCAT(t.genre) AS Genre FROM music AS a" 
        + " LEFT JOIN genre_tags AS gt ON gt.id_music = a.music_id" 
        + " LEFT JOIN genre AS g ON g.genre_id = gt.id_genre" 
        + " WHERE g.genre LIKE '%" + genres + "%'" 
        + " GROUP BY a.music_id, a.title", null); 
        cursor.moveToFirst(); 

       while (!cursor.isAfterLast()) { 
        music.setTitle(cursor.getString(0)); 
        musicList.add(music); //getting null here 
        cursor.moveToNext(); 
       } 
       cursor.close(); 
      } 
      sqLiteDatabase.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      sqLiteDatabase.close(); 
     } 
     return musicList; //returns size = 0 
    } 

は、単一のジャンルから

public List<Music> getMusic(String genre) { 
     List<Music> musicList= new ArrayList<>(); 
     sqLiteDatabase = this.getReadableDatabase(); 
     Music music = new Music(); 

     Cursor cursor = sqLiteDatabase.rawQuery("SELECT a.title AS MusicTitle" 
        + ", GROUP_CONCAT(t.genre) AS Genre FROM music AS a" 
        + " LEFT JOIN genre_tags AS gt ON gt.id_music = a.music_id" 
        + " LEFT JOIN genre AS g ON g.genre_id = gt.id_genre" 
        + " WHERE g.genre LIKE '%" + genre + "%'" 
        + " GROUP BY a.music_id, a.title", null); 
        cursor.moveToFirst(); 

       while (!cursor.isAfterLast()) { 
        music.setTitle(cursor.getString(0)); 
        musicList.add(music); 
        cursor.moveToNext(); 
       } 
       cursor.close(); 
     return musicList; 
    } 

をデータを取得するクエリを更新しました

 Intent intent = this.getIntent(); 
     Bundle bundle = intent.getExtras(); 

     TextView textView = (TextView) findViewById(R.id.main); 
     List<String> genre= (List<String>)bundle.getSerializable("selectedGenres"); 

ただし、ここにデータを渡すときmusicList私は取得しません任意の値

DatabaseHandler db = new DatabaseHandler(this); 
    List<Music> musicList= db.getMusic(genre); 

    assert musicList!= null; 
    String a = ""; 
    for(Music ms : musicList) { 
     a = a + ms.getTitle() + "\n"; 
    } 
    textView.setText(a); 
+0

音楽の音楽=新しい音楽();このオブジェクトをカーソルループの外側に作成してください –

+0

@brahmyadigopulaまだ動作していません –

+0

ここでグループ連結を使用する必要がありますhttp://dba.stackexchange.com/questions/19121/combine-column-from-multiple-rows-into- 1行のsqliteとここにもhttp://www.sqlite.org/lang_aggfunc.html#groupconcat –

答えて

0

、あなたはlike必要はありません。次のようにSQLをビルドします。

-- test setup 
CREATE TABLE Music (
    `id` INTEGER PRIMARY KEY AUTOINCREMENT, 
    `title` TEXT, 
    `artist` TEXT 
); 
CREATE TABLE genre (
    `id` INTEGER PRIMARY KEY AUTOINCREMENT, 
    `genre` TEXT 
); 
CREATE TABLE GenreTags (
    `id` INTEGER PRIMARY KEY AUTOINCREMENT, 
    `genre_id` INTEGER, 
    `music_id` INTEGER 
); 

insert into music(title,artist) 
values ('MusicTest','John'), ('Test','Jude'); 

insert into genre(genre) 
values ('pop'),('rnb'),('rock'); 

insert into genretags(music_id,genre_id) 
values (1,1),(1,2),(2,3); 

-- the query 

select title 
from music m 
where id in(
    select mg.music_id 
    from GenreTags mg 
    join Genre g on g.id = mg.genre_id 
    where genre in (
    -- build this line from List<String> genres 
    'pop','rnb' 
    ) 
    group by mg.music_id 
    having count(*) = 2 -- genres.size() 
) 
+0

これを試しましたが、まだ値を取得できません –

+0

musicList返信する常に0を返します –

+0

SQLiteのDBブラウザでOKを実行します。 'rawQuery()'に渡された文字列を確認してください。 – Serg

0

使用このコードを編集した質問に示すように、M-m個のテーブルを持つ

public List<Music> getMusic(List<Music> genres) { 
    List<Music> musicList= new ArrayList<>(); 
    int size = genre.size(); 

    sqLiteDatabase = this.getWritableDatabase(); 
    try { 
     for(int i = 0; i < size; i++) { 
      Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM "+ TABLE_MUSIC, null); 
      cursor.moveToFirst(); 

      while (!cursor.isAfterLast()) { 
       Music music = new Music(); 
       String title = music.setTitle(cursor.getString(1)); 
       if(soundex(genre.equals(title)) 
       { 
        musicList.add(music); 
       } 

       cursor.moveToNext(); 
      } 
      cursor.close(); 
     } 
     sqLiteDatabase.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     sqLiteDatabase.close(); 
    } 
    return musicList; 
} 


public static String soundex(String s) { 
    try { 
     char[] x = s.toUpperCase().toCharArray(); 
     char firstLetter = x[0]; 

     // convert letters to numeric code 
     for (int i = 0; i < x.length; i++) { 
      switch (x[i]) { 

       case 'B': 
       case 'F': 
       case 'P': 
       case 'V': 
        x[i] = '1'; 
        break; 

       case 'C': 
       case 'G': 
       case 'J': 
       case 'K': 
       case 'Q': 
       case 'S': 
       case 'X': 
       case 'Z': 
        x[i] = '2'; 
        break; 

       case 'D': 
       case 'T': 
        x[i] = '3'; 
        break; 

       case 'L': 
        x[i] = '4'; 
        break; 

       case 'M': 
       case 'N': 
        x[i] = '5'; 
        break; 

       case 'R': 
        x[i] = '6'; 
        break; 

       default: 
        x[i] = '0'; 
        break; 
      } 
     } 

     // remove duplicates 
     String output = "" + firstLetter; 
     for (int i = 1; i < x.length; i++) 
      if (x[i] != x[i - 1] && x[i] != '0') 
       output += x[i]; 

     // pad with 0's or truncate 
     output = output + "0000"; 
     return output.substring(0, 4); 
    } catch (Exception ex) { 
     logger.info("Soundex Exception - " + ex.getMessage()); 
    } 

    return ""; 
} 
関連する問題