对于学校的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()方法形成的请求。
任何人都知道出了什么问题?
答案 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)
,后者解析了错误的索引(根据第一条评论)。
getAllStats
和logAllStats
只是为了快速解决无法查看数据库的问题而添加的。
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),步数是预期的。