SQLite SELECT MAX() 查询返回 null 到游标?

Posted

技术标签:

【中文标题】SQLite SELECT MAX() 查询返回 null 到游标?【英文标题】:SQLite SELECT MAX() query returns null to cursor? 【发布时间】:2019-02-28 03:55:27 【问题描述】:

我有一个名为“TBL_EVO”的 SQLite 表,我想从“DATE_MODIFIED”列中获取最大值。通过以下查询,我在 SQLite 浏览器中得到了如下结果。

从“TBL_EVO”中选择最大(日期修改);

当我从应用程序的代码运行查询时,我得到了一个空指针异常。数据库与 SQLBrowser 中的数据库完全一样。 所以 DATE_MODIFIED 与其值一起存在。 它在cursor.moveToFirst(); 崩溃。 即使我用if(cursor.moveToFirst())包围它 当我这样做时,代码会跳转到其他地方。 我做错了什么?

MainActivity.java

mysqliteHelper db = new MySQLiteHelper(this);
String strDateTime = db.strSelectMaxDate(TableNames[intTableIDStart]);
Log.v("TBL_EVO_DATE_TIME: ", "-> "+strDateTime);

MySQLiteHelper.java - strSelectMaxDate

public String strSelectMaxDate(String strTable)
    String strValueFromDB = "";
    String queryMaxDate = "SELECT MAX(DATE_MODIFIED) FROM '" + strTable+"'";
    Log.v("TBL_EVO_DATE_TIME_QUERY", queryMaxDate);
    try
        db = this.getReadableDatabase();
        cursor = db.rawQuery(queryMaxDate, null);
        cursor.moveToFirst();
        if(cursor == null)
            strValueFromDB = "cursorisnull";
            Log.v("TBL_EVO_DATE_TIME_VAL1", strValueFromDB);
        else 
            strValueFromDB = cursor.getString(0);
            Log.v("TBL_EVO_DATE_TIME_VAL2", cursor.getString(0));
        
    catch(Exception e)
        Log.v("TBL_EVO_DATE_TIME_ERROR", "-> "+e);
        strValueFromDB = "error: "+e;
    finally
        cursor.close();
        db.close();
    
    return strValueFromDB;

Logcat

09-24 15:24:23.207 21900-21917/com.spicysoftware.goexpert V/TBL_EVO_DATE_TIME_QUERY: SELECT MAX(DATE_MODIFIED) FROM 'TBL_EVO'
09-24 15:24:23.216 21900-21917/com.spicysoftware.goexpert V/TBL_EVO_DATE_TIME_ERROR: -> java.lang.NullPointerException: println needs a message
09-24 15:24:23.216 21900-21917/com.spicysoftware.goexpert V/TBL_EVO_DATE_TIME:: -> error: java.lang.NullPointerException: println needs a message

【问题讨论】:

我认为 cursor.getString(0) 返回 null ,对吗? 能否添加测试的安卓手机版本? println needs a message 绝对是一个有趣的错误,表明内部出现问题。当你catch你的异常时,你是否也可以调用e.printStackTrace()来准确显示异常是在哪里引发的? What am I doing wrong? 您将表名包含在 字符串分隔符 中,此处:... FROM 'TBL_EVO' @AnisBENNSIR 它已在 android 7.0 模拟器上测试。 【参考方案1】:

将您的 queryMaxDate 替换为:

String queryMaxDate = "SELECT MAX(DATE_MODIFIED) FROM " + strTable;

【讨论】:

感谢您的建议。但我仍然遇到同样的错误。 请执行 e.printStackTrace();在你的 catch 语句中,然后发布日志。【参考方案2】:

我解决了这个问题。 问题是,我在异步任务中做了一个新的 SQLConnection。

我必须在 Asynctask 中打开一个新连接。

【讨论】:

以上是关于SQLite SELECT MAX() 查询返回 null 到游标?的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO Select 查询返回双精度值

SQLite FTS 表上的正常 SELECT

sqlite xcode 查询子句

SQL SELECT MAX() 返回多条记录

SQLite INSERT 和 DELETE 查询给出错误,但不是 SELECT 查询

Sqlite - 一对多关系 SELECT 查询