2016-12-1 課程內容
昨天學了Android數據庫升級、降級、創建
今天把數據庫表里面的數據讀取出來顯示到手機屏幕上
下面代碼是MainActivity.java 的代碼

package com.example.winxinmff; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; import com.example.entity.Message; import com.example.winxinmffSQL.R; import com.j256.ormlite.dao.Dao; public class MainActivity extends Activity { private SimpleAdapter sa; // 是android中一個列表適配器 主要用於做一些簡單的列表適配 private ListView lv; private List<Message> messageList = new ArrayList<Message>(); private List<Map<String, Object>> messageList2 = new ArrayList<Map<String, Object>>(); private List<Message> messageList3;// 用於ORMLite 的演示 // 看名字就是databasehelper,數據庫助手的意思,這本身就是一個類。 // 包含了數據庫連接,關閉,如果有拓展的話 可能包含基本的數據庫JDBC操作方法也就是簡化增刪改查的一些方法。 private DatabaseHelper db_helper; // 首次創建時,會調用這個方法。 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.weixin); // 此3行代碼用於創建表結構,以及初始化數據 MyDatabaseOpenHelper helper = new MyDatabaseOpenHelper( MainActivity1.this); SQLiteDatabase db = helper.getWritableDatabase(); db.close(); lv = (ListView) findViewById(R.id.listView1); sa = new SimpleAdapter(this, messageList2,// data 不僅僅是數據,而是一個與界面耦合的數據混合體 R.layout.listview_item_layout, new String[] { "tou", "userName", "lastMessage", "datetime" },// from 從來來 new int[] { R.id.imageView1, R.id.tv_userName, R.id.tv_lasMessage, R.id.tv_datetime }// to 到那里去 ); lv.setAdapter(sa); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Map<String, Object> item = messageList2.get(position); item.put("userName", "趙本山" + position); sa.notifyDataSetChanged(); } }); } // UI呈現在眼前 protected void onResume() { Log.i("ok", "onResume,界面出現了"); // 使用ORMLite db_helper = new DatabaseHelper(this); Dao<Message, Integer> message_dao = db_helper.getMessageDao(); try { messageList3 = message_dao.queryForAll(); // Log.i("ormlite", "記錄條數:"+messageList3.size()); String t = "記錄條數:" + messageList3.size(); Toast.makeText(this, t, Toast.LENGTH_LONG).show(); } catch (SQLException e) { String t = "記出錯:" + e.getMessage(); Toast.makeText(this, t, Toast.LENGTH_LONG).show(); } // 模擬讀取數據庫或者互聯網 for (int i = 0; i < messageList3.size(); i++) { Message p = new Message(); p.setTou1("xxx"); p.setUserName("不對外開放 高內聚 "); p.setLastMessage("匿名內部類也就是沒有名字的內部類匿名內部類也就是沒有名字的內部類"); p.setDatetime("11.11"); messageList.add(p);// 上周 // 定義一個界面與數據的混合體,一個item代表一行記錄 Map<String, Object> item = new HashMap<String, Object>(); // 一行記錄,包含多個控件 item.put("tou", R.drawable.a); // 頭像 item.put("userName", messageList3.get(i).getUserName() + i); // 名字 item.put("lastMessage", messageList3.get(i).getLastMessage()); // 內容 item.put("datetime", messageList3.get(i).getDatetime()); // 時間 messageList2.add(item); // 添加到集合 } super.onResume(); } // UI完全消失在眼前,完全被另外一個進程覆蓋 protected void onPause() { Log.i("ok", "onPause,被拋棄"); db_helper.close();// ??到底要不要? super.onPause(); } }
數據庫助手類

package com.example.winxinmff; import java.sql.SQLException; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import com.example.entity.Message; import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper; import com.j256.ormlite.dao.Dao; import com.j256.ormlite.support.ConnectionSource; public class DatabaseHelper extends OrmLiteSqliteOpenHelper { private static final String DB_NAME = "mydata.db"; // 數據庫名稱 private static final int version = 1; // 數據庫版本 // 定義每一張表的成員變量,其中一個功能:關閉helper,所有DAO對象清理 private Dao<Message, Integer> messageDao; public Dao<Message, Integer> getMessageDao(){ if (messageDao == null) { try { messageDao = getDao(Message.class); } catch (SQLException e) { e.printStackTrace(); } } return messageDao; } public DatabaseHelper(Context context) { super(context, DB_NAME, null, version); } /* * 1. 此方法,不會自動執行,需要手動執行,因為它不是回調函數 * 2. 最后也不要自己調用,因為只應該執行1次 */ public void onCreate(SQLiteDatabase arg0, ConnectionSource arg1) { } /* * 此方法,不會自動執行,需要手動執行,因為它不是回調函數 */ public void onUpgrade(SQLiteDatabase arg0, ConnectionSource arg1, int arg2, int arg3) { } protected Object clone() throws CloneNotSupportedException { if (messageDao != null) { messageDao = null; } return super.clone(); } }
顯示效果:
和昨天用命令查詢是結果是一樣的 (圖是昨天的)
說一下里面的內容
41行 是new一個自己定義的MyDatabaseOpenHelper()方法
43行 getWritableDatabase() 方法以讀寫方式打開數據庫
44行 關閉資源
Android使用getWritableDatabase()和getReadableDatabase()方法都可以獲取一個用於操作數據庫的SQLiteDatabase實例。
(getReadableDatabase()方法中會調用getWritableDatabase()方法)
其中getWritableDatabase() 方法以讀寫方式打開數據庫,
一旦數據庫的磁盤空間滿了,數據庫就只能讀而不能寫,倘若使用的是getWritableDatabase() 方法就會出錯。
如果用戶從pause(暫停)的狀態又回到了你的activity,這個系統resume這個activity並且調用了onResume()這個方法。
暫停(pause)你的Activity
當系統調用activity的onPause()時, 雖然從技術角度來講你的activity是可見的,
但是更通常這也預示着用戶會離開這個activity,然后你的activity會進入stop狀態。
Activity的生命周期之Pause(暫停)和Resume(重新返回)
http://www.jcodecraeer.com/a/anzhuokaifa/developer/2013/0715/1439.html