【问题标题】:Sqlite - BETWEEN and GREATER THAN (<) is always return 0 in CursorSqlite - BETWEEN 和 GREATER THAN (<) 在 Cursor 中总是返回 0
【发布时间】:2018-06-29 19:58:32
【问题描述】:

我正在尝试将我的 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!
大于 ( 虽然它不应该是:(
因为我在 myDb 的表中有 15000 行,word_id 从 1 到 15000

注意:问题不是来自数据库,因为我可以从一些查询中返回真实值,例如:

SELECT * FROM tbl_main_words WHERE word_id > 0 ORDER BY word_eng

重要提示:这些查询在一些 SQLite 软件(如 SQLite Expert)中执行没有任何问题!

【问题讨论】:

    标签: android database sqlite cursor between


    【解决方案1】:

    我不认为您的问题与查询有关,使用它可以正常工作:-

    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

    【讨论】:

    • 我在 cursur.getCount() 调用时检查了我的行,我意识到它没有为空!当我运行这样的查询 SELECT * FROM tbl_main_words WHERE word_id > 500 时,它可以正常工作,但是当我将 (>) 更改为 (
    猜你喜欢
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多