Android數據庫操作_表格顯示
顯示表格布局
首先需要一個主布局文件main.xml
復制代碼
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<View
android:layout_width="0.5px"
android:layout_height="fill_parent"
android:background="#B8B8B8"
android:visibility="visible" />
<TextView
android:id="@+id/id"
android:layout_width="0dip"
android:layout_height="35dip"
android:layout_weight="2"
android:textColor="#CD3700"
android:textSize="20sp" />
<View
android:layout_width="0.5px"
android:layout_height="fill_parent"
android:background="#B8B8B8"
android:visibility="visible" />
<TextView
android:id="@+id/name"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="3"
android:textColor="#000000"
android:textSize="17sp" />
<View
android:layout_width="0.5px"
android:layout_height="fill_parent"
android:background="#B8B8B8"
android:visibility="visible" />
<TextView
android:id="@+id/age"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="#000000"
android:textSize="17sp" />
<View
android:layout_width="0.5px"
android:layout_height="fill_parent"
android:background="#B8B8B8"
android:visibility="visible" />
</LinearLayout>
復制代碼
View起到的作用是在兩列之間起到分割的作用,縱觀這個布局文件,就是完成這樣的工作,設置一個表頭,將三個TextView放置在一個水平的線性布局中去,分別顯示一列的表頭,然後需要一個ListView與上述的線性布局一同放入一個垂直的線性布局中去,用來顯示每一條記錄。而每一條記錄的顯示需要我們來實現一個adapter去完成每一項的顯示,下面就完成這個項的布局文件:itemlayout.xml
復制代碼
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<View
android:layout_width="0.5px"
android:layout_height="fill_parent"
android:background="#B8B8B8"
android:visibility="visible" />
<TextView
android:id="@+id/id"
android:layout_width="0dip"
android:layout_height="35dip"
android:layout_weight="2"
android:textColor="#CD3700"
android:textSize="20sp" />
<View
android:layout_width="0.5px"
android:layout_height="fill_parent"
android:background="#B8B8B8"
android:visibility="visible" />
<TextView
android:id="@+id/name"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="3"
android:textColor="#000000"
android:textSize="17sp" />
<View
android:layout_width="0.5px"
android:layout_height="fill_parent"
android:background="#B8B8B8"
android:visibility="visible" />
<TextView
android:id="@+id/age"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="#000000"
android:textSize="17sp" />
<View
android:layout_width="0.5px"
android:layout_height="fill_parent"
android:background="#B8B8B8"
android:visibility="visible" />
</LinearLayout>
復制代碼
在listview中每一項的布局應該是這樣的,需要View來分割每一列,然後需要TextView來顯示數據的信息,這些組件之間放在一個水平的線性布局中去。
這樣我們就完成了程序的主體布局。接下來我們需要一個適配器(adapter)來完成對listview中每一項的數據填入。SimpleCursorAdapter是一個簡單 的適配器,可以將cursor中的每一行的記錄映射到一個顯示的組件上一般是TextView或者是ImageView。那我們就繼承這個類來完成自己的adapter。
下面是我們的adapter它繼承了SimpleCursorAdapter。
復制代碼
package com.example.gird;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SimpleCursorAdapter;
public class MySimpleCursorAdapter extends SimpleCursorAdapter {
public MySimpleCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView != null) {
view = convertView;
} else {
view = super.getView(position, convertView, parent);
}
/*author:conowen
* date:2012.4.2
* MySimpleCursorAdapter
*/
int[] colors = { Color.WHITE, Color.rgb(219, 238, 244) };// RGB顏色
view.setBackgroundColor(colors[position % 2]);// 每隔item之間顏色不同
return super.getView(position, view, parent);
}
}
復制代碼
在其中完成的主要是對getView方法的重寫。position當前由不可見到可見的項的位置,convertView就是要顯示的組件項,這個時候Android不會每次都去實例化一個新的view對象,而是去看在緩存中是否存在一個這樣的對象,若有就直接拿來,若沒有才會去實例化新的對象。而parent是告訴這些個項最終會依附在哪一個父親組件上去(Listview)。
復制代碼
package com.example.gird;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.database.Cursor;
import android.database.sqlite.SQLiteCursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class GridActivity extends Activity {
public int DB_VERSION = 1;
SQLiteDatabase db;
// DbHelper類在DbHelper.java文件裡面創建的
ListView lv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 建立打開數據庫
db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);
db.execSQL("DROP TABLE IF EXISTS person");
// 創建person表
db.execSQL("CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age SMALLINT)");
// 插入數據
for (int i = 0; i < 20; i++) {
Person person = new Person();
person.name = "john" + i;
person.age = 30 - i;
db.execSQL("INSERT INTO person VALUES (NULL, ?, ?)", new Object[] {
person.name, person.age });
}
lv = (ListView) findViewById(R.id.lv);
updatelistview();
// 添加一個長按事件
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
final int position, long id) {
// 實例化一個彈出框
new AlertDialog.Builder(GridActivity.this)
.setTitle("選擇操作")
.setItems(new String[] { "更新", "刪除", "取消" },
// 為彈出框上的選項添加事件
new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
switch (which) {
// 表示更新內容
case 0:
LayoutInflater inflater = getLayoutInflater();
// 自定義一個彈出口布局
final View layout = inflater
.inflate(
R.layout.dialog,
(ViewGroup) findViewById(R.id.dialog));
EditText nameTxt = (EditText) layout
.findViewById(R.id.editText1);
TextView ageTxt = (EditText) layout
.findViewById(R.id.editText2);
SQLiteCursor s_old = (SQLiteCursor) lv
.getItemAtPosition(position);
final int _id_old = s_old.getInt(s_old
.getColumnIndex("_id"));
final String name_old = s_old.getString(s_old
.getColumnIndex("name"));
final String age_old = s_old.getString(s_old
.getColumnIndex("age"));
nameTxt.setText(name_old);
ageTxt.setText(age_old);
new AlertDialog.Builder(
GridActivity.this)
.setTitle("更新")
.setView(layout)
.setPositiveButton(
"確定",
new OnClickListener() {
@Override
public void onClick(
DialogInterface dialog,
int which) {
ContentValues cv = new ContentValues();
String temp_name = ((EditText) layout
.findViewById(R.id.editText1))
.getText()
.toString();
String temp_age = ((EditText) layout
.findViewById(R.id.editText2))
.getText()
.toString();
cv.put("_id",
_id_old);
cv.put("name",
temp_name);
cv.put("age",
temp_age);
String[] id_index = { String
.valueOf(_id_old) };
db.update(
"person",
cv,
"_id=?",
id_index);
updatelistview();
}
})
.setNegativeButton("取消",
null).show();
break;
// 刪除記錄
case 1:
// getItemAtPosition()得到一個item裡的數據
SQLiteCursor s = (SQLiteCursor) lv
.getItemAtPosition(position);
final int _id = s.getInt(s
.getColumnIndex("_id"));
String name = s.getString(s
.getColumnIndex("name"));
Log.i("id ::", _id + "");
new AlertDialog.Builder(
GridActivity.this)
.setTitle(
"確定刪除" + name
+ "嗎?")
.setPositiveButton(
"確定",
new OnClickListener() {
@Override
public void onClick(
DialogInterface dialog,
int which) {
db.execSQL(
"delete from person where _id =?",
new Integer[] { _id });
updatelistview();
}
})
.setNegativeButton(
"取消",
new OnClickListener() {
@Override
public void onClick(
DialogInterface dialog,
int which) {
}
}).show();
break;
// 取消操作
case 2:
break;
}
}
}).show();
return false;
}
});
}
// 更新listview
public void updatelistview() {
Cursor cr = db.query("person", null, null, null, null, null, null);
String id = cr.getColumnName(0);
String name = cr.getColumnName(1);
String age = cr.getColumnName(2);
String[] ColumnNames = { id, name, age };
ListAdapter adapter = new MySimpleCursorAdapter(this,
R.layout.listviewlayout, cr, ColumnNames, new int[] { R.id.id,
R.id.name, R.id.age });
lv.setAdapter(adapter);
}
@Override
protected void onPause() {
onDestroy();
Log.i("message", "數據庫連接銷毀");
super.onPause();
}
@Override
protected void onDestroy() {// 關閉數據庫
super.onDestroy();
if (db != null) {
db.close();
}
}
}