2016-04-27 9 views
1

Sqlite/Androidデータベースからデータを繰り返し返す時間がたくさんあります。私はアンドロイドのカーソルで繰り返さずにコードを取得したい。毎回取得していますランダム返信Sqliteのデータアンドロイド返信せずにランダムデータが必要です

助け、私の英語

を気の毒にしてください。ここに私のクエリです:

public Cursor getQuizQuiestion(String cat, String level, String questionNo) { 
    String QUERY_SELECT_QUIESTION = "SELECT * FROM " +TABLE_QUIESTION +" WHERE "+COL_CAT+ " = '" +cat+"' AND " 
      +COL_LEVEL+ " = " +level+" ORDER BY RANDOM() LIMIT 1"; 

    Cursor cursor = db.rawQuery(QUERY_SELECT_QUIESTION, null); 

    return cursor; 
} 

答えて

0

私は私のプロジェクトで使用するとシンプルな例を持っています。私はMayBe ITの助けと思います。

public ArrayList<ModelRandomList> getRandomData(String city){ 

    ArrayList<ModelRandomList> modelRandomListArrayListLists = new ArrayList<ModelRandomList>(); 


    String queryRandomData ="SELECT DISTINCT * FROM "+TABLE_NAME+" WHERE "+COL_CITY + "=?"+ "Order BY RANDOM()"; 

    Cursor cursor = db.rawQuery(queryRandomData,new String[] { String.valueOf(city) }); 

    if(cursor.getCount() != 0){ 

     while (cursor.moveToNext()){ 
      /*mName =cursor.getString(0); 
      mCity = cursor.getString(1); 

      Log.d(TAG,mName +" City "+mCity);*/ 


      ModelRandomList modelRandomList = new ModelRandomList(); 
      modelRandomList.setUserName(cursor.getString(0)); 
      modelRandomList.setUserCity(cursor.getString(1)); 

      modelRandomListArrayListLists.add(modelRandomList); 
     } 

     Random random = new Random(); 

     Collections.shuffle(modelRandomListArrayListLists,random); 
    } 


    Log.d(TAG, "Get Random Totla No of Recode Found "+cursor.getCount()); 



    return modelRandomListArrayListLists; 
} 

とあなたの活動で

public class MainActivity extends AppCompatActivity { 
private static final String TAG = MainActivity.class.getSimpleName(); 
private SqlLiteDataBaseHelper sqlLiteDataBaseHelper; 
private Button btGetRandomData; 
private ArrayList<ModelRandomList> modelRandomLists; 
private Button btSingleRandomData; 
private int position = 0; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    modelRandomLists = new ArrayList<ModelRandomList>(); 

    sqlLiteDataBaseHelper = new SqlLiteDataBaseHelper(MainActivity.this); 

    try{ 

     if(sqlLiteDataBaseHelper.checkDataBase()){ 

      Log.e(TAG, "Data Base Already Exists"); 

     }else { 

      sqlLiteDataBaseHelper.CopyDataBaseFromAsset(); 
     } 

     sqlLiteDataBaseHelper.openDataBase(); 

     try { 
      Log.e(TAG, "No Of Racode In DataBase " + sqlLiteDataBaseHelper.getDataCount()); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 

    }catch (Exception e){ 
     e.printStackTrace(); 
    } 


    init(); 
} 

private void init() { 

    btGetRandomData = (Button)findViewById(R.id.btRandomData); 
    btSingleRandomData = (Button)findViewById(R.id.btSingleRandomData); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

    btGetRandomData.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      modelRandomLists = sqlLiteDataBaseHelper.getRandomData("A"); 

      for (ModelRandomList crt : modelRandomLists) { 

       Log.e(TAG, " " + crt.getUserName()); 
       Log.e(TAG, " " + crt.getUserCity()); 

      } 
     } 
    }); 


    btSingleRandomData.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 


      try{ 
       Log.d(TAG,modelRandomLists.get(position).getUserName()); 
       position ++; 

      }catch (Exception e){ 
       e.printStackTrace(); 
       position =0; 
      } 


     } 
    }); 
} 

}

+0

thnx @AndroidGeeksを使用することです –

0

あなたは何度も何度も照会されている場合はユニークな結果を作成する方法はありません。

questionNoパラメータを使用せずにカーソルを返すため、制限1を削除してdistinct句をステートメントに追加するだけではどうですか?あなたがそのように行うと

、あなたはユニークな質問を反復するためにあなたのカーソルを使用することができます:あなたは何を持っていないか、またはあなたの条件は何でもするまで

String QUERY_SELECT_QUIESTION = "SELECT DISTINCT * FROM " +TABLE_QUIESTION +" WHERE "+COL_CAT+ " = '" +cat+"' AND " 
     +COL_LEVEL+ " = " +level+" ORDER BY RANDOM()"; 

は、あなたが質問を反復処理することができます。

Cursor cursor = db.rawQuery(QUERY_SELECT_QUIESTION, null); 
try { 
    while (cursor.moveToNext()) { 
     //display question or copy them to a member or whatever 
    } 
} finally { 
    cursor.close(); 
} 
+0

申し訳ブロしかし、私は良い知識アンドロイドを持っていないunderstnaすることはできませんuがrepetingなく、データベースからランダムデータを取得する方法を私を導くことができます私は答えを更新しました。 –

+0

ユニークなデータを取得するための鍵は、データを1回だけクエリし、別名 –

0

これまでにどのような質問があったかを把握しておく必要があります。これはどういう意味ですか:

private List<Integer> seenQuestions = new ArrayList<>(); 

public Cursor getUseenQuizQuestion(String cat,String level,String questionNo) { 

    Cursor cursor = getQuizQuiestion(cat, level, questionNo); 
    while(cursor == null) { // This could be an infinite loop!! 
     cursor = getQuizQuiestion(cat, level, questionNo); 
    } 
    return cursor; 
} 

private Cursor getQuizQuiestion(String cat,String level,String questionNo){ 
    String QUERY_SELECT_QUIESTION = "SELECT * FROM " +TABLE_QUIESTION +" WHERE "+COL_CAT+ " = '" +cat+"' AND " 
      +COL_LEVEL+ " = " +level+" ORDER BY RANDOM() LIMIT 1"; 
    Cursor cursor = db.rawQuery(QUERY_SELECT_QUIESTION, null); 
    if(cursor.moveToFirst()) { 
     int resultId = cursor.getString(cursor.getColumnIndexOrThrow("_id")); 
     if(seenQuestions.contains(resultId)) { 
      cursor.close(); 
      return null; 
     } 

     seenQuestions.add(resultId); 
    } 
    return cursor; 
} 

^上記のコードサンプルには多くの欠陥があり、無限ループする可能性があります。

しかし、要点は、返された内容を把握し、見たことがあればもう一度問い合わせる必要があることです。

また、DBクエリですべてのデータが返され、ランダム値を使用して項目の1つを選択することもできます。

関連する問題