一般程式設計時為了節省系統資源,對於時常頻繁使用的變數或陣列,宣告後會重覆使用,但這個方式在 Android Studio 中這麼做卻會造成錯誤或問題,範例如下:
public class TDB_Columns { public int iNo; public String sName; public String sLogDate; public String sLog; public int iRank; }; //query from database and add all existed data to arraylist public ArrayList<TDB_Columns> query_db_to_array() { ls_Result.setAdapter(null); TDB_Columns DB_Columns=new TDB_Columns(); //<--------------Here is wrong Cursor cursor = db.rawQuery("select * from FRecord_Table", null); ArrayList<TDB_Columns> arrayStrings = new ArrayList<TDB_Columns>(); cursor.moveToFirst(); int iCount=0; while (cursor.moveToNext()) { DB_Columns.iNo=cursor.getInt(0); DB_Columns.sLogDate=cursor.getString(1); DB_Columns.sName=cursor.getString(2); DB_Columns.sLog=cursor.getString(3); DB_Columns.iRank=cursor.getInt(4); arrayStrings.add(iCount, DB_Columns); iCount++; } cursor.close(); return arrayStrings; }
可以看到,因為 while 迴圈中會不斷以 DB_Columns 去儲存資料表中的資料,供後續使用,
所以我宣告一次 DB_Columns 物件後就重覆使用,因而造成編譯或執行過程中不如預期的問題。
正確的作法應該是:
public ArrayList<TDB_Columns> query_db_to_array() { ls_Result.setAdapter(null); Cursor cursor = db.rawQuery("select * from FRecord_Table", null); ArrayList<TDB_Columns> arrayStrings = new ArrayList<TDB_Columns>(); cursor.moveToFirst(); int iCount=0; while (cursor.moveToNext()) { TDB_Columns DB_Columns=new TDB_Columns(); //<---Shall new a object here every time DB_Columns.iNo=cursor.getInt(0); DB_Columns.sLogDate=cursor.getString(1); DB_Columns.sName=cursor.getString(2); DB_Columns.sLog=cursor.getString(3); DB_Columns.iRank=cursor.getInt(4); arrayStrings.add(iCount, DB_Columns); iCount++; } cursor.close(); return arrayStrings; }