一般程式設計時為了節省系統資源,對於時常頻繁使用的變數或陣列,宣告後會重覆使用,但這個方式在 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;
    }
arrow
arrow

    genlee 發表在 痞客邦 留言(0) 人氣()