昨天簡單地做一了一個列表展示,現在將增加/修改/刪除方法都給加上了,本次增加的內容比較多,比如常見按鈕的事件,列表長按事件,Activity之間的跳轉及傳遞參數,按鍵事件的監聽等,希望對初學的朋友有些幫助,同時歡迎老鳥給我做Code review,需要改進的地方,還請指出,謝謝。
下面逐個介紹一個代碼,數據庫輔助類:DBOpenHelper
package com.van.sqlite.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* 數據庫輔助類。
* @author Van
*
*/
public class DBOpenHelper extends SQLiteOpenHelper{
/**數據庫名稱*/
private static final String DATABASE_NAME="MyAppDB";
/**數據庫版本*/
private static final int DATABASE_VERSION=1;
/** 創建數據表語句*/
private static final String DDL_CREATE_TABLE_APPINFO="CREATE TABLE IF NOT EXISTS AppInfo (appId integer primary key autoincrement,appName text,appDescription text, remark text)";
/**
* 實例化數據庫連接.
* @param context
*/
public DBOpenHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
/**初始化數據表*/
this.getWritableDatabase().execSQL(DDL_CREATE_TABLE_APPINFO);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
針對AppInfo數據表的輔助類,內含增刪查改方法:AppInfoHelper
package com.van.sqlite.db;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class AppInfoHelper {
private DBOpenHelper helper;
/**
* 構造
* @param context
*/
public AppInfoHelper(Context context){
this.helper=new DBOpenHelper(context);
}
/**
* 查詢
* @param tableName
* @return
*/
public Cursor select(String sql) {
SQLiteDatabase db=helper.getWritableDatabase();
try{
Cursor cursor=db.rawQuery(sql,null);
cursor.moveToFirst();
return cursor;
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(db.isOpen()){
db.close();
}
}
return null;
}
/**
* 新增方法.
* @param appName
* @param appDescription
* @param remark
*/
public void addAppInfo(String appName,String appDescription,String remark){
ContentValues values=new ContentValues();
values.put("appName", appName);
values.put("appDescription", appDescription);
values.put("remark", remark);
SQLiteDatabase db=helper.getWritableDatabase();
try{
db.insert("AppInfo", null, values);
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(db.isOpen()){
db.close();
}
}
}
/**
* 編輯應用信息.
* @param appId
* @param appName
* @param appDescription
* @param remark
*/
public void editAppInfo(int appId,String appName,String appDescription,String remark){
ContentValues values=new ContentValues();
values.put("appName", appName);
values.put("appDescription", appDescription);
values.put("remark", remark);
SQLiteDatabase db=helper.getWritableDatabase();
//條件
String[] whereValue ={ Integer.toString(appId) };
try{
db.update("AppInfo", values, "appId=?", whereValue);
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(db.isOpen()){
db.close();
}
}
}
/**
* 刪除應用信息.
* @param appId
*/
public void deleteAppInfo(int appId){
SQLiteDatabase db=helper.getWritableDatabase();
//條件
String[] whereValue ={ Integer.toString(appId) };
try{
db.delete("AppInfo", "appId=?", whereValue);
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(db.isOpen()){
db.close();
}
}
}
}
AppInfo數據適配器,用於列表顯示的適配器:AppInfoListAdapter
package com.van.sqlite.adapter;
import java.util.ArrayList;
import java.util.HashMap;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.widget.SimpleAdapter;
import com.van.sqlite.activity.R;
import com.van.sqlite.db.DBOpenHelper;
public class AppInfoListAdapter {
private Context context;
public AppInfoListAdapter(Context context){
this.context=context;
}
/**
* 查詢AppInfo返回Map集合
* @return
*/
private ArrayList<HashMap<String, Object>> fillList(){
//生成動態數組,並且轉載數據
ArrayList<HashMap<String, Object>> dataList = new ArrayList<HashMap<String, Object>>();
DBOpenHelper helper=new DBOpenHelper(context);
SQLiteDatabase db=helper.getReadableDatabase();
try{
Cursor cursor=db.rawQuery("SELECT * FROM AppInfo", null);
cursor.moveToFirst();
if(cursor.moveToFirst()) {
while (!cursor.isAfterLast()) {
Integer appId = cursor.getInt(cursor.getColumnIndex("appId"));
String appName = cursor.getString(cursor.getColumnIndex("appName"));
String appDescription = cursor.getString(cursor.getColumnIndex("appDescription"));
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("appId",appId);
map.put("appName", appName);
map.put("appDescription", appDescription);
dataList.add(map);
cursor.moveToNext();
}
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(db.isOpen()){
db.close();
}
}
return dataList;
}
/**
* 填充數據,取得數據適配器.
* @param listData
* @return
*/
public SimpleAdapter getAdapter(Context context){
//生成適配器,數組===》ListItem
SimpleAdapter adapter = new SimpleAdapter(context,
fillList(),//數據來源
R.layout.list_item,//ListItem的XML實現
//動態數組與ListItem對應的子項
new String[] {"appName", "appDescription"},
//ListItem的XML文件裏面的兩個TextView ID
new int[] {R.id.textView_appName,R.id.textView_appDescription});
return adapter;
}
}
3個Activity,主界面顯示/增加/修改
SQLiteDemoActivity
package com.van.sqlite.activity;
import java.util.HashMap;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import com.van.sqlite.adapter.AppInfoListAdapter;
import com.van.sqlite.db.AppInfoHelper;
public class SQLiteDemoActivity extends Activity {
private ListView listView;
private AppInfoListAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView=(ListView)findViewById(R.id.listView_appList);
//獲取數據適配器
adapter=new AppInfoListAdapter(this);
//添加並且顯示
listView.setAdapter(adapter.getAdapter(this));
//跳轉到新增窗口
Button addButton=(Button)findViewById(R.id.button_to_add);
addButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
//打開新的窗口
Intent intent=new Intent();
intent.setClass(SQLiteDemoActivity.this, AddAppInfoActivity.class);
startActivity(intent);
//結束當前
SQLiteDemoActivity.this.finish();
}
});
//數據列表點擊操作
listView.setOnItemClickListener(new OnItemClickListener() {
@SuppressWarnings("unchecked")
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int index,long arg3) {
ListView listView = (ListView)adapterView;
HashMap<String, Object> map = (HashMap<String, Object>) listView.getItemAtPosition(index);
//打開新的窗口
Intent intent=new Intent();
intent.setClass(SQLiteDemoActivity.this, EditAppInfoActivity.class);
//將appId傳入編輯窗口
intent.putExtra("appId", Integer.parseInt(map.get("appId").toString()));
startActivity(intent);
//結束當前
SQLiteDemoActivity.this.finish();
}
});
//添加長按點擊
listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
menu.setHeaderTitle("列表操作");
menu.add(0, 0, 0, "刪除應用信息");
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){//返回按鈕
AlertDialog.Builder builder = new Builder(SQLiteDemoActivity.this);
builder.setMessage("確實要退出程序嗎?");
builder.setTitle("提示");
builder.setPositiveButton("確認",
new android.content.DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
SQLiteDemoActivity.this.finish();
}
});
builder.setNegativeButton("取消",
new android.content.DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
return true;
}
return false;
}
/**
* 刪除應用.
* @param appId
*/
public void delete(int appId){
AppInfoHelper appInfoHelper=new AppInfoHelper(this);
appInfoHelper.deleteAppInfo(appId);
Toast.makeText(SQLiteDemoActivity.this, "應用刪除成功!", Toast.LENGTH_SHORT).show();
//添加並且顯示
listView.setAdapter(adapter.getAdapter(this));
}
//長按菜單響應函數
@SuppressWarnings("unchecked")
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo m = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
HashMap<String, Object> map = (HashMap<String, Object>) listView.getItemAtPosition(m.position);
int appId=Integer.parseInt(map.get("appId").toString());
//調用方法,刪除
delete(appId);
return super.onContextItemSelected(item);
}
}
AddAppInfoActivity
package com.van.sqlite.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.van.sqlite.db.AppInfoHelper;
public class AddAppInfoActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add);
Button saveButton=(Button)findViewById(R.id.button_save);
saveButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
add();//添加數據
}
});
}
/**
* 添加數據方法.
*/
public void add(){
EditText et_appName=(EditText)findViewById(R.id.editText_appName);
EditText et_appDescription=(EditText)findViewById(R.id.editText_appDescription);
EditText et_remark=(EditText)findViewById(R.id.editText_remark);
String appName=et_appName.getText().toString();
String appDescription=et_appDescription.getText().toString();
String remark=et_remark.getText().toString();
AppInfoHelper appInfoHelper=new AppInfoHelper(this);
appInfoHelper.addAppInfo(appName, appDescription, remark);
Toast.makeText(AddAppInfoActivity.this, "應用信息添加成功!", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(AddAppInfoActivity.this,SQLiteDemoActivity.class);
startActivity(intent);
AddAppInfoActivity.this.finish();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){//返回按鈕
Intent intent = new Intent();
intent.setClass(AddAppInfoActivity.this, SQLiteDemoActivity.class);
startActivity(intent);// 啓動新的Activity
AddAppInfoActivity.this.finish();// 結束就的Activity
}
return false;
}
}
EditAppInfoActivity
package com.van.sqlite.activity;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.van.sqlite.db.AppInfoHelper;
public class EditAppInfoActivity extends Activity{
private int paramAppId;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit);
//綁定數據
bindValue();
//綁定事件
Button editButton=(Button)findViewById(R.id.button_edit_save);
editButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
edit();
}
});
}
/**
* 查詢賦值.
*/
public void bindValue(){
//取得編號
paramAppId= this.getIntent().getExtras().getInt("appId");
//查詢數據
AppInfoHelper appInfoHelper=new AppInfoHelper(this);
Cursor cursor=appInfoHelper.select("SELECT * FROM AppInfo WHERE appId="+paramAppId);
if(cursor.moveToFirst()) {
String appName = cursor.getString(cursor.getColumnIndex("appName"));
String appDescription = cursor.getString(cursor.getColumnIndex("appDescription"));
String remark = cursor.getString(cursor.getColumnIndex("remark"));
EditText et_appName=(EditText)findViewById(R.id.editText_edit_appName);
EditText et_appDescription=(EditText)findViewById(R.id.editText_edit_appDescription);
EditText et_remark=(EditText)findViewById(R.id.editText_edit_remark);
et_appName.setText(appName);
et_appDescription.setText(appDescription);
et_remark.setText(remark);
}
}
/**
* 編輯應用。
*/
private void edit(){
EditText et_appName=(EditText)findViewById(R.id.editText_edit_appName);
EditText et_appDescription=(EditText)findViewById(R.id.editText_edit_appDescription);
EditText et_remark=(EditText)findViewById(R.id.editText_edit_remark);
String appName=et_appName.getText().toString();
String appDescription=et_appDescription.getText().toString();
String remark=et_remark.getText().toString();
AppInfoHelper appInfoHelper=new AppInfoHelper(this);
appInfoHelper.editAppInfo(paramAppId, appName, appDescription, remark);
Toast.makeText(EditAppInfoActivity.this, "應用信息編輯成功!", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(EditAppInfoActivity.this,SQLiteDemoActivity.class);
startActivity(intent);
EditAppInfoActivity.this.finish();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){//返回按鈕
Intent intent = new Intent();
intent.setClass(EditAppInfoActivity.this, SQLiteDemoActivity.class);
startActivity(intent);// 啓動新的Activity
EditAppInfoActivity.this.finish();// 結束就的Activity
}
return false;
}
}
幾個佈局文件:
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/button_to_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/add" />
<ListView
android:id="@+id/listView_appList"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</LinearLayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView_appName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/textView_appDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
add.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textView_appName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/appName"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/editText_appName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPostalAddress" />
<TextView
android:id="@+id/textView_appDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/appDescription"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/editText_appDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="text" />
<TextView
android:id="@+id/textView_remark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/remark"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/editText_remark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="text"/>
<Button
android:id="@+id/button_save"
android:layout_width="100dp"
android:layout_marginTop="15dp"
android:layout_height="wrap_content"
android:text="@string/save" />
</TableLayout>
edit.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textView_edit_appName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/appName"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/editText_edit_appName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPostalAddress" />
<TextView
android:id="@+id/textView_edit_appDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/appDescription"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/editText_edit_appDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="text" />
<TextView
android:id="@+id/textView_edit_remark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/remark"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/editText_edit_remark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="text"/>
<Button
android:id="@+id/button_edit_save"
android:layout_width="100dp"
android:layout_marginTop="15dp"
android:layout_height="wrap_content"
android:text="@string/edit" />
</TableLayout>
神馬String變量就不貼了,看看效果先,主界面:
添加,點擊主界面添加按鈕進入添加頁面:
編輯,點擊列表直接跳轉到編輯頁面:
刪除,長按類別項出現刪除操作: