Android本地数据库增删改查 菜单实现
来源:互联网 发布:支付宝淘宝秒下款口子 编辑:程序博客网 时间:2024/06/08 12:23
本内容基于《Beginning Android 4 Application Development》Wei-Meng Lee中文版6.3节(P264) 的 创建和使用数据库修改而成
原文为对表contact的修改,这里我将其改为菜谱的实现
原表为:
_idnameemail 将其修改为:_idnameingredient1泡芙1. 材料:低粉、鸡蛋...2蛋挞1. 材料:精粉、黄油...3双皮奶1. 材料:纯牛奶、白...
使用DB Browser for SQLite 创建该表,SQL语句为:
CREATE TABLE `contacts` ( `_id` INTEGER, `name` TEXT, `ingredient` TEXT, PRIMARY KEY(_id));注:如果您使用多表查询,可以做相应的修改,这里只涉及对一个表的修改,多表操作可能需要参考其他一些内容。
开发软件是直接下载的 adt-bundle-windows-x86_64-20131030,可以直接下载解压使用。
代码结构如下:
manifest清单文件:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.learn2develop.Databases" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".DatabasesActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:label="@string/app_name" android:name=".AddItemActivity" > </activity> </application></manifest>
两个xml文件:
1. main.xml文件(字符串应当写到res目录下的strings.xml文件中,这里没有写,为了以后的全球化,您可以将其写入strings.xml文件中):
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/RelativeLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <AutoCompleteTextView android:id="@+id/autoCompleteTextView1" android:layout_width="253dp" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:ems="10" android:text="输入甜品名称" > <requestFocus /> </AutoCompleteTextView> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/autoCompleteTextView1" android:layout_alignBottom="@+id/autoCompleteTextView1" android:layout_alignParentRight="true" android:text="搜索" /> <EditText android:id="@+id/editText1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_below="@+id/button1" android:ems="10" android:inputType="textMultiLine" /></RelativeLayout>
2. 点击菜单选项“新增”之后,在新的页面中分别在editTxt_Title中填写菜品名(name), 在editTxt_Content填写菜品配方(ingredient)。
<?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" > <EditText android:id="@+id/editTxt_Title" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="text" /> <EditText android:id="@+id/editTxt_Content" android:layout_width="match_parent" android:layout_height="match_parent" android:ems="10" android:inputType="textMultiLine" > <requestFocus /> </EditText></LinearLayout>
三个.java文件
DBAdapter.java
package net.learn2develop.Databases;/** * @author 作者1Wei-Meng Lee * @version 创建时间:不详 * * @author 作者2:宋倩楠 & blog.csdn.net/haimian520 * @version 创建时间:2015年11月18日 * */ import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;public class DBAdapter { static final String KEY_ROWID = "_id"; static final String KEY_NAME = "name"; static final String KEY_INGREDIENT = "ingredient"; static final String TAG = "DBAdapter"; static final String DATABASE_NAME = "MyDB"; static final String DATABASE_TABLE = "contacts"; static final int DATABASE_VERSION = 2; static final String DATABASE_CREATE = "create table contacts (_id integer primary key autoincrement, " + "name text not null, ingredient text not null);"; final Context context; DatabaseHelper DBHelper; SQLiteDatabase db; public DBAdapter(Context ctx) { this.context = ctx; DBHelper = new DatabaseHelper(context); } private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { try { db.execSQL(DATABASE_CREATE); } catch (SQLException e) { e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS contacts"); onCreate(db); } } //---opens the database--- public DBAdapter open() throws SQLException { db = DBHelper.getWritableDatabase(); return this; } //---closes the database--- public void close() { DBHelper.close(); } //---insert a contact into the database--- public long insertContact(String name, String ingredient) { ContentValues initialValues = new ContentValues(); initialValues.put(KEY_NAME, name); initialValues.put(KEY_INGREDIENT, ingredient); return db.insert(DATABASE_TABLE, null, initialValues); } //---deletes a particular contact--- public boolean deleteContact(long rowId) { return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; } //---deletes a particular contact--- public boolean deleteContact(String str) { return db.delete(DATABASE_TABLE, KEY_NAME +"='" + str+"'", null) > 0; } //---retrieves all the contacts--- public Cursor getAllContacts() { return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, KEY_INGREDIENT}, null, null, null, null, null); } //---retrieves a particular contact--- public Cursor getContact(long rowId) throws SQLException { Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, KEY_INGREDIENT}, KEY_ROWID + "=" + rowId, null, null, null, null, null); if (mCursor != null) { mCursor.moveToFirst(); } return mCursor; } //---updates a contact--- public boolean updateContact(long rowId, String name, String ingredient) { ContentValues args = new ContentValues(); args.put(KEY_NAME, name); args.put(KEY_INGREDIENT, ingredient);// return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; return db.update(DATABASE_TABLE, args, KEY_NAME + "='" + name+"'", null) > 0; } public Cursor getContact(String string)throws SQLException {// select * from contacts where name="蛋挞"// TODO Auto-generated method stub Cursor mCursor = db.query(true, DATABASE_TABLE, null, KEY_NAME + "='" + string+"'", null, null, null, null, null); if (mCursor != null) { mCursor.moveToFirst(); }return mCursor;}public Cursor getFoodName() throws SQLException{return db.query(DATABASE_TABLE, new String[] {KEY_NAME}, null, null, null, null, null);}// 通过特定名字,找到该行IDpublic Cursor getRowID(String name) throws SQLException{return db.query(DATABASE_TABLE, new String[] {KEY_NAME}, null, null, null, null, null);}}
DatabasesActivity.java
package net.learn2develop.Databases;/** * @author 作者1Wei-Meng Lee * @version 创建时间:不详 * * @author 作者2:宋倩楠 & blog.csdn.net/haimian520 * @version 创建时间:2015年11月18日 * */ import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.lang.reflect.Method;import java.util.ArrayList;import android.app.Activity;import android.app.AlertDialog;import android.app.AlertDialog.Builder;import android.content.DialogInterface;import android.content.Intent;import android.database.Cursor;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAdapter;import android.widget.AutoCompleteTextView;import android.widget.Button;import android.widget.DialerFilter;import android.widget.EditText;import android.widget.Toast; public class DatabasesActivity extends Activity implements OnClickListener,OnItemClickListener{ /** Called when the activity is first created. */Button btn1, btn2, btn3;AutoCompleteTextView autoCTV;EditText editTxt;static String[] autoString ;ArrayAdapter<String> arrAdapter;static ArrayList<String> list;private static final int ITEM1 = Menu.FIRST;private static final int ITEM2 = Menu.FIRST+1;private static final int ITEM3 = Menu.FIRST+2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn1 = (Button) findViewById(R.id.button1);//btn2 = (Button) findViewById(R.id.button2);//btn3 = (Button) findViewById(R.id.button3);//btn1.setOnClickListener(this);//btn2.setOnClickListener(this);//btn3.setOnClickListener(this);// autoCTV = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1); editTxt = (EditText)findViewById(R.id.editText1); DBAdapter db = new DBAdapter(this); /* //---add a contact--- db.open(); long id = db.insertContact("Wei-Meng Lee", "weimenglee@learn2develop.net"); id = db.insertContact("Mary Jackson", "mary@jackson.com"); db.close(); */ /* //--get all contacts--- db.open(); Cursor c = db.getAllContacts(); if (c.moveToFirst()) { do { DisplayContact(c); } while (c.moveToNext()); } db.close(); */ /* //---get a contact--- db.open(); Cursor c = db.getContact(2); if (c.moveToFirst()) DisplayContact(c); else Toast.makeText(this, "No contact found", Toast.LENGTH_LONG).show(); db.close(); */ /* //---update contact--- db.open(); if (db.updateContact(1, "Wei-Meng Lee", "weimenglee@gmail.com")) Toast.makeText(this, "Update successful.", Toast.LENGTH_LONG).show(); else Toast.makeText(this, "Update failed.", Toast.LENGTH_LONG).show(); db.close(); */ /* //---delete a contact--- db.open(); if (db.deleteContact(1)) Toast.makeText(this, "Delete successful.", Toast.LENGTH_LONG).show(); else Toast.makeText(this, "Delete failed.", Toast.LENGTH_LONG).show(); db.close(); */ try { String destPath = "/data/data/" + getPackageName() + "/databases"; File f = new File(destPath); if (!f.exists()) { f.mkdirs(); f.createNewFile(); //---copy the db from the assets folder into // the databases folder--- CopyDB(getBaseContext().getAssets().open("mydb"), new FileOutputStream(destPath + "/MyDB")); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //---get all contacts--- db.open(); // Cursor c = db.getAllContacts();// if (c.moveToFirst())// {// do {// // DisplayContact(c);// } while (c.moveToNext());// } list = new ArrayList<String>(); Cursor c = db.getFoodName(); if(c.moveToFirst()){ do{ //DisplayFoodName(c); BindFoodName(c); }while(c.moveToNext()); } db.close(); // Init autoString InitAutoString(); arrAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line ,autoString); autoCTV.setAdapter(arrAdapter);// autoCTV.setOnItemClickListener(new OnItemClickListener() {////@Override//public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,//long arg3) {//// TODO Auto-generated method stub////}// // }); } private void InitAutoString() {// TODO Auto-generated method stubautoString = new String[list.size()]; for(int i=0; i< list.size();++i){ autoString[i] = list.get(i); }}private void BindFoodName(Cursor c) {// TODO Auto-generated method stublist.add(c.getString(0));}// private void DisplayFoodName(Cursor c) {//// TODO Auto-generated method stub//// Toast.makeText(this,//// "Name: " + c.getString(0) + "\n",//// Toast.LENGTH_LONG).show();// list.add(c.getString(0));//}public void CopyDB(InputStream inputStream, OutputStream outputStream) throws IOException { //---copy 1K bytes at a time--- byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } inputStream.close(); outputStream.close(); } public void DisplayContact(Cursor c) { Toast.makeText(this, "id: " + c.getString(0) + "\n" + "Name: " + c.getString(1) + "\n" + "ingredient: " + c.getString(2), Toast.LENGTH_LONG).show(); }@Overridepublic void onClick(View v) {switch(v.getId()){//case R.id.button1://DBAdapter db = new DBAdapter(this);//db.open();////Cursor c = db.getAllContacts();//if(c.moveToFirst()){//do{// DisplayContact(c);//}while(c.moveToNext());//}//db.close();//break;////case R.id.button2://DBAdapter db1 = new DBAdapter(this);//db1.open();////Cursor c1 = db1.getContact(1); // 查找返回//// 假设返回多项(0,1,2...),使用c.moveToFirst()来获得第一项,如果没有获得任何数据//// 的使用c.moveToFirst()则为假//if(c1.moveToFirst()){//DisplayContact(c1);//}else{//Toast.makeText(this, "No item found", Toast.LENGTH_SHORT).show();//}//db1.close();////break;//case R.id.button1:String str = autoCTV.getEditableText().toString();DBAdapter db2 = new DBAdapter(this);db2.open();Cursor c2 = db2.getContact(str); // 查找返回// 假设返回多项(0,1,2...),使用c.moveToFirst()来获得第一项,如果没有获得任何数据// 的使用c.moveToFirst()则为假if(c2.moveToFirst()){//DisplayContact(c2);ShowInEditText(c2);}else{Toast.makeText(this, "No item found", Toast.LENGTH_SHORT).show();}db2.close();break;}// TODO Auto-generated method stub}private void ShowInEditText(Cursor c) {// TODO Auto-generated method stub String str = c.getString(1) + "\n" + c.getString(2)+"\n"; editTxt.setText(str);}@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {// TODO Auto-generated method stub}@Overridepublic boolean onCreateOptionsMenu(Menu menu){//运行时,参数Menu其实就是MenuBuilder对象Log.d("MainActivity", "menu--->" + menu);/*利用反射机制调用MenuBuilder的setOptionalIconsVisible方法设置mOptionalIconsVisible为true, * 给菜单设置图标时才可见 */setIconEnable(menu, true); menu.add(0, ITEM1, 0, R.string.AddItem);//item1.setIcon(R.drawable.camera);// menu.add(0, ITEM2, 0, R.string.DeleteItem);//item2.setIcon(R.drawable.dial); menu.add(0, ITEM3, 0, R.string.SaveItem);//item3.setIcon(R.drawable.sms);return super.onCreateOptionsMenu(menu);}@Overridepublic boolean onPrepareOptionsMenu(Menu menu) {// TODO Auto-generated method stubreturn super.onPrepareOptionsMenu(menu);} //enable为true时,菜单添加图标有效,enable为false时无效。4.0系统默认无效 private void setIconEnable(Menu menu, boolean enable) { try {Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);m.setAccessible(true);//MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)m.invoke(menu, enable); } catch (Exception e) {e.printStackTrace();} } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ //item.getTitle() 1.7+ version // http://bgwan.blog.163.com/blog/static/23930101620153113355297/ // http://blog.csdn.net/worker90/article/details/6786592 case ITEM1: Toast.makeText(this,"新增一项", Toast.LENGTH_LONG).show(); Intent intent = new Intent(this,AddItemActivity.class); startActivity(intent); break; case ITEM2: // Toast.makeText(this,"删除当前打开项", Toast.LENGTH_LONG).show();// AlertDialog.Builder builder = new Builder(this); String tempStr = autoCTV.getEditableText().toString(); DBAdapter dba = new DBAdapter(this); dba.open(); if(dba.deleteContact(tempStr)){ Toast.makeText(this, "Delete"+tempStr+"Succeed", Toast.LENGTH_LONG).show(); }else{ Toast.makeText(this, "Delete"+tempStr+"failed", Toast.LENGTH_LONG).show(); } dba.close();// // builder.setMessage("确定删除菜单项"+tempStr+"吗?");// builder.setTitle("提示");// builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {////@Override//public void onClick(DialogInterface arg0, int arg1) {//// TODO Auto-generated method stub//// // //}//// //}); break; case ITEM3: Toast.makeText(this,"保存修改", Toast.LENGTH_LONG).show(); String name = autoCTV.getEditableText().toString(); String ingredient = editTxt.getText().toString(); DBAdapter dbAdapter = new DBAdapter(this); dbAdapter.open(); // 获取改名的 rowID Cursor cursor = dbAdapter.getContact(name); cursor.moveToFirst(); int Row_ID =Integer.parseInt(cursor.getString(0)); if(dbAdapter.updateContact(Row_ID, name, ingredient)){ Toast.makeText(this, "Update Succeed!", Toast.LENGTH_LONG).show(); }else{ Toast.makeText(this, "Update Failed!", Toast.LENGTH_LONG).show(); } break; } return super.onOptionsItemSelected(item); } }
AddItemActivity.java
package net.learn2develop.Databases;/** * @author 作者1:宋倩楠 & blog.csdn.net/haimian520 * @version 创建时间:2015年11月18日 * */ import android.app.Activity;import android.database.Cursor;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.EditText;import android.widget.Toast;public class AddItemActivity extends Activity{private static final int SaveItem = Menu.FIRST;private static final int CancelItem = Menu.FIRST+1;EditText edit_Name;EditText edit_Ingredient;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.addnewitem);edit_Name = (EditText)findViewById(R.id.editTxt_Title);edit_Ingredient = (EditText)findViewById(R.id.editTxt_Content);}public boolean onCreateOptionsMenu(Menu menu) {menu.add(0, SaveItem, 0, "保存");menu.add(0, CancelItem, 0, "舍弃");return true;}public boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case SaveItem://setTitle("单击了菜单子项1");String name = "";name = edit_Name.getText().toString();String ingredient = edit_Ingredient.getText().toString();if(name.isEmpty()||ingredient.isEmpty()){Toast.makeText(this, "请输入 名称 和 做法", Toast.LENGTH_LONG).show();}else{DBAdapter db = new DBAdapter(this);db.open();Cursor c = db.getContact(name);if(!c.moveToFirst()){db.insertContact(name, ingredient);db.close();}else{Toast.makeText(this, "同名菜已经存在,请尝试使用其他名称", Toast.LENGTH_LONG).show();}}break;case CancelItem://setTitle("单击了菜单子项2");Toast.makeText(this, "直接按返回键就可以了", Toast.LENGTH_LONG).show();break;}return true;}}
上述的代码中还有一些不完善,比如:
在新增菜品名之后,AutoCompleteTextView中并不能予以及时的显示,而是在重启app之后,才能显示,这里只需要在新增项目之后并点击保存之后(B Activity),重新运行父Activity(A Activity)。需要处理一些特别情况,如进入B之前,将A已经关闭,而点的是返回键,那么需要重写返回按键事件。这样就可以将菜品名称不能予以显示的缺点给弥补了。
这是一个完整的Android本地(离线)数据库的增删改查操作,基于Wei-Meng Lee的代码修改而成,原先数据库被修改,以适应当前项目──菜单。本代码由本人和可视化研究所成员宋倩楠共同完成,是Android课程的一个小作业。为了您和他人着想请不要将代码复制粘贴,只供参考。在这里我给源代码压缩包下载设置了分数,当然这不是我的目的,这样做只是杜绝一部分。。。,当然本文中的所有代码和压缩包中的代码完全相同。完整项目代码压缩包下载地址 http://download.csdn.net/detail/haimian520/9285205
1 0
- Android本地数据库增删改查 菜单实现
- Android数据库SqLite实现增删改查
- android,数据库增删改查
- android数据库:增删改查
- Android 数据库 增删改查
- Android数据库增删改查
- Android中内容提供者ContentProvider实现数据库增删改查
- Android SQL语句实现数据库的增删改查
- Android中内容提供者ContentProvider实现数据库增删改查
- 【Android】SQLite 创建数据库,并实现增删改查
- android简单的实现数据库增删改查
- VS2013实现数据库的增删改查
- JDBC 实现 数据库的增删改查
- JDBC实现数据库增删改查
- 数据库存储通讯录,实现“增删改查”
- JDBC实现数据库的增删改查
- iOS FMDB数据库实现增删改查
- android-数据库的增删改查
- Struts1、Struts2和SpringMVC剖析
- android 百度地图
- SSH:Struts2框架(简介)
- 11.20
- Tips for QRcode ( SAP中二维码相关)
- Android本地数据库增删改查 菜单实现
- TestNG - @Parameters 传递外部参数 对比 @Dataprovider
- 网上销售平台--jersey实现应用服务器和图片服务器分离(六)
- NSCache的简单使用
- Apache+Tomcat负载均衡两种session共享方式的设置
- 异步载入资源
- pid及socket文件丢失,数据库无法启动问题
- xcode7.1生成打包上传时需要注意的东西
- 跨线程调用问题