所以我正在構建一個報警應用程序。我想在第一次安裝應用程序時顯示一些默認警報。例如,上午7點,上午8點和上午9點有3個鬧鐘。以下是我的代碼。爲什麼我不能在Android中的SQLite數據庫中添加這些默認值?
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()){ do警報警報=新警報(); alarm.setID(cursor.getInt(0)); alarm.setHour(cursor.getInt(1)); alarm.setMinutes(cursor.getInt(2)); //將警報添加到列表 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...");
}
if(alarmList.isEmpty() || alarmList == null)
{
System.out.println("test" + alarmList);
getAllAlarms();
}
然而,這個工程本身,如果我刪除if語句來檢查空列表,然後我添加了檢查數據庫外部和內部ListActivity
。這不是我想要的。我不想在Database類外部處理默認值插入。
else {
System.out.println(「Adding default values ...」); 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();
}
....
....
}
刪除了db.close(),然後用你所建議的但相同的結果包圍插入。 – 2013-04-23 16:00:43
使用單例獲取數據庫實例,更新答案 – Rahim 2013-04-23 16:12:37