android初學特訓班 建構式的問題 |
|
Pan
更新時間:2013/2/4 下午 12:38:13 |
|
書:android 初學特訓班 範例:SQLite3專案
在範例中有提到建構式~
MyDB.java private Context mCtx = null; public MyDB(Context ctx){ this.mCtx = ctx; }
SQLite3Activity.java db =new MyDB(this); db.open(); cursor=db.getAll(); UpdataAdapter(cursor);
不太能理解建構式的概念,有適當的資料可以參考嗎?
|
|
|
|
文淵閣工作室
更新時間:2013/2/6 上午 11:50:52 |
|
親愛的讀者:您好 您的問題非常好,這是程式語言中類別與物件的觀念,也是這個範例最重要的觀念。
類別可以說是建立物件的藍圖,根據類別(藍圖),建立的實體就是物件。 例如:建造房屋時會依據設計圖(類別),建出許多相同造型的房子(物件)。 在類別中,會有一個和類別名稱的方法,用於物件的初始化,稱為建構式,如果不自行建立建構式, 系統會自行建立預設的建構式,此外,建構式也可以多載。
您可在網路以 「java 類別和物件」 查詢,應可得到更佳的資訊。
回到問題來,MyDB 是我們自建的類別,public MyDB(Context ctx) 就是自建的建構式, 它接收一個 Context 型別的參數,實際上就是以 db =new MyDB(this); 傳進來的 this, 而 this 又是甚麼呢? 它其實就是建立這個物件的主程式類別,以本程式來說就是 SQLite3Activity.java 我們也可以 db =new MyDB(SQLite3Activity.java); 來建立 MyDB 物件,兩者其實上相同的。 在 java 語言,這樣的關係稱為相依,簡單的說 db =new MyDB(this); 就是請將 MyDB 物件建立在 主程式中,如果不加 this ,就會出現錯誤,您可以試試看。
在建構式中,接收的參數 ctx 是 MyDB 類別的 private 型別的參數,為了讓 MyDB 類別的所有方法都可以使用此 ctx, 我們將接此的 ctx 放入另一個可在 MyDB 類別中使用的全域變數 mCtx (this.mCtx=ctx), 這個 mCtx 就是 ctx ,也是 this ,或是 SQLite3Activity.java。
MyDB.java private Context mCtx = null; public MyDB(Context ctx){ this.mCtx = ctx; }
SQLite3Activity.java db =new MyDB(this); db.open(); cursor=db.getAll(); UpdataAdapter(cursor);
|
|
|
|
Pan
更新時間:2013/2/7 上午 08:43:04 |
|
非常感謝你的回覆~
我試著用範例去設計一個app 有三個class在三個java檔案
main.java 一開始使用MyDB的方法open()開啟資料庫 且顯示每個功能的Button.
db_insert.java 設定要新增資料的layout.並將輸入到EditText資料送到MyDB db_inser()做新增的動作。
MyDB.java裡都是處理DB要做的事
問題:當我將資料送到db_insert(String n, int p)。 在Debug mode時可以看到n, p 可以接收到傳送進來的資料,但在執行 db.execSQL() 卻發生nullpoint的情況。
MyDB.java public void append(String n,int p) { String str = "INSERT INTO " + TABLE_NAME + " (" + NAME + "," + PRICE + ") VALUES (" + n +"," + p + ")"; db.execSQL(str); }
不知道是哪邊出了問題。
|
|
|
|
文淵閣工作室
更新時間:2013/2/8 下午 12:19:14 |
|
親愛的讀者:您好
從經驗看來,可能是 SQL 語法有錯誤,資料中 n 是字串,應該用 引號('n') 括起來。改為:") VALUES ('" + n +"'," + p + ")"; 不過,建議您參考 13-22 以 ContentValue 來處理,比較不會出錯。 如果還是解決不了,請 mail to:「 chiou@e-happy.com.tw」我們再協助處理。
原程式對照 public void append(String n,int p) { String str = "INSERT INTO " + TABLE_NAME + " (" + NAME + "," + PRICE + ") VALUES (" + n +"," + p + ")"; db.execSQL(str); }
|
|
|
|
|
|
|