Sqlite - МЕЖДУ и БОЛЬШЕ, ЧЕМ (<) всегда возвращает 0 в Курсоре - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь сохранить мой запрос SELECT в курсоре в Android
Я использую этот запрос:

Cursor cursor = myDb.rawQuery("SELECT * FROM tbl_main_words WHERE word_id BETWEEN 1 AND 500 ORDER BY word_eng",null)

и cursor.getCount () вернул 0!
это то же самое, что и для (<) запросов! <br /> пока не должно быть :(
Потому что в моей таблице 15000 строк в myDb с word_id от 1 до 15000

ПРИМЕЧАНИЕ: проблема не в базе данных, потому что я могу вернуть истинное значение из некоторых запросов, таких как:

SELECT * FROM tbl_main_words WHERE word_id > 0 ORDER BY word_eng

ВАЖНО: эти запросы выполняются без проблем в некоторых программах SQLite, таких как SQLite Expert!

1 Ответ

0 голосов
/ 30 июня 2018

Я не верю, что ваша проблема связана с запросом, он работает нормально, используя: -

public class SO51108624DBHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "worddb";
    public static final int DBVERSION = 1;

    public static final String TB_MAIN_WORDS = "tbl_main_words";
    public static final String COL_WORDID = "word_id";
    public static final String COL_WORDENG = "word_eng";

    SQLiteDatabase mDB;

    public SO51108624DBHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
        mDB = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String crtsql = "CREATE TABLE IF NOT EXISTS " + TB_MAIN_WORDS + "(" +
                COL_WORDID + " INTEGER PRIMARY KEY," +
                COL_WORDENG + " TEXT" +
                ")";
        db.execSQL(crtsql);

    }


    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }

    public long addRow(String word) {
        ContentValues cv = new ContentValues();
        cv.put(COL_WORDENG,word);
        return mDB.insert(TB_MAIN_WORDS,null,cv);
    }

    public void populateMainWordsTable() {
        mDB.delete(TB_MAIN_WORDS,null,null);
        for (int i=0; i < 1000; i++) {
            addRow("test");
        }
    }

    public int getWordCountBetweenIDs() {
        String sql = "SELECT * FROM tbl_main_words WHERE word_id BETWEEN 1 AND 500 ORDER BY word_eng";
        Cursor csr = mDB.rawQuery(sql,null);
        int rv = csr.getCount();
        csr.close();
        return rv;
    }
}

вместе с: -

    SO51108624DBHelper mDBHlpr = new SO51108624DBHelper(this);
    mDBHlpr.populateMainWordsTable();
    int rowcount = mDBHlpr.getWordCountBetweenIDs();
    Log.d("ROWCOUNT", "Number of rows returned was " + String.valueOf(rowcount));

В результате: -

06-29 22:29:39.193 1452-1452/soanswers.soanswers D/ROWCOUNT: Number of rows returned was 500

Таким образом, вполне вероятно, что сама таблица будет пустой при запуске этого. Это при условии, что вы не пропустили никаких ошибок, таких как столбец / таблица не найдены.

Вы можете попробовать использовать: -

Log.d ("ROWCOUNT","Number of rows in tbl_main_words is " + String.valueOf(DatabaseUtils.queryNumEntries(myDb,"tbl_main_words")));
Cursor cursor = myDb.rawQuery("SELECT * FROM tbl_main_words WHERE word_id BETWEEN 1 AND 500 ORDER BY word_eng",null)

и затем проверка журнала, который должен иметь что-то вроде: -

06-29 22: 36: 54.232 1529-1529 / soanswers.soanswers D / ROWCOUNT: Количество строк в tbl_main_words составляет 1000

...