【发布时间】:2013-04-16 21:28:27
【问题描述】:
所以我正在构建一个警报应用程序。我想在首次安装应用程序时显示一些默认警报。例如,上午 7 点、上午 8 点和上午 9 点的 3 个警报。下面是我的代码。
调用getAllAlarms() 来检索要显示的警报列表。在第一次加载时,数据库将为空,所以如果是这种情况,我想插入一些默认值。这可以在else 语句中看到,我在其中添加警报,然后对其自身进行递归调用。我的理解是在添加了3个警报之后,我再次调用getAllAlarms,它应该可以正常进入if语句。在调试System.out.println 语句中可以看到这种情况。警报列表按预期打印出来,但是在某处显示该方法再次被调用,这导致列表变为空,如上一个调试语句所示。
你能看出问题出在哪里吗?我已经在项目中进行了文件搜索,除了方法本身和ListActivity 之外,我没有在任何地方调用删除方法,也没有调用getAllAlarms。我认为问题必须定位在getAllAlarms 方法中,但我找不到。是递归调用吗?
// Getting All Alarms
public List<Alarm> getAllAlarms() {
List<Alarm> alarmList = new ArrayList<Alarm>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_ALARMS;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Alarm alarm = new Alarm();
alarm.setID(cursor.getInt(0));
alarm.setHour(cursor.getInt(1));
alarm.setMinutes(cursor.getInt(2));
// Adding alarm to list
alarmList.add(alarm);
System.out.println("inside loop");
System.out.println(alarmList);
} while (cursor.moveToNext());
}
else
{
System.out.println("Adding default values...");
addAlarm(new Alarm(7,0));
addAlarm(new Alarm(8,0));
addAlarm(new Alarm(9,0));
System.out.println("Finished adding default values...");
getAllAlarms();
}
System.out.println("before");
System.out.println(alarmList);
System.out.println("after");
// return alarm list
return alarmList;
}
这是我的添加方法:
void addAlarm(Alarm alarm) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_HOUR, alarm.getHour()); // Alarm Name
values.put(KEY_MINUTES, alarm.getMinutes()); // Alarm Phone
// Inserting Row
db.insert(TABLE_ALARMS, null, values);
db.close(); // Closing database connection
}
调试输出:
04-23 16:17:49.261: I/System.out(10938): Adding default values...
04-23 16:17:49.291: I/System.out(10938): Finished adding default values...
04-23 16:17:49.291: I/System.out(10938): inside loop
04-23 16:17:49.291: I/System.out(10938): [07:00]
04-23 16:17:49.296: I/System.out(10938): inside loop
04-23 16:17:49.296: I/System.out(10938): [07:00, 08:00]
04-23 16:17:49.296: I/System.out(10938): inside loop
04-23 16:17:49.296: I/System.out(10938): [07:00, 08:00, 09:00]
04-23 16:17:49.296: I/System.out(10938): before
04-23 16:17:49.296: I/System.out(10938): [07:00, 08:00, 09:00]
04-23 16:17:49.296: I/System.out(10938): after
04-23 16:17:49.296: I/System.out(10938): before
04-23 16:17:49.296: I/System.out(10938): []
04-23 16:17:49.296: I/System.out(10938): after
更新::
我试过没有用:
if (cursor.moveToFirst()) { 做 { 警报警报 = 新警报(); alarm.setID(cursor.getInt(0)); alarm.setHour(cursor.getInt(1)); alarm.setMinutes(cursor.getInt(2)); // 添加警报到列表 警报列表.add(警报); System.out.println("内部循环"); System.out.println(alarmList);
} while (cursor.moveToNext());
}
else
{
System.out.println("Adding default values...");
addAlarm(new Alarm(7,0));
addAlarm(new Alarm(8,0));
addAlarm(new Alarm(9,0));
System.out.println("Finished adding default values...");
}
if(alarmList.isEmpty() || alarmList == null)
{
System.out.println("test" + alarmList);
getAllAlarms();
}
但是,如果我删除 if 语句以检查空列表,然后我将检查添加到数据库外部和 ListActivity 内部,这将自行工作。这不是我想要的。我不想在 Database 类之外处理默认值插入。
否则
{
System.out.println("正在添加默认值...");
addAlarm(新警报(7,0));
addAlarm(新警报(8,0));
addAlarm(新警报(9,0));
System.out.println("完成添加默认值...");
}
在ListActivity内部:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alarm_list);
Database db = new Database(AlarmListActivity.this);
list = db.getAllAlarms();
if(list.isEmpty())
{
list = db.getAllAlarms();
}
....
....
}
【问题讨论】:
标签: java android debugging android-sqlite default-value