2015-01-06 2 views
1

Кто-нибудь знает, можно ли суммировать столбцы с помощью Sugar ORM? Я попытался найти любую документацию, и есть метод необработанных запросов, однако, метод необработанных запросов не имеет возвращающих значений.Sugar ORM SUM a column

Пример: "выберите сумму (цена) от ATable"

Class.executeQuery() является недействительным.

Sugar ORM не кажется очень полезным до тех пор, пока этот вид функций (наряду с JOIN и т. Д.) Не присутствует.

ответ

2

я, наконец, сделать это с помощью следующего кода:

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(); 
} 

необходимо также изменить класс приложения для доступа к свойству базы данных, поскольку имеет защищенный доступ (не забудьте изменить манифест должным образом).

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

Надеюсь, это поможет.

1

В настоящее время это не представляется возможным. В итоге я использовал greenDAO, гораздо более быстрое (не зависящее от рефлексии) решение, которое дает доступ к объекту SQLiteDatabase, обеспечивая всевозможные пользовательские возможности.

+0

Я столкнулся аналогичные проблемы на SUM колонку на сахар, с пользовательским запросом также не возможно !! http://satyan.github.io/sugar/query.html? –

+1

сахарный соус сосет! решили эту сумму, отфильтровывая извлеченный список http://stackoverflow.com/questions/25699131/sum-value-of-class-objects-property-in-arraylist –

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(); 
} 
+0

Отличный ответ! Это должно быть принято! Спасибо огромное! –

+0

Отличный ответ, но я думаю, что лучше использовать базовый стиль кодирования для Android в таких сценариях, как пользовательские запросы, поскольку сахара не полностью поддерживает это: D –

1

Ответ может быть слишком поздно, но это поможет новых игроков, его довольно легко query пользовательских queries в database в порядке чтобы SUM или использовать любой запрос, который вы могли бы получить доступ к Database по следующему коду:

SugarDb sugarDb = new SugarDb(context); 

, то его довольно прямо вперед query в database, например, вы могли бы сделать

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 использует каждый столбец.