Android sqlite - 空表上的游标数不为0

Gin*_*bak 2 sqlite android cursor

我在一个更大的项目中有以下代码:

final class DBlifetimeStatisticsHandler{ //implements DBvalueHandler<Cyclist, Double>{

private  final String TAG = getClass().getName();
private static final boolean debug = true;

private final DBminMaxAvgHandler dbMinMaxAvgHandler = new DBminMaxAvgHandler();

// table name
private static final String TABLE_LIFETIME_STATISTICS = "lifetime_statistics";

// column names
private static final String KEY_LIFETIME_STATISTICS_ID = "lifetime_statistics_id";
private static final String KEY_MIN_MAX_AVG = "min_max_avg";

// table create statement
private static final String CREATE_TABLE = "CREATE TABLE "
        + TABLE_LIFETIME_STATISTICS + "(" 
        + KEY_LIFETIME_STATISTICS_ID + " LONG PRIMARY KEY NOT NULL," 
        + KEY_MIN_MAX_AVG   + " LONG"
        + ")";

public void onCreateTable(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE);
}

public void onUpgrade(SQLiteDatabase db) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_LIFETIME_STATISTICS);
    onCreateTable(db);
}

public long addValue(SQLiteDatabase db, Statistics Statistics ) {
    ContentValues values = new ContentValues();

    long ID = getLatestID(db)+1;

    values.put(KEY_STATISTICS_ID, ID);

    ... //not important to the question

}

private long getLatestID(SQLiteDatabase db){
    String selectQuery = "SELECT  MAX(" + KEY_STATISTICS_ID +") FROM " + TABLE_STATISTICS;

    Cursor c = db.rawQuery(selectQuery, null);

    c.moveToFirst();
    int id = 0;
    Log.e("count", String.valueOf(c.getCount()));

    if (c.moveToFirst()){
       ...
    }

    return id;
}
}
Run Code Online (Sandbox Code Playgroud)

更新表后,它再次创建.因此,当我尝试添加新值时,我遇到了问题,因为它始终跳转到if子句,因为c.moveToFirst()总是返回true.

所以我试图检查是否c.getCount()会返回true但遗憾的是它总是返回1.所以问题是:为什么它会在空表上返回1?(我确实使用Questoid SQLite浏览器,表格真空)

Rim*_*mas 6

您使用聚合函数MAX,因此阅读文档:

有两种类型的简单SELECT语句 - 聚合和非聚合查询.如果简单的SELECT语句包含GROUP BY子句或结果集中的一个或多个聚合函数,则它是一个聚合查询.

没有GROUP BY子句的聚合查询总是返回一行数据,即使输入数据为零行也是如此.