1

有谁知道是否可以使用 Sugar ORM 对列求和?我试图找到任何文档,并且有一个原始查询方法,但是,原始查询方法没有任何返回值。

示例:“从表中选择总和(价格)”

Class.executeQuery() 是无效的。

直到出现这种功能(以及 JOIN 等)之前,Sugar ORM 似乎并不是很有用。

4

4 回答 4

3

我终于用下面的代码做到了:

long sumValue = -1L;
Database db = ((Application)SugarApp.getSugarContext()).obtainDatabase();
SQLiteDatabase sqLiteDatabase = db.getDB();
SQLiteStatement sqLiteStatement = sqLiteDatabase.compileStatement(
    "SELECT SUM(column_name) FROM table_name");
try {
    sumValue = sqLiteStatement.simpleQueryForLong();
} catch (Exception var16) {
    var16.printStackTrace();
} finally {
    sqLiteStatement.close();
}

还需要将 Application 类更改为可以访问 DataBase 属性,因为具有受保护的访问权限(不要忘记正确修改清单)。

public class Application extends SugarApp {    
    public Database obtainDatabase(){
        return getDatabase();
    }
}

希望能帮助到你。

于 2015-08-23T12:02:30.843 回答
2

您可以通过反射访问糖数据库对象来执行原始查询:

int sumValue = -1;
Field f = null;
try {
    f = SugarContext.getSugarContext().getClass().getDeclaredField("sugarDb");
    f.setAccessible(true);
    SugarDb db = (SugarDb) f.get(SugarContext.getSugarContext());
    Cursor cursor = db.getDB().
            rawQuery("Select Sum(COLUMN_NAME) as s from TABLE_NAME" , null);
    if (cursor.moveToFirst())
        sumValue = cursor.getInt(cursor.getColumnIndex("s"));
} catch (NoSuchFieldException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
}
于 2016-04-17T07:03:58.847 回答
1

目前看来不可能。我最终改用了greenDAO,这是一种更快(不依赖于反射)的解决方案,它可以访问 SQLiteDatabase 对象,从而实现各种自定义可能性。

于 2015-01-06T21:38:32.007 回答
1

答案可能为时已晚,但它会帮助新来的人,它很容易query自定义queriesdatabase以便SUM或使用您可以Database通过以下代码获得访问权限的任何查询:

SugarDb sugarDb = new SugarDb(context);

那么它非常简单querydatabase例如你可以做 的

    SQLiteDatabase database = sugarDb.getDB();
    SQLiteStatement query = database.compileStatement("SELECT SUM(AMOUNT) FROM EXPENSES_MODEL");
    try {
        total = query.simpleQueryForLong();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        query.close();
    }

注意表名中的下划线?它是 Sugar ORM 命名我们的表的方式,因此在调用表时请小心。


注意列名是如何大写的?这是因为 Sugar ORM 将每一列都大写。


于 2016-09-08T14:38:33.377 回答