【问题标题】:SQLite Query in Android to count rowsAndroid中的SQLite查询来计算行数
【发布时间】:2011-07-09 07:19:40
【问题描述】:

我正在尝试创建一个简单的登录表单,我将在登录屏幕上输入的登录 ID 和密码与存储在数据库中的登录 ID 和密码进行比较。

我正在使用以下查询:

final String DATABASE_COMPARE =
"select count(*) from users where uname=" + loginname + "and pwd=" + loginpass + ");" ;

问题是,我不知道如何执行上述查询并存储返回的计数。

这是数据库表的样子(我已经成功地使用 execSQl 方法创建了数据库)

private static final String
DATABASE_CREATE =
            "create table users (_id integer autoincrement, "
            + "name text not null, uname primary key text not null, " 
            + "pwd text not null);";//+"phoneno text not null);";

有人可以指导我如何实现这一目标吗?如果可能,请提供一个示例 sn-p 来完成上述任务。

【问题讨论】:

    标签: android sqlite count


    【解决方案1】:

    DatabaseUtils.queryNumEntries(从 api:11 开始)是一个有用的替代方案,它不需要原始 SQL(耶!)。

    SQLiteDatabase db = getReadableDatabase();
    DatabaseUtils.queryNumEntries(db, "users",
                    "uname=? AND pwd=?", new String[] {loginname,loginpass});
    

    【讨论】:

    • 对于 OS
    • @Khobaib 检查来自 ghchinoy 的答案
    • @EduardoHerzer 我找到了一种直接使用 cursor.getCount() 的方法。
    • @Khobaib 这不是一种非常有效的方法。您应该始终更喜欢使用SELECT COUNT(*) 和queryNumEntries(),而不是检索所有记录并查看有多少记录,即。 cursor.getCount()
    【解决方案2】:

    @scottyab 参数化 DatabaseUtils.queryNumEntries(db, table, whereparams) 存在于 API 11 +,即 without the whereparams exists since API 1。答案必须是创建一个带有 db.rawQuery 的游标:

    Cursor mCount= db.rawQuery("select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass +"'", null);
    mCount.moveToFirst();
    int count= mCount.getInt(0);
    mCount.close();
    

    我也喜欢@Dre 的答案,带有参数化查询。

    【讨论】:

    • 对于那些想知道的人,mCount.getInt() 的参数是columnindex。感谢您的帮助!
    【解决方案3】:

    使用SQLiteStatement。

    例如

     SQLiteStatement s = mDb.compileStatement( "select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass + "'; " );
    
      long count = s.simpleQueryForLong();
    

    【讨论】:

    • 我喜欢这个答案与@scottyab 的答案(这也非常好)的一点是,在这种情况下,您可以指定一个 LIMIT 子句。当您只想知道表中是否有任何行(例如,从 TABLE LIMIT 1 中选择 (count(*) > 0))而不是没有行时,这很有用。我猜当表格可能没有行或有大量行时,这会更快。这是我在搜索时遇到的具体情况......
    • @Teknogrebo:这是一个不错的答案,尽管我会使用参数化版本。您可以在查询中使用?s,然后使用bindString(int, String) 和bindLong(int, long) 插入值。见here。
    【解决方案4】:

    参见rawQuery(String, String[]) 和Cursor 的文档

    你的DADABASE_COMPARE SQL 语句当前无效,loginname 和loginpass 不会被转义,loginname 和and 之间没有空格,你用) 结束语句;代替 ; -- 如果您以 bob 身份使用 password 的密码登录,则该语句将结束为

    select count(*) from users where uname=boband pwd=password);
    

    另外,您可能应该使用 selectionArgs 功能,而不是连接登录名和登录密码。

    要使用 selectionArgs 你会做类似的事情

    final String SQL_STATEMENT = "SELECT COUNT(*) FROM users WHERE uname=? AND pwd=?";
    
    private void someMethod() {
        Cursor c = db.rawQuery(SQL_STATEMENT, new String[] { loginname, loginpass });
        ...
    }
    

    【讨论】:

      【解决方案5】:

      假设您已经建立了数据库 (db) 连接,我认为最优雅的方法是坚持使用 Cursor 类,并执行以下操作:

      String selection = "uname = ? AND pwd = ?";
      String[] selectionArgs = {loginname, loginpass};
      String tableName = "YourTable";
      Cursor c = db.query(tableName, null, selection, selectionArgs, null, null, null);
      int result = c.getCount();
      c.close();
      return result;
      

      【讨论】:

      • 您至少应该指定一列。传递 null 将返回所有列,不鼓励这样做以防止从存储中读取不会使用的数据。 #perfmatters
      • 事实上,如果必要的信息只是一个计数,检索单个列(例如 ID)就足够了
      【解决方案6】:

      how to get count column

      final String DATABASE_COMPARE = "select count(*) from users where uname="+loginname+ "and pwd="+loginpass;
      
      int sometotal = (int) DatabaseUtils.longForQuery(db, DATABASE_COMPARE, null);
      

      这是最简洁和精确的替代方案。无需处理游标及其关闭。

      【讨论】:

      • 太棒了 - 一直在使用 Android,从不知道这个 DatabaseUtils - Google 应该更好地推广那里的实用程序......
      【解决方案7】:

      如果您使用的是 ContentProvider,那么您可以使用:

      Cursor cursor = getContentResolver().query(CONTENT_URI, new String[] {"count(*)"},
                  uname=" + loginname + " and pwd=" + loginpass, null, null);
          cursor.moveToFirst();
          int count = cursor.getInt(0);
      

      【讨论】:

        【解决方案8】:

        如果您想获取记录数,则必须在某个字段上应用分组依据或应用以下查询。

        喜欢

        db.rawQuery("select count(field) as count_record from tablename where field =" + condition, null);
        

        【讨论】:

          【解决方案9】:

          另一种方法是使用:

          myCursor.getCount();
          

          在光标上,例如:

          Cursor myCursor = db.query(table_Name, new String[] { row_Username }, 
          row_Username + " =? AND " + row_Password + " =?",
          new String[] { entered_Password, entered_Password }, 
          null, null, null);
          

          如果您可以考虑摆脱原始查询。

          【讨论】:

            【解决方案10】:
            int nombr = 0;
            Cursor cursor = sqlDatabase.rawQuery("SELECT column FROM table WHERE column = Value", null);
            nombr = cursor.getCount();
            

            【讨论】:

              猜你喜欢
              • 2011-08-02
              • 1970-01-01
              • 2015-11-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-10-29
              • 1970-01-01
              • 2011-07-18
              相关资源
              最近更新 更多