Android Sqlite 显示随机行

标签 android sqlite

我目前正在开发一个应用程序。它的作用是,用户输入一些句子,然后应用程序将获取歧义词,然后显示其含义。在我的表中,我有 _id、word、meaning、definition_number 等字段。

示例数据:
_id 词 含义 definition_number
1 Break 暂停某事 1
2 Break 切成 fragment 2

如果用户输入:My break was very fast。 预期的输出将是:
歧义词: Break
含义:暂停某事

我想随机显示它。这是我的 DBHelper.class 中的一段代码:

        public Cursor getAllWords()
{
    Cursor localCursor =   
            //this.myDataBase.query(DB_TABLE, new String[] { 
            //      KEY_ID, KEY_WORD, KEY_MEANING }, null, null, null, null, null);//"RANDOM()");
        //this.myDataBase.query(DB_TABLE, new String[] { 
        //      KEY_ID, KEY_WORD, KEY_MEANING }, null, null, null, null, "RANDOM()", " 1");
            this.myDataBase.query(DB_TABLE, new String[] { 
                            KEY_ID, KEY_WORD, KEY_MEANING }, 
                            null, null, null, null, "RANDOM()");
    if (localCursor != null){
      localCursor.moveToFirst(); 
    }

    return localCursor; 


}

MainActivity.class:

    ArrayList<String> colWords = new ArrayList<String>();
ArrayList<String> colMeanings = new ArrayList<String>();
String[] words;
String[] meanings;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initControls();

}

private void initControls() {
    // TODO Auto-generated method stub
    text = (EditText) findViewById (R.id.editText1);

    view = (TextView) findViewById (R.id.textView1);

    clear = (Button) findViewById (R.id.button2);

    clear.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            text.setText("");
            view.setText("");

        }
    });


    connectDB();

    ok = (Button) findViewById (R.id.button1);
    ok.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            //Log.d(strWord, strWord);

            strWord = text.getText().toString();
            if(strWord.isEmpty()){
                Toast.makeText(MainActivity.this, "Please input some data", Toast.LENGTH_SHORT).show();
            } else {
            checkAmbiguousWord();
            }
        }   
    });
}

private void connectDB(){
    dbHelper = new DBHelper(MainActivity.this);

    try {

            dbHelper.createDataBase();

    } catch (IOException ioe) {

            throw new Error("Unable to create database");

    }

    try {

            dbHelper.openDataBase();

    } catch (SQLException sqle) {

            throw sqle;

    }

    cursor = dbHelper.getAllWords();




    /*strWord = cursor.getString(cursor.getColumnIndex(DBHelper.KEY_WORD))
            + cursor.getString(cursor.getColumnIndex(DBHelper.KEY_MEANING)); */

    colWords.clear();///added code
    colMeanings.clear();///added code
    /*
    for(cursor.moveToFirst(); cursor.moveToNext(); cursor.isAfterLast()) {
        colWords.add(cursor.getString(1));
        colMeanings.add(cursor.getString(2));
        String records = cursor.getString(0);

        Log.d("Records", records);
    } */

    if (cursor != null) {
        if (cursor.moveToFirst()) {
            do {
                colWords.add(cursor.getString(1)); 
                colMeanings.add(cursor.getString(2));   
                String records = cursor.getString(0);

                Log.d("Records", records);
            } while (cursor.moveToNext());
        }
    }

}

private void checkAmbiguousWord(){
    final String textToCheck = text.getText().toString();
    List<Integer> ambiguousIndexes = findAmbiguousWordIndexes(textToCheck);
    view.setText(!ambiguousIndexes.isEmpty() ? 
            ambigousIndexesToMessage(ambiguousIndexes) : "No ambiguous word/s found.");
}

/**
 * @param text checked for ambiguous words
 * @return the list of indexes of the ambiguous words in the {@code words} array          
 */
private List<Integer> findAmbiguousWordIndexes(String text) {
    final String lowerCasedText = text.toLowerCase();
    final List<Integer> ambiguousWordIndexList = new ArrayList<Integer>();

    words = (String[]) colWords.toArray(new String[colWords.size()]);
    meanings = (String[]) colMeanings.toArray(new String[colMeanings.size()]);

    for (int i = 0; i < words.length; i++) {
        if (lowerCasedText.contains(words[i].toLowerCase())) {
            ambiguousWordIndexList.add(i);
        }
    }
    return ambiguousWordIndexList;
} 

public String ambigousIndexesToMessage(List<Integer> ambiguousIndexes) {
    // create the text using the indexes
    // this is an example implementation
    StringBuilder sb = new StringBuilder();

    for (Integer index : ambiguousIndexes) {
        sb.append("Ambiguous words: ");
        sb.append(words[index] + "\nMeaning: " + meanings[index] + "\n");
        sb.append("");
    }
    return sb.toString(); 
}

但它所做的只是显示两条记录。 id 1和id 2。我只想随机显示一条记录。我真的需要这方面的帮助。有任何想法吗?我很乐意感激。

最佳答案

您有 RANDOM() 排序,但您还需要添加 LIMIT 1 以仅返回一个结果行。有一个 overload of SQLiteDatabase.query() that takes in a limit parameter :

this.myDataBase.query(DB_TABLE, new String[] { 
                        KEY_ID, KEY_WORD, KEY_MEANING }, 
                        null, null, null, null, "RANDOM()", "1");

关于Android Sqlite 显示随机行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19511592/

相关文章:

android - 防止 RecyclerView 消费触摸事件

android - 如何使用联系人的 lookup_key 删除联系人

android - 在 frgamentActivity oncreate() 上检查 savedinstancestate 的原因

android - android 中的 LruCache 是否会给您带来与 sqlite 相比的显着性能差异?

c# - SQLite-Net Extensions - CreateTable 函数是否会改变我现有的表?

sql - 如何从 SQLite 数据库中选择浮点无限文字?

android - 根据屏幕密度获取drawable实际尺寸

java - 当我按下录制按钮 6 秒后,Android 应用程序崩溃

c# - C# 中的简单 SQLite ORM,代码可以工作,但如何解决竞争条件

iphone - 如何获取sqlite3中最后更新的值