2016-04-27 2 views
1

Я получаю много времени, повторяя данные из базы данных Sqlite/Android. Я хочу получить recode без повторения в Android-курсоре.Я получаю каждый раз Случайное повторение данных в Sqlite android Я хочу Случайные данные без отражения

Пожалуйста, помогите и простите за мой английский

Вот мой запрос:

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 помогает вам;

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

Извините Bro, но не может не understna у меня нет хорошего андроида знаний может у руководства мне, как получить случайные данные из базы данных без repeting в coursor –

+0

Я обновил ответ. Ключом к получению уникальных данных является запрос данных только один раз и использование отличных –

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

^Код, указанный выше, имеет много недостатков и может бесконечно вращаться.

Но дело в том, что вам нужно отслеживать, что было возвращено, и запросить снова, если вы его видели.

В качестве альтернативы вы можете позволить вашему запросу БД возвращать все данные, а затем использовать значение «Случай» для выбора одного из элементов.

Смежные вопросы