android sqlite总是在2017年查询

时间:2017-07-18 11:42:24

标签: android sqlite android-sqlite

对于学校的Android计步器项目,我在教程后使用了SQLite。我只有一个表包含按天制作的步数(作为字符串)。 问题是,无论哪一天我打电话,它都会让我2017年的步数。所以我想这与我得到的日期有关。

这是处理数据库逻辑的类:

public class DatabaseHandler extends SQLiteOpenHelper {
    private static String TAG = "DatabaseHandler";

    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "statsManager";

    // Table name
    private static final String DAILY_STATS_TABLE = "dailyStats";

    // Contacts Table Columns names
    private static final String KEY_DAY = "day";
    private static final String KEY_STEPS = "steps";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.d(TAG, "::onCreate");
        String CREATE_STAT_TABLE = "CREATE TABLE " + DAILY_STATS_TABLE +                  "(" + KEY_DAY + " TEXT PRIMARY KEY," + KEY_STEPS + " INTEGER" + ")";
        db.execSQL(CREATE_STAT_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int   newVersion) {
        Log.d(TAG, "::onUpgrade");
        db.execSQL("DROP TABLE IF EXISTS " + DAILY_STATS_TABLE);
        onCreate(db);
    }

    public void addContact(DailyStat dailyStat) {
        Log.d(TAG, "::addContact");
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_DAY, dailyStat.getFormattedDate());
        Log.d(TAG, "trying to insert date : " + dailyStat.getFormattedDate());
        values.put(KEY_STEPS, dailyStat.get_steps());
        Log.d(TAG, "trying to insert steps : " + dailyStat.get_steps());

        // Inserting Row
        db.insert(DAILY_STATS_TABLE, null, values);
        db.close(); // Closing database connection
    }

    public DailyStat getDailyStat(String day) throws ParseException, NullPointerException {
        Log.d(TAG, "::getDailyStat");
        Log.i(TAG, "looking for : " + String.valueOf(day));
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(DAILY_STATS_TABLE,
                            new String[] {KEY_DAY, KEY_STEPS},
                            KEY_DAY + "=?",
                            new String[] {day},
                            null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
        }
        Log.i(TAG, cursor.toString());
        DailyStat result = null;
        try {
            Log.d(TAG, "got : " + cursor.getString(0) + " and " + cursor.getInt(0));
            result = new DailyStat(cursor.getString(0), cursor.getInt(0));
        } catch (CursorIndexOutOfBoundsException e) {
            Log.i(TAG, "no stats for this day.");
        } finally {
            cursor.close();
        }
        return result;
    }

// other methods

我在我的Galaxy S4 mini上测试了我的应用程序,所以我不能轻易看到数据库的样子。 我听说您无法看到使用insert()和query()方法形成的请求。

任何人都知道出了什么问题?

1 个答案:

答案 0 :(得分:0)

您遇到的问题是您没有从数据库中获取步骤。相反,你得到了约会的一部分。

这是以下两行

        Log.d(TAG, "got : " + cursor.getString(0) + " and " + cursor.getInt(0));
        result = new DailyStat(cursor.getString(0), cursor.getInt(0));

应该是: -

        Log.d(TAG, "got : " + cursor.getString(0) + " and " + cursor.getInt(1));
        result = new DailyStat(cursor.getString(0), cursor.getInt(1));

即。索引 1 (第2列步骤)而不是索引 0 (第1列)。

以下是您可能希望考虑采用的代码:a)修复问题并介绍可能更灵活的技术,并提供快速解决方法,以便无法查看数据库中的数据。

所以也许以下内容将会有用: -

1)我的简单 DailyStats 类(注意这是用于测试目的,它不打算使用,但已包含在内,因此您可以全面了解): -

public class DailyStat {

    private String mDate;
    private int mSteps;

    public DailyStat(String date, int steps) {
        mDate = date;
        mSteps = steps;
    }

    public String getFormattedDate() {
        return mDate;
    }

    public int get_steps() {
        return mSteps;
    }
}

