昨天简单地做一了一个列表展示,现在将增加/修改/删除方法都给加上了,本次增加的内容比较多,比如常见按钮的事件,列表长按事件,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变量就不贴了,看看效果先,主界面:
添加,点击主界面添加按钮进入添加页面:
编辑,点击列表直接跳转到编辑页面:
删除,长按类别项出现删除操作:
相关推荐
《Android开发进阶:从...总之,《Android开发进阶:从小工到专家》是一部全方位指导Android开发者进阶的宝典,通过阅读和实践,读者将能够掌握高级开发技巧,提升自己的专业能力,从而在Android开发领域更上一层楼。
SQLite 是一个轻量级的、基于 SQL 的关系型数据库管理系统,广泛应用于移动设备开发,如 Android 和 iOS。本文将深入探讨 SQLite,通过一系列步骤帮助读者从基础到精通掌握其使用。 1. **创建数据库** 创建 SQLite...
除了使用基本的输入输出流,Android还提供了其他的文件操作接口,如`File`类用于文件操作,`SharedPreferences`用于存储键值对,SQLite数据库用于结构化数据存储,以及ContentProvider用于跨应用数据共享。...
本节我们将深入探讨SQLite的进阶使用,特别是关于查询方面的技巧。SQLite数据库提供了丰富的SQL语法,允许开发者进行复杂的数据检索、更新和管理。 一、SQLite基本操作 1. 创建数据库:在Android中,我们通常通过...
"进阶Android源码demo"提供了一系列的实践项目,包括游戏和聊天应用,为开发者提供了丰富的学习资源。下面,我们将深入探讨这些知识点,以帮助你更好地理解和应用Android源码。 1. **Android框架理解**:Android...
《Android高手进阶教程》是一本专为对Android开发有一定基础并希望进一步提升技能的开发者设计的教材。这本书深入探讨了Android平台的核心概念和技术,旨在帮助读者从初级开发者跃升为高级工程师。以下是对该教程中...
《Android高级进阶》这本书是为那些已经掌握了Android基础,并希望深入学习和提升技能的开发者准备的。在Android开发的世界中,"进阶"通常意味着更复杂的技术、更高效的编程实践以及更深层次的理解。以下是对这本书...
在“Android进阶知识点一”这个主题中,我们主要探讨的是Android应用开发的高级概念,特别是在使用Android Studio作为开发环境时遇到的各种技术和实践。这个知识判断器可能是一个小型的交互式应用,它根据用户的选择...
Android设备上的文件存储分为内部存储和外部存储。书中会介绍如何在不同存储区域读写文件,如何使用SQLite数据库,以及如何利用文件描述符进行文件操作。免解压密码技术往往涉及文件加密和解密,因此,这部分内容...
《Android高手进阶教程》是一本专为已经具备一定Android基础知识的开发者准备的深度学习资料。这本教程的出现,旨在帮助读者从初级开发者跃升为Android开发的专家,掌握更多的高级技术和实战经验。 首先,Android...
【作品名称】:基于Java 开发的android心脏病的健康管理系统(客户的+服务器端Django+sqlite3) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期...
《Android进阶笔记》是针对Android开发者的一份详尽学习资料,主要涵盖了各种技术框架、博客社区和推荐书籍,旨在帮助开发者深入理解Android系统并提升专业技能。这份资源的开源特性意味着开发者可以自由访问和分享...
《Android高手进阶指南》是一本专为已经具备一定Android基础的开发者准备的深度学习资料。这本书涵盖了Android开发中的高级主题和技术,旨在帮助读者提升在Android领域的专业技能,成为真正的技术专家。 首先,本书...
《Android高级进阶》是一本面向已有基础的Android开发者,旨在提升其技能和理解的教程。这份完整版的PDF教程涵盖了Android开发中的诸多高级主题,是个人学习和提升的宝贵资源。以下将对其中的关键知识点进行详细阐述...
《Android基础到进阶:掌握大厂Offer的关键》 在当今的移动开发领域,Android作为全球最广泛使用的操作系统之一,其开发技术的重要性不言而喻。对于开发者来说,从基础到进阶的学习路径是通往成功的关键。本资料集...
在这个基础教程中,你可能还会学习如何在Android活动中使用SQLite,如何在用户交互事件中触发数据库操作,以及如何在UI上显示查询结果。理解并掌握这些基本概念和方法,将为你在Android应用中实现复杂的数据管理打下...
- SQLite:Android内置的关系型数据库管理系统,适用于大多数应用场景。 - Room Persistence Library:提供了一个抽象层,使得与SQLite数据库的交互更加简单和高效。 4. **多线程编程**: - 理解主线程和工作...
由于提供的文件信息中,标题、描述和标签均相同,且部分内容仅有重复的“霏霏”二字,无法提供具体的Android高级进阶知识点。为了满足您的要求,我将基于Android高级进阶这一主题,提供一些该领域的通用知识点,希望...
资源名称:Android进阶教程,深入了解开发机制 教程内容:1.数据存储分类及SharedPreferences2.使用内部存储3.使用外部存储4.sqlite-15.sqlite-26.sqlite-37.以启动方式使用Service8.以绑定方式使用Service-19.以...