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-我理解,但另一种选择是返回一个没有行的游标,我认为这同样令人困惑。