Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android sqlite-空表上的光标计数不为0_Android_Sqlite_Cursor - Fatal编程技术网

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

Android sqlite-空表上的光标计数不为0,android,sqlite,cursor,Android,Sqlite,Cursor,我在一个更大的项目中有以下代码: final class DBlifetimeStatisticsHandler{ //implements DBvalueHandler<Cyclist, Double>{ private final String TAG = getClass().getName(); private static final boolean debug = true; private final DBminMaxAvgHandler dbMinMaxAvgH

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

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;
}
}
final类DBlifetimeStatisticsHandler{//实现DBvalueHandler{
私有最终字符串标记=getClass().getName();
私有静态最终布尔调试=true;
私有最终DBminMaxAvgHandler DBminMaxAvgHandler=new DBminMaxAvgHandler();
//表名
私有静态最终字符串表\u LIFETIME\u STATISTICS=“LIFETIME\u STATISTICS”;
//列名
私有静态最终字符串键\u LIFETIME\u STATISTICS\u ID=“LIFETIME\u STATISTICS\u ID”;
私有静态最终字符串密钥\u MIN\u MAX\u AVG=“MIN\u MAX\u AVG”;
//表create语句
私有静态最终字符串CREATE\u TABLE=“CREATE TABLE”
+表“寿命统计数据+”(“
+密钥\u生命周期\u统计信息\u ID+“长主键不为空,”
+键\u最小值\u最大值\u平均值+“长”
+ ")";
public void onCreateTable(SQLiteDatabase db){
db.execSQL(创建_表);
}
public void onUpgrade(SQLiteDatabase db){
db.execSQL(“如果存在删除表”+表生命周期统计信息);
onCreateTable(db);
}
public long addValue(SQLiteDatabase db,Statistics){
ContentValues=新的ContentValues();
长ID=getLatestID(db)+1;
value.put(KEY\u STATISTICS\u ID,ID);
…//对这个问题不重要
}
专用长getLatestID(SQLiteDatabase db){
String selectQuery=“从“+表统计信息”中选择最大值(“+KEY\u STATISTICS\u ID+”);
游标c=db.rawQuery(selectQuery,null);
c、 moveToFirst();
int id=0;
Log.e(“count”,String.valueOf(c.getCount());
if(c.moveToFirst()){
...
}
返回id;
}
}
更新表后,它会再次创建。因此,当我尝试添加新值时,出现问题,因为它总是跳入if子句,因为
c.moveToFirst()
总是返回true


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

使用
MAX
时可能存在某种错误行为。也请检查此链接如果使用聚合函数
MAX
,请阅读

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

没有GROUPBY子句的聚合查询始终只返回一行数据,即使输入数据为零行也是如此


您将得到一个游标中只有一行的结果,因为这是您所请求的


结果是一个名为MAX的单列,其值将是表中所有行的MAX id。对于空表,此值为null。

我正在使用group by解决此问题。请检查我的示例:

SELECT  COUNT(*) FROM " + TABLE_NAME + " WHERE isSynced=0 group by isSynced

我通过以下方式解决此问题:

 SELECT COUNT(*) AS numero, MAX(tagua_lagps) as tmp_max_lagps, MAX(tagua_logps) as tmp_max_logps, MIN(tagua_lagps) as tmp_min_lagps, MIN(tagua_logps) as tmp_min_logps FROM TAB_AGUA
在空表上,c.getCount()给出1,但值为NULL。但numero(c.getString(c.getColumnIndex(“numero”)的值为0

因此,您必须检查count(*)的结果,而不是检查c.getCount()。

这是我的解决方案

public Boolean isNotEmpty(){
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery("SELECT  * FROM " + TABLE_STATISTICS, null);
    while (cursor.moveToNext() ) {
        return true;
    }
    return false;
}

将其从“+TABLE\u STATISTICS+”分组改为“+KEY\u STATISTICS\u ID;”,现在它可以工作了。这是正确的方法还是有更好的方法?MAX的行为是否有原因?更好的是:
String selectQuery=“SELECT”+KEY\u STATISTICS\u ID+”FROM“+TABLE\u STATISTICS”“ORDER BY 1 DESC LIMIT 1”
-返回一条(具有最大id值)或无记录。
String selectQuery=“SELECT”+KEY\u STATISTICS\u id+“ORDER BY”+KEY\u STATISTICS\u id+“DESC LIMIT 1”;
我想会更好,对吧?但这是一个很大的帮助,非常感谢。我确实看到了“逻辑”“但是我期望最大值为零,而不是告诉我它是零:DYeah-我理解,但另一种选择是返回一个没有行的游标,我认为这同样令人困惑。