2013-04-03 6 views
0

Это похоже на полную паранормальную активность для меня. Я получил эту маленькую функцию преобразования данных базы данных в объекты:Неверные значения, возвращаемые с помощью курсора

public List<BudgetSummary> getMonnthlyBalance() { 
    List<BudgetSummary> list = new ArrayList<BudgetSummary>(); 

    DbAdapter db = new DbAdapter(context); 
    SQLiteDatabase sqldb = db.open(); 
    MonthlyBalanceSqlSelect sql = new MonthlyBalanceSqlSelect(); 
    Cursor cursor = sql.getCursor(sqldb); 

    while (cursor.moveToNext()) { 
     list.add(new BudgetSummary(cursor)); 
    } 

    cursor.close(); 
    db.close(); 
    return list; 
} 

MonthlyBalanceSqlSelect содержит SQL запрос, который я скопировал из отладчика в Sqliteman. Я извлек файл базы данных из приложения. Вот результаты:

enter image description here

Это выглядит идеально подходит для меня. Давайте посмотрим на конструктор BudgetSummary. Это просто, как провод.

public BudgetSummary(Cursor cursor) { 
    incomes = cursor.getDouble(cursor.getColumnIndex("incomes")); 
    expenses = cursor.getDouble(cursor.getColumnIndex("expenses"));  
} 

Я пошаговый отладчик с каждой итерацией внутри этого конструктора. Оно должно соответствовать данным, приведенным на картинке, но это не ... Вот результаты:

1. incomes: 4732.0 - wrong | expenses: -57.59 - wrong  | month and year correct 
2. incomes: 4657.0 - correct | expenses: -3714.96 - correct | month and year correct 
3. incomes: 708.0 - wrong | expenses: -3383.03 - correct | month and year correct 
4. incomes: 5669.48 - wrong | expenses: -5669.48 - wrong | month and year correct 
5. incomes: 3278.5 - correct | expenses: -2685.91 - wrong | month and year correct 
6. incomes: 4612.5 - wrong | expenses: -2786.78 - wrong | month and year correct 
and so on... 

Что колдовство это? Я действительно не знаю ... как некоторые ценности могут быть правильными, а остальные - совершенно неожиданно?

Вот запрос SQL. Я сильно подозреваю, что java видит это по-другому, что Sqliteman соответствует this. К сожалению, я не знаю, как это должно выглядеть.

select strftime('%m', b.date) as month , strftime('%Y', b.date) as year, total(case when b.value >= 0 then b.value else 0 end) as incomes, total(case when b.value < 0 then b.value else 0 end) as expenses from budget b, category c where b.category_id = c.id group by month, year order by year desc, month desc 
+0

Покажите нам запрос SQL. –

+1

Кроме того, хранение денег в виде плавающей точки - очень плохая идея! –

+0

как бы вы их сохранили? –

ответ

1

Я сильно подозревают, что проблема в том, что вы предполагая тот же порядок строк в Sqliteman и код Java. Если ваш SQL явно не указывает порядок, вы не должны предполагать, что он будет таким же. Я предлагаю вам включить месяц и год в ваш запрос и включить это в ваш BudgetSummary, а также, по крайней мере, для диагностики.

+0

Я удалил месяц и год для упрощения. Пройдите в порядке с картинки. И значения не совпадают. Более того. Значения, которые не совпадают, даже не в любом поле этого курсора! –