2)更改后的/新 DBHelper 方法: -

        public DailyStat getDailyStat(String day) throws ParseException, NullPointerException {

            DailyStat result = null;
            Log.d(TAG, "::getDailyStat");
            //Log.i(TAG, "looking for : " + String.valueOf(day));
            Log.i(TAG, "looking for : " + day);
            SQLiteDatabase db = this.getReadableDatabase();
            Cursor cursor = db.query(DAILY_STATS_TABLE,
                    new String[] {KEY_DAY, KEY_STEPS},
                    KEY_DAY + "=?",
                    new String[] {day},
                    null, null, null, null);
            if (cursor.getCount() > 0) {
                cursor.moveToFirst();
                //Log.d(TAG, "got : " + cursor.getString(0) + " and " + cursor.getInt(0));
                Log.d(TAG, "got : " + cursor.getString(cursor.getColumnIndex(KEY_DAY))
                        + " and "
                        + cursor.getInt(cursor.getColumnIndex(KEY_STEPS))
                );

                //result = new DailyStat(cursor.getString(0), cursor.getInt(0));
                result = new DailyStat(cursor.getString(cursor.getColumnIndex(KEY_DAY)),
                        cursor.getInt(cursor.getColumnIndex(KEY_STEPS))
                );
            } else {
                Log.i(TAG, "no stats for this day.");
            }
            cursor.close();
            return result;
        }

        public Cursor getAllStats() {
            SQLiteDatabase db = this.getReadableDatabase();
            return db.query(DAILY_STATS_TABLE,null,null,null,null,null,null);
        }

        public void logAllStats(Cursor cursor) {
            while (cursor.moveToNext()) {
                Log.d(TAG,"Row " + Integer.toString(cursor.getPosition()));
                for (int i =0; i < cursor.getColumnCount();i++) {
                    Log.d(TAG, "\tColumn=" + cursor.getColumnName(i) +
                            " Value=" + cursor.getString(i)
                    );
                }
            }
        }

请注意!基本上我在getDailyStat中所做的就是利用cursor.getCount而不是检查空游标(游标不是空id,返回0行),以及使用cursor.getColumnIndex(columnname),后者解析了错误的索引(根据第一条评论)。

getAllStatslogAllStats只是为了快速解决无法查看数据库的问题而添加的。

3)用于测试的调用活动代码(注意我称为类 DatabaseHandler StepsDBHelper 以方便我): -

            //DailyStat ds = new DailyStat("21/03/2017",10); used for 1st run
            //DailyStat ds = new DailyStat("21/03/2016",10); used for 2nd run

            StepsDBHelper sdbhlp = new StepsDBHelper(this);
            //sdbhlp.addContact(ds); used for 1st and then 2nd run
            DailyStat ds1 = sdbhlp.getDailyStat("21/03/2016");
            Log.d("DS1","Day=" + ds1.getFormattedDate() + " Steps=" + Integer.toString(ds1.get_steps()));
            DailyStat ds2 = sdbhlp.getDailyStat("21/03/2017");
            Log.d("DS2","Day=" + ds2.getFormattedDate() + " Steps=" + Integer.toString(ds2.get_steps()));
            // using 21/03/2018 returns null DailyStats object
            DailyStat ds3 = sdbhlp.getDailyStat("21/03/2018");
            if (ds3 == null) {
                Log.d("DS3","NULL");
            } else {
                Log.d("DS3","Day=" + ds3.getFormattedDate() + " Steps=" + Integer.toString(ds3.get_steps()));
            }
            sdbhlp.logAllStats(sdbhlp.getAllStats());

最后,在前两次运行之后的输出添加了数据(根据注释): -

07-19 07:56:34.190 3981-3981/? D/DatabaseHandler: ::getDailyStat
07-19 07:56:34.190 3981-3981/? I/DatabaseHandler: looking for : 21/03/2016
07-19 07:56:34.191 3981-3981/? D/DatabaseHandler: got : 21/03/2016 and 10
07-19 07:56:34.191 3981-3981/? D/DS1: Day=21/03/2016 Steps=10
07-19 07:56:34.191 3981-3981/? D/DatabaseHandler: ::getDailyStat
07-19 07:56:34.191 3981-3981/? I/DatabaseHandler: looking for : 21/03/2017
07-19 07:56:34.191 3981-3981/? D/DatabaseHandler: got : 21/03/2017 and 10
07-19 07:56:34.191 3981-3981/? D/DS2: Day=21/03/2017 Steps=10
07-19 07:56:34.191 3981-3981/? D/DatabaseHandler: ::getDailyStat
07-19 07:56:34.191 3981-3981/? I/DatabaseHandler: looking for : 21/03/2018
07-19 07:56:34.194 3981-3981/? I/DatabaseHandler: no stats for this day.
07-19 07:56:34.195 3981-3981/? D/DS3: NULL
07-19 07:56:34.195 3981-3981/? D/DatabaseHandler: Row 0
07-19 07:56:34.195 3981-3981/? D/DatabaseHandler:   Column=day Value=21/03/2017
07-19 07:56:34.195 3981-3981/? D/DatabaseHandler:   Column=steps Value=10
07-19 07:56:34.195 3981-3981/? D/DatabaseHandler: Row 1
07-19 07:56:34.195 3981-3981/? D/DatabaseHandler:   Column=day Value=21/03/2016
07-19 07:56:34.195 3981-3981/? D/DatabaseHandler:   Column=steps Value=10

而不是2017年(使用我使用的日期格式的21),步数是预期的。