java - Android Sqlite 查询返回什么?

标签 java android android-sqlite

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

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 的内容。我错了吗?它会抛出异常吗?如果是这样,对于我要达到的目的,最好的实现方式是什么?

最佳答案

SQLite also returned something similar to a blank QuerySet. Am I wrong?

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

Does it throw an exception instead?

如果您尝试在 Cursor 位于第一行之前(初始位置)或最后一行之后,那么你会得到一个异常。也就是说,只有当 Cursor 位于现有行时,您才能读取数据。

问题

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

解释

query 方法返回一个 Cursor,它将包含许多行,每行由查询中指定的列组成。

query 方法返回的 Cursor 永远不会为 null(因此检查 null 什么都不做(您的第一个问题))。但是,Cursor 可能为空。因此,您需要处理这种情况。

要检查 Cursor 是否已返回任何行,您可以使用 Cursor 的 getCount 方法检查行数,例如if (cursor.getCount() > 0) { ... 从行中获取数据 .. } else { ... 不处理任何行 ... }

另外,许多 Cursor 的 move?????? 方法返回 boolean 值,如果可以移动则返回 true,否则返回 false。例如if (moveToFirst()) { ... 从行中获取数据 .. } else { ... 不处理任何行 ... }

您可以使用 while(cursor.moveToNext() { ... 从当前行获取数据 .. }; 遍历所有返回的行;

修复

If so what would be the best implementation for the purpose I'm trying to achieve?

  • 注意最好的是有争议的

在您的代码中,您想要获取一行并构建并返回单个用户(应该只有一行与 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); 然后,如果使用硬编码偏移量,则结果用户会将密码作为名称,将名称作为密码。使用 getColumnIndex 时,Cursor 中列的位置无关紧要。

  • 请注意,以上代码是原理代码,尚未经过测试或运行,因此可能存在错误。

关于java - Android Sqlite 查询返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56477359/

相关文章:

java - 我如何编辑此代码,以便服务器在发送到客户端之前压缩文件,客户端在接收后解压缩该文件

javascript - 在 Spring MVC Controller 中需要在 JS 中创建的元素的值

mysql - 如果最后一条记录与之前的记录重复,则android-db查询获取最后一条记录或组中的第一条

java - 从 Android 数据库中删除项目 - 游标索引越界异常

android - Android Studio 中的文档窗口空白

android - 将 DataBASE .db 或 .sqlite 存储在 android 的 Assets 中

java - 如何将代码从一个类传递到第二个类并传递到第三个类?

java - Android Studio 在无法编辑的 XML 文件上出现 AAPT 错误

java - 按下按钮时更改 XML 布局

java - 当我搜索数据时,我的应用程序被迫停止。我该如何解决这个问题?