从 sqlite db returns 一个空数组中读取值

Reading values from sqlite db returns an empty array

我正在尝试使用以下查询创建一个 sqlite table。

"CREATE TABLE " + TABLE_COMPLIANCE_STATUS + "("
        + KEY_ID + " INTEGER PRIMARY KEY,"
        + KEY_YEAR + " TEXT,"
        + KEY_DELAYED_COMPLIANCE + " TEXT,"
        + KEY_NOT_COMPLIED + " TEXT" + ")";

我使用以下代码向数据库添加值

db.addComplianceStatus(new ComplianceStatusModel(i, String.valueOf(year), String.valueOf(delayedCompliance), String.valueOf(notCompliance)));

我读取db的内容如下,

List<ComplianceStatusModel>  notifications = db.getAllComplianceStatus();
for (ComplianceStatusModel notify : notifications) {
    String log = "Id: "+notify.getId()+" ,Description: " + notify.getYear() + " ,Date: " + notify.getDelayedCompliance();
    // Writing Compliances to log
    Toast.makeText(getActivity().getApplicationContext(),log,Toast.LENGTH_SHORT).show();
}

这个returns一个空数组。我的错误可能是什么?当我尝试打印 Logging the db 时,它会打印内存地址。

以下是我的 getAllComplianceModel 方法

public List<ComplianceStatusModel> getAllComplianceStatus() {
        List<ComplianceStatusModel> complianceStatusModelList = new ArrayList<ComplianceStatusModel>();
        // Select All Query
        String selectQuery = "SELECT  * FROM " + TABLE_COMPLIANCE_STATUS;

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                ComplianceStatusModel complianceStatusModel = new ComplianceStatusModel();

                complianceStatusModel.setId(Integer.parseInt(cursor.getString(0)));
                complianceStatusModel.setYear(cursor.getString(1));
                complianceStatusModel.setDelayedCompliance(cursor.getString(2));
                complianceStatusModel.setNotComplied(cursor.getString(3));

                complianceStatusModelList.add(complianceStatusModel);
            } while (cursor.moveToNext());
        }
        return complianceStatusModelList;
    }

以下是addComplianceStatus方法

public void addComplianceStatus(ComplianceStatusModel complianceStatus) {
    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();

    contentValues.put(KEY_ID, complianceStatus.getId());
    contentValues.put(KEY_YEAR, complianceStatus.getYear());
    contentValues.put(KEY_DELAYED_COMPLIANCE, complianceStatus.getDelayedCompliance());
    contentValues.put(KEY_NOT_COMPLIED, complianceStatus.getNotComplied());
}

您在括号前的创建 table 语句中缺少 space: TABLE_COMPLIANCE_STATUS + "(" -> TABLE_COMPLIANCE_STATUS + " ("

你在 create sqlite 语句中漏掉了一个分号

"CREATE TABLE " + TABLE_COMPLIANCE_STATUS + "("
        + KEY_ID + " INTEGER PRIMARY KEY,"
        + KEY_YEAR + " TEXT,"
        + KEY_DELAYED_COMPLIANCE + " TEXT,"
        + KEY_NOT_COMPLIED + " TEXT" + ");";

测试数据库是否创建。

        DatabaseHelper dbHelper = new DatabaseHelper(mockContext);
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        Log.d("my_db_test", dbHelper.getDatabaseName()));

测试数据库版本。 (从前面的代码继续)

        Log.d("my_db_test", db.getVersion()));

测试table中的列(从前面的代码继续)

        Cursor dbCursor = db.query(YOUR_TABLE_NAME, null, null, null, null, null, null);
        String[] columnNames = dbCursor.getColumnNames();
        Log.d("my_db_test", "columns names: \n");
        for(int i = 0; i < columnNames.length; i++){
            Log.d("my_db_test", "columnNames " + i + ": " + columnNames[i] + "\n");
        }

如果所有测试都通过了,那么table就被正确创建了。然后你应该检查保存和加载方法。

我使用下面的代码将记录保存在数据库中

        ContentValues values = new ContentValues();
        values.put(DatabaseHelper.P_NAME, person.getName());
        values.put(DatabaseHelper.P_AGE, person.getAge());
        values.put(DatabaseHelper.P_COUNTRY, person.getCountry());
        isAdded = db.insert(YOUR_TABLE_NAME, null, values) > 0;

并使用代码加载所有记录

        Cursor cursor = db.query(YOUR_TABLE_NAME, null, null, null, null, null, null);
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            Person p = new Person();
            p.setId(cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseHelper.P_ID)));
            p.setName(cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.P_NAME)));
            p.setAge(cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseHelper.P_AGE)));
            p.setCountry(cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.P_COUNTRY)));
            personList.add(p);
            cursor.moveToNext();
        }

您还没有添加在 table 中存储您的值的方法。在你的 addCompilanceStatus() 方法中。您需要添加:

public void addComplianceStatus(ComplianceStatusModel complianceStatus) {
SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();

contentValues.put(KEY_ID, complianceStatus.getId());
contentValues.put(KEY_YEAR, complianceStatus.getYear());
contentValues.put(KEY_DELAYED_COMPLIANCE, complianceStatus.getDelayedCompliance());
contentValues.put(KEY_NOT_COMPLIED, complianceStatus.getNotComplied());

sqLiteDatabase.insert(TABLE_COMPLIANCE_STATUS, null, contentValues); //YOU HAVE FORGOT THIS
}