首页 > 解决方案 > 如何从 SQLite 获取一行到具有自定义对象的模型?

问题描述

我正在努力从 SQLite 获得一行。

这是我的 DatabaseHelper 片段:

public Expense getExpense(long id) {

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(EXPENSE_TABLE_NAME,
                new String[]{EXPENSE_COLUMN_ID, EXPENSE_COLUMN_TYPE, EXPENSE_COLUMN_PERSON_IN_DEBT, EXPENSE_COLUMN_AMOUNT,
                        EXPENSE_COLUMN_DESCRIPTION, EXPENSE_COLUMN_TIMESTAMP, EXPENSE_COLUMN_IS_PAID},
                EXPENSE_COLUMN_ID + "=?",
                new String[]{String.valueOf(id)}, null, null, null, null);

        if (cursor != null)
            cursor.moveToFirst();

        assert cursor != null;
        Expense expense = new Expense(
                cursor.getInt(cursor.getColumnIndex(EXPENSE_COLUMN_ID)),
  ERROR HERE -> (ExpenseType)cursor.getString(cursor.getColumnIndex(EXPENSE_COLUMN_TYPE)),
  ERROR HERE -> (Person)cursor.getString(cursor.getColumnIndex(EXPENSE_COLUMN_PERSON_IN_DEBT)),
                cursor.getDouble(cursor.getColumnIndex(EXPENSE_COLUMN_AMOUNT)),
                cursor.getString(cursor.getColumnIndex(EXPENSE_COLUMN_DESCRIPTION)),
                cursor.getString(cursor.getColumnIndex(EXPENSE_COLUMN_TIMESTAMP)),
                cursor.getInt(cursor.getColumnIndex(EXPENSE_COLUMN_IS_PAID))); // true for 1

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

费用模型中的构造函数如下所示:

public Expense(int id, ExpenseType expenseType, Person person, Double amount, String description, String timestamp, int isPaid).

我在上面标有错误的行中遇到了转换错误

“不可转换的类型;不能将 'java.lang.String' 转换为 'com...model.ExpenseType”

我怎样才能使这项工作?在数据库中,对象expenseTypeperson作为字符串添加。

标签: javaandroidsqliteobject

解决方案


使用这些行:

(ExpenseType)cursor.getString(cursor.getColumnIndex(EXPENSE_COLUMN_TYPE)),
(Person)cursor.getString(cursor.getColumnIndex(EXPENSE_COLUMN_PERSON_IN_DEBT))

您正在尝试将 2 个字符串强制转换为一个类型ExpenseType的对象和一个类型的对象,Person但这是无法完成的。
您没有发布类ExpenseTypeand Person,所以我不知道它们的构造函数,但是如果它们的构造函数将字符串作为参数,也许您可​​以这样做:

new ExpenseType(cursor.getString(cursor.getColumnIndex(EXPENSE_COLUMN_TYPE))),
new Person(cursor.getString(cursor.getColumnIndex(EXPENSE_COLUMN_PERSON_IN_DEBT)))

推荐阅读