首页 > 解决方案 > 模型对象与数据库结果不匹配

问题描述

记录迭代后,列表键值不匹配/错误显示!可能是什么原因。

像这样保存数据库中的正确数据(这是正确的)

问题:您可以在此屏幕截图链接中看到,记录与列不匹配,例如键 dayName 的值显示错误,键 MenuIcon 值显示在 dayName 键上

sql lite DAO

    /*
* Get the all the exercises by ID asecending order
 */
public LinkedList<ExerciseDetails> getAllExerciseInfo() {
    LinkedList<ExerciseDetails> listCompanies = new LinkedList<ExerciseDetails>();
    Cursor cursor = mDatabase.query(DBHelper.TABLE_EXERCISE_DETAILS, mAllColumns,
            "",
            new String[]{}, "order_id", null, "order_id ASC");
    if (cursor != null) {
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            ExerciseDetails company = cursorToExerciseDetails(cursor);
            listCompanies.add(company);
            cursor.moveToNext();
        }
        // make sure to close the cursor
        cursor.close();
    }
    return listCompanies;
}

用于插入、创建表、列出对象的 DAO 的完整代码。请让我知道您想查看的任何代码,我会发布

public class ExercisesDAO {

    public static final String TAG = "ExercisesDAO";

    // Database fields
    private SQLiteDatabase mDatabase;
    private DBHelper mDbHelper;
    private Context mContext;
    private String[] mAllColumns = {DBHelper.COLUMN_EX_DETAILS_ID,
            DBHelper.COLUMN_ROUTINE_ID,
            DBHelper.COLUMN_DAY_ID,
            DBHelper.COLUMN_EXERCISE_ID,
            DBHelper.COLUMN_REPS,
            DBHelper.COLUMN_SETS,
            DBHelper.COLUMN_TIME_PERSET,
            DBHelper.COLUMN_CALORIE_BURN,
            DBHelper.COLUMN_RESTTIME_PERSET,
            DBHelper.COLUMN_RESTTIME_POST_SET,
            DBHelper.COLUMN_ORDER_ID,
            DBHelper.COLUMN_EXERCISE_NAME,
            DBHelper.COLUMN_TIPS,
            DBHelper.COLUMN_YOUTUBE_URL,
            DBHelper.COLUMN_WARNINGS,
            DBHelper.COLUMN_DISPLAY_ID,
            DBHelper.COLUMN_VISIBILITY,
            DBHelper.COLUMN_FOR_DATE,
            DBHelper.COLUMN_GIF,
            DBHelper.COLUMN_DAYNAME
    };

    public ExercisesDAO(Context context) {
        this.mContext = context;
        mDbHelper = new DBHelper(context);
        // open the database
        try {
            open();
        } catch (SQLException e) {
            Log.e(TAG, "SQLException on openning database " + e.getMessage());
            e.printStackTrace();
        }
    }

    public void open() throws SQLException {
        mDatabase = mDbHelper.getWritableDatabase();
    }

    public void close() {
        mDbHelper.close();
    }

    public ExerciseDetails createExerciseDetail(String routineId,String dayId,
           String exerciseId, String reps,String sets, String timePerset,
           String calorieBurn, String resttimePerset, String resttimeAfterex,String order,
           String menuName, String tips, String youtubeUrl, String warnings, String displayId,
           String visibility, String forDate, String menuIcon, String dayName) {

        ExerciseDetails newCompany = null;
        try {
            ContentValues values = new ContentValues();
            values.put(DBHelper.COLUMN_ROUTINE_ID, routineId);
            values.put(DBHelper.COLUMN_DAY_ID, dayId);
            values.put(DBHelper.COLUMN_EXERCISE_ID, exerciseId);
            values.put(DBHelper.COLUMN_REPS, reps);
            values.put(DBHelper.COLUMN_SETS, sets);
            values.put(DBHelper.COLUMN_TIME_PERSET, timePerset);
            values.put(DBHelper.COLUMN_CALORIE_BURN, calorieBurn);
            values.put(DBHelper.COLUMN_RESTTIME_PERSET, resttimePerset);
            values.put(DBHelper.COLUMN_RESTTIME_POST_SET, resttimeAfterex);
            values.put(DBHelper.COLUMN_ORDER_ID, order);
            values.put(DBHelper.COLUMN_EXERCISE_NAME, menuName);
            values.put(DBHelper.COLUMN_TIPS, tips);
            values.put(DBHelper.COLUMN_YOUTUBE_URL, youtubeUrl);
            values.put(DBHelper.COLUMN_WARNINGS, warnings);
            values.put(DBHelper.COLUMN_DISPLAY_ID, displayId);
            values.put(DBHelper.COLUMN_VISIBILITY, visibility);
            values.put(DBHelper.COLUMN_FOR_DATE, forDate);
            values.put(DBHelper.COLUMN_GIF, menuIcon);
            values.put(DBHelper.COLUMN_DAYNAME, dayName);

            long insertId = mDatabase
                    .insert(DBHelper.TABLE_EXERCISE_DETAILS, null, values);
            Cursor cursor = mDatabase.query(DBHelper.TABLE_EXERCISE_DETAILS, mAllColumns,
                    DBHelper.COLUMN_EX_DETAILS_ID + " = " + insertId, null, null,
                    null, null);
            cursor.moveToFirst();
            newCompany = cursorToExerciseDetails(cursor);
            cursor.close();

        } catch (Exception e) {
            Log.e("exception", "exception in CreateFollowing class - " + e);
        }
        return newCompany;
    }


