如何使用Java从Android Studio中的特定SQLite列中检索最长字符串?

vsdwdz23  于 2023-06-04  发布在  Android
关注(0)|答案(1)|浏览(185)

我试图从一个sqlite数据库的列中获取最长的字符串。

Cursor c = db.getLongest();
        String c1 = c.getString(0);
        String c2 = c.getString(1);
        Log.v("longest name", "longest name: " + c1 + " ~ " + c2 + " ~ " + c.getCount());

    public Cursor getLongest() {
        String sql ="SELECT '_name', LENGTH('_name') count FROM 'tblMain' ORDER BY LENGTH('_name') DESC LIMIT 1;";
        Cursor cur = db.rawQuery(sql, null);
        if (cur != null) {
            cur.moveToFirst();
        }
        return cur;
    }

上面的代码将打印“longest name:_name ~ 5 ~ 1”。它返回的是列名而不是单元格值。
编辑:我也试过

String sql ="SELECT MAX(LENGTH(_name)) FROM tblMain;";

这将给予我最长的长度,但我真的很想得到字符串或至少行的_id。

30byixjq

30byixjq1#

上面的代码将打印“longest name:_name ~ 5 ~ 1”。它在返回纵队
它并不是真的返回列。它返回文字值***_name***,因此长度为5,因为它是文字的长度。这是因为该值用单引号括起来。
删除列名前后的单引号。但是,如果两行的值长度相同,该怎么办?(修辞-见下面的演示)。
您可能希望考虑以下查询***(注意已使用额外的列,以便可以如下所示的结果,您可能希望省略,重新排序或调整代码以满足您的要求)***:-

SELECT *,count() AS _count,length(_name) AS _nameLength, group_concat(_name) AS valuesCSV FROM tblMain WHERE length(_name) =  (SELECT max(length(_name)) FROM tblMain) GROUP BY length(_name);

这将返回一个单行 (由于使用了GROUP BYWHERE子句来确定最长值的长度),其中所有列都来自最长的一行,此外:-

  • 与列**_count**长度相同的行数
  • 列中最长值的长度**_nameLength**
  • 所有值作为CSV作为列valuesCSV
    Demo

以下是在SQLite工具中使用的:

DROP TABLE IF EXISTS tblMain;
CREATE TABLE IF NOT EXISTS tblMain (id INTEGER PRIMARY KEY, _name TEXT);
INSERT INTO tblMain (_name) VALUES('a1'),('aa2'),('aaa3'),('aaaa4'),('b1'),('bb2'),('bbb3'),('bbbb4'),('a1'),('aa2'),('aaa3'),('aaaa4');
SELECT *,count() AS _count,length(_name) AS _nameLength, group_concat(_name) AS valuesCSV FROM tblMain WHERE length(_name) =  (SELECT max(length(_name)) FROM tblMain) GROUP BY length(_name); 
DROP TABLE IF EXISTS tblMain;

结果是:

*ID列是其中一行的id,因为在_name列中选择了3行具有相同长度,即(aaaa 4,bbb 4和另一个aaaa 4)

  • 同样,_name列是3个名称之一
    *_count列为3,因为组中有3行具有最长值
    *_nameLength列为5,因为这是_name列中最长值的长度
    *valuesCSV列是与最长值的长度匹配的所有行的CSV。

如果一行被插入值为***zzzzz 5***(即只有一行长度为6),那么输出将是:

附言

从任何返回Cursor的SQLiteDatabase方法返回的Cursor将NEVER为null。

相关问题