如何在Android Studio中用Java从SQLite指定列获取最长字符串?
解决SQLite获取某列最长字符串及对应行ID的问题
问题根源
你之前的SQL语句里把列名_name用单引号括起来了,SQL会把'_name'当成字符串字面量,而不是表的列引用,所以返回的是字符串"_name"(长度为5),而非列中的实际数据。
解决方案
下面提供两种可行的写法,按需选择:
方法1:按字符串长度倒序取第一条
这种写法简单直接,会返回长度最长的第一行数据,同时拿到_id、目标字符串和长度:
public Cursor getLongest() { // 去掉列名的单引号,同时选中_id方便获取对应行 String sql = "SELECT _id, _name, LENGTH(_name) AS length FROM tblMain ORDER BY length DESC LIMIT 1;"; Cursor cur = db.rawQuery(sql, null); if (cur != null) { cur.moveToFirst(); } return cur; }
调用时可以这样获取数据:
Cursor c = db.getLongest(); if (c != null && c.getCount() > 0) { int id = c.getInt(0); String longestName = c.getString(1); int length = c.getInt(2); Log.v("longest name", "ID: " + id + " ~ 最长字符串: " + longestName + " ~ 长度: " + length); }
方法2:匹配最大长度的所有行
如果存在多个长度相同的最长字符串,上面的方法只会返回第一行,用这种子查询的方式可以返回所有符合条件的行:
public Cursor getLongest() { String sql = "SELECT _id, _name, LENGTH(_name) AS length FROM tblMain WHERE LENGTH(_name) = (SELECT MAX(LENGTH(_name)) FROM tblMain);"; Cursor cur = db.rawQuery(sql, null); if (cur != null) { cur.moveToFirst(); } return cur; }
调用时可以循环遍历Cursor获取所有结果:
Cursor c = db.getLongest(); if (c != null && c.moveToFirst()) { do { int id = c.getInt(0); String longestName = c.getString(1); int length = c.getInt(2); Log.v("longest name", "ID: " + id + " ~ 最长字符串: " + longestName + " ~ 长度: " + length); } while (c.moveToNext()); }
额外说明
- SQLite中,表名和列名不需要用单引号包裹,除非是包含特殊字符的标识符(此时用反引号
`或者双引号更规范)。 - 记得在使用完Cursor后调用
close()释放资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Nuggzy
相关产品推荐
相关产品推荐