    public void executeSqlOnExerciseDetail(String sql) {
        mDatabase.execSQL(sql);
    }

    public Long getTotalCountExerciseDetail() {
        return DatabaseUtils.queryNumEntries(mDatabase, DBHelper.TABLE_EXERCISE_DETAILS);
    }

    /*
    * Get the all the exercises by ID asecending order
     */
    public LinkedList<ExerciseDetails> getAllExerciseInfo() {
        LinkedList<ExerciseDetails> listCompanies = new LinkedList<ExerciseDetails>();
        Cursor cursor = mDatabase.query(DBHelper.TABLE_EXERCISE_DETAILS, mAllColumns,
                "",
                new String[]{}, "order_id", null, "order_id ASC");
        if (cursor != null) {
            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
                ExerciseDetails company = cursorToExerciseDetails(cursor);
                listCompanies.add(company);
                cursor.moveToNext();
            }
            // make sure to close the cursor
            cursor.close();
        }
        return listCompanies;
    }


    /*
      * Check whether the exercise data present or not in the db before executing statement
     */
    public  boolean CheckIfRecordExists(String rid, String did) {

        String Query = "Select * from " + DBHelper.TABLE_EXERCISE_DETAILS + " where " + DBHelper.COLUMN_ROUTINE_ID + " = " + rid +  " AND " + DBHelper.COLUMN_DAY_ID + " = " + did;
        Cursor cursor = mDatabase.rawQuery(Query, null);
        if(cursor.getCount() <= 0){
            cursor.close();
            return false;
        }
        cursor.close();
        return true;
    }


    protected ExerciseDetails cursorToExerciseDetails(Cursor cursor) {
        try{
        ExerciseDetails exerciseDetails = new ExerciseDetails();

        exerciseDetails.setExDetailsId(cursor.getLong(0));
        exerciseDetails.setRoutineId(cursor.getString(1));
        exerciseDetails.setDayId(cursor.getString(2));
        exerciseDetails.setExerciseId(cursor.getString(3));
        exerciseDetails.setReps(cursor.getString(4));
        exerciseDetails.setSets(cursor.getString(5));
        exerciseDetails.setTimePerset(cursor.getString(6));
        exerciseDetails.setCalorieBurn(cursor.getString(7));
        exerciseDetails.setResttimePerset(cursor.getString(8));
        exerciseDetails.setOrder(cursor.getString(9));
        exerciseDetails.setMenuName(cursor.getString(10));
        exerciseDetails.setTips(cursor.getString(11));
        exerciseDetails.setYoutubeUrl(cursor.getString(12));
        exerciseDetails.setWarnings(cursor.getString(13));
        exerciseDetails.setDisplayId(cursor.getString(14));
        exerciseDetails.setVisibility(cursor.getString(15));
        exerciseDetails.setForDate(cursor.getString(16));
        exerciseDetails.setMenuIcon(cursor.getString(17));
        exerciseDetails.setDayName(cursor.getString(18));
        return exerciseDetails;

        } catch (Exception e){
            System.out.println("error------------"+e);
            return  null;
        }
    }

}

我插入 sqllite https://pastebin.com/DmAkPkXg的完整 json 值

标签: androidsqliteandroid-sqlite

解决方案


cursorToExerciseDetails()不是显式设置列的索引:

exerciseDetails.setExDetailsId(cursor.getLong(0));
exerciseDetails.setRoutineId(cursor.getString(1));
....................................................

与列名一起使用getColumnIndex()以返回索引:

exerciseDetails.setExDetailsId(cursor.getLong(cursor.getColumnIndex(DBHelper.COLUMN_EX_DETAILS_ID)));
exerciseDetails.setRoutineId(cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_ROUTINE_ID))));
....................................................

推荐阅读