0

だから私はアラームアプリケーションを構築しています。アプリケーションが最初にインストールされたときに、いくつかのデフォルト アラームを表示したいと考えています。たとえば、午前 7 時、午前 8 時、午前 9 時の 3 つのアラーム。以下は私のコードです。

getAllAlarms()表示するアラームのリストを取得するために呼び出されます。最初のロードではデータベースが空になるので、その場合はデフォルト値を挿入したいと思います。これはelse、アラームを追加してから再帰呼び出しを行うステートメントで確認できます。私の理解では、3 つのアラームを追加した後、getAllAlarmsもう一度呼び出すと、if ステートメントに正常に入るはずです。System.out.printlnデバッグステートメントに見られるように、これは事実のようです。アラームのリストは期待どおりに出力されますが、行のどこかでメソッドが再度呼び出されたように見えます。その結果、最後のデバッグ ステートメントで確認できるように、リストが空になります。

どこに問題があるか分かりますか?プロジェクトでファイル検索を実行しましたが、どこでも削除メソッドを呼び出していません。getAllAlarmsまた、メソッド自体の内部とListActivity. 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("ループ内"); 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("デフォルト値を追加しています..."); 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();
}
....
....

}

4

2 に答える 2

0

getAllAlarmsメソッドで変更するだけ です

getWritableDatabase

getReadableDatabase  

以下のように

String selectQuery = "SELECT  * FROM " + TABLE_ALARMS;

SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
于 2013-04-23T15:31:36.967 に答える