2013-04-23 56 views
0

所以我正在構建一個報警應用程序。我想在第一次安裝應用程序時顯示一些默認警報。例如,上午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(); 
} 
.... 
.... 

}

回答

2

由於@umesh建議,使用getReadableDatabase(),無需db.close(),但最重要的包你在交易中寫道:

db.beginTransaction(); 
// insert 
db.setTransactionSuccessful(); 
db.endTransaction(); 

更新:單(ISH)模式

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DBOpenHelper extends SQLiteOpenHelper { 

    private enum OpenHelperEnum { 
     INSTANCE; // Singleton instance; 

     // Instance of dbHelper for all DB access in threads 
     private SQLiteOpenHelper dbHelper = null; 
     private SQLiteDatabase database = null; 

     public SQLiteDatabase getDB(final Context context) { 
      if (dbHelper == null) { 
       dbHelper = new DBOpenHelper(context); 
      } 
      if (database == null) { 
       database = dbHelper.getReadableDatabase(); 
      } 
      return database; 
     } 
    } 

    public DBOpenHelper(final Context context) { 
     super(context, "DBName", null, 1); 
    } 

    @Override 
    public void onCreate(final SQLiteDatabase database) { 
     // ... 
    } 

    @Override 
    public void onUpgrade(final SQLiteDatabase database, final int oldVersion, final int newVersion) { 
     // ... 
    } 

    @Override 
    public void onDowngrade(final SQLiteDatabase database, final int oldVersion, final int newVersion) { 
     // ... 
    } 

    public static SQLiteDatabase getDB(final Context context) { 
     return DBOpenHelper.OpenHelperEnum.INSTANCE.getDB(context); 
    } 
} 

要得到DATABSE使用:

final SQLiteDatabase db = DBOpenHelper.getDB(this); 
+0

刪除了db.close(),然後用你所建議的但相同的結果包圍插入。 – 2013-04-23 16:00:43

+0

使用單例獲取數據庫實例,更新答案 – Rahim 2013-04-23 16:12:37

0

getAllAlarms方法只是改變

getWritableDatabase 

getReadableDatabase 

像下面

String selectQuery = "SELECT * FROM " + TABLE_ALARMS; 

SQLiteDatabase db = this.getReadableDatabase(); 
Cursor cursor = db.rawQuery(selectQuery, null); 
+0

沒有工作。不知道爲什麼會有區別... – 2013-04-23 15:35:59

+1

嘗試刪除addAlarm()中的db.close(),如果它不起作用,將看到更多 – umesh 2013-04-23 15:44:38

+0

刪除並仍然不起作用。 getAllAlarms方法以某種方式被調用3次... – 2013-04-23 15:47:26

相關問題