2016-04-27 87 views
1

我从Sqlite/Android数据库中获取重复数据的时间很多。我想在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

我有简单的例子,如果我在我的项目中使用我觉得可能是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我没有良好的知识的Android u能指导我如何从数据库中随机数据而不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; 
} 

^上面的代码示例有许多缺陷,可以循环无限。

但重点是你需要跟踪返回的内容,如果你看到它,再次查询。

或者,您可以允许您的数据库查询返回所有数据,然后使用随机值来选择其中一个项目。