發表文章

目前顯示的是 10月, 2018的文章

使用Intent在Activity間傳遞資料(bundle)

不同Activity想傳遞簡單的資料, 可以使用Intent內的Bundle來儲存, 然後再利用Intent本身回傳。 通常只有這兩種情況,而這兩種情況也可能連續發生。 1.  A Activity 傳值呼叫 B Activity , B Activity 取得 A 給予的值。 Ex:聯絡人App, 列表畫面 中點擊某個聯絡人跳出 編輯畫面 , 編輯畫面 需要預先填入該聯絡人的基本資料在每個欄位中。 2. 當 B Activity  處理完成 A Activity 給予的任務,要結束 B 本身並返回資料給 A 。 Ex:當編輯成功時, 編輯畫面 關閉但同時將已更改聯絡人的id返回給 列表畫面 。 檢討 雖然putExtra和getExtra用起來很簡單, 但還是錯用,因此特別書寫一下! 有一點我犯的錯,紀錄一下。 當你使用intent時,不用另外指定給它新Bundle()。 不過底下這行還沒編譯就會直接報錯了。 intent.extras = Bundle() 延用舊intent塞值: intent.putExtraString(KEY, 你要存的字串值) 或重新產生一個Intent再塞值: Intent().apply{    // put 你的資料在apply{ }中 } 最後putExtra能存的型態很多, 不只基本的Int、String、Float還有Array, 甚至連Serializable的物件都行。

如果不使用Room、LiveData、ViewModel只使用SqliteOpenHelper會怎樣? 上篇 "查詢"

圖片
關於學習Android的資料庫運作, 現在很少直接操作 SQLiteOpenHelper , 通常會直接學習使用Room和ContentProvider來操作資料, 並配合MMVM架構去撰寫程式碼。 但直接讓新手學這種較多抽象的東西, 如果沒實作過糟糕的方式...恐怕無法真正理解這些做法好在哪? 以及重點差異。 基於上述理由我想用 SQLiteOpenHelper 實作一個沒有清楚分割UI和Model的案例。 最棒的學習方式是從問題中學習並解決它, 所以我們來假設一個需求「能查看&修改產品清單的App」 (當然只限於Android端)。 產品可視為一個資料表Products, 每一個產品需要有產品名稱、價格、庫存量,最後還需要一個唯一值的ID,總共4個Column要定義。 規劃的架構如下: Step1 建立一個Contract來管理資料庫、資料表會用到的常量。 將條目定義成常量的好處在於IDE會提供自動補全, 可以避免打錯字這類低階錯誤, Step2 建立資料類別Product 將每一筆資料都轉成Product物件處理,方便RecyclerView的Adapter處理。 Step3 建立ProductSqlOpenHelper 繼承父類SqliteOpenHelper,並實現類的 onCreate 和 onUpgrade 。 通常 onCreate 做的就是建立資料表, onUpgrade 則是當資料表結構有變動之類的進行更新的函數(當 VERSION_NUMBER 改變)。 另外我又定義了兩個方法, 查詢資料用的方法 getAllProducts  回傳的結果型態是List<Product>,之後將會提供給Adapter使用。 參數只需要SqliteDatabase, 回傳的結果就是一個Product的List(List<Product>), 之後會提供給Adapter使用。 插入Product用的方法 insertProduct 參數包掛db、Product代表要插入Products資料表的資料, 回傳新增item的id,如果新增失敗回傳-1, 因為db.insert會回傳插入item的id,當錯誤發