Android Sqlite查询返回什么?

时间:2019-06-06 12:12:03

标签: java android android-sqlite

我是android开发的初学者,如果这很明显,请原谅。我制作了一个基本的用户管理系统来练习数据库连接。由于该段,我的注册活动崩溃了。

if(Db.getUser(Uid) != null){ //Db is a DatabaseHandler Object 
    Toast.makeText(getApplicationContext(),"Email is Already Used",Toast.LENGTH_SHORT);
    Proceed = false;
}

这是DatabaseHandler.getUser()

    User getUser(String Uid) {
            SQLiteDatabase db = this.getReadableDatabase();

            Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_UID,
                            KEY_NAME, KEY_PASS }, KEY_UID + "=?",
                    new String[] { Uid }, null, null, null, null);
            if (cursor != null)
                cursor.moveToFirst();
            else
                return null; //I explicitly made this statement to return null in case of no match 
            User user = new User(cursor.getString(0),cursor.getString(1), cursor.getString(2));
            // return User
            return user;
        }

我经常使用django,因此我认为android SQLite还返回了类似于空白QuerySet的内容。我错了吗?它会引发异常吗?如果是这样,什么是我要达到的最佳实施方式?

1 个答案:

答案 0 :(得分:2)

  

SQLite还返回了类似于空白QuerySet的内容。我错了吗?

查询方法返回一个游标。可能被描述为空白(为空,Cursor的getCount方法将返回0,即没有提取的数据),但不是 null

  

它会引发异常吗?

如果在光标位于第一行之前的 (初始位置)或最后一行之后的 / em> ,那么您将获得一个例外。也就是说,仅当游标位于现有行上时,您才能读取数据。

问题

简而言之,您的问题是您没有检查行是否存在,因为Cursor不会为空。

说明

query 方法返回一个游标,该游标将保存许多行,每个行都由查询中指定的列组成。

query 方法返回的Cursor永远不会为null(因此检查null不会执行任何操作(您的第一个问题))。但是,光标可能为空。因此,您需要处理这种情况。

要检查游标是否返回了任何行,您可以使用游标的 getCount 方法来检查行数,例如if (cursor.getCount() > 0) { ... get data from row .. } else { ... handle no rows ... }

或者,许多Cursor的move?????方法返回一个布尔值,如果可以移动,则返回true,否则返回false。例如if (moveToFirst()) { ... get data from row .. } else { ... handle no rows ... }

您可以使用while(cursor.moveToNext(){...从当前行获取数据..};

修复

  

如果是这样,那么我要达到的最佳实现是什么?

  • 注意最好是有争议的

这样,在您的代码中,您想要获得一行并构建并返回一个User(应该只有一行与Uid相匹配(假设该列是用UNIQIUE约束显式或隐式定义的))是:-

    User getUser(String Uid) {
        SQLiteDatabase db = this.getReadableDatabase();

        Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_UID,
                        KEY_NAME, KEY_PASS }, KEY_UID + "=?",
                new String[] { Uid }, null, null, null, null);
        if (cursor.moveToFirst()) {
            return new User(cursor.getString(csr.getColumnIndex(KEY_UID),cursor.getString(cursor.getColumnIndex(KEY_NAME)),cursor.getString(cursor.getColumnIndex(KEY_PASS));
        } else
            return null; //I explicitly made this statement to return null in case of no User
    }
  • 请注意,使用getColumnIndex(the_column_name)可以减少确定列偏移量时发生错误的可能性,例如

  • 如果您无意中使用了db.query(TABLE_CONTACTS, new String[] { KEY_UID, KEY_PASS, KEY_NAME }, KEY_UID + "=?", new String[] { Uid }, null, null, null, null);,则如果使用硬编码的偏移量,则结果User将以密码作为名称,并以名称作为密码。使用getColumnIndex时,游标中列的位置无关紧要。

  • 请注意,以上代码为原则代码,尚未经过测试或运行,因此可能有错误。