密码盒 基本功能都实现了 下来分享源码 适合刚接触sqlite数据库的亲们使用
做这个之初是因为女朋友老是忘了自己的很多账号,所以就萌生了一个给他做一个android应用的想法,用了5天吧 ,实现了基本功能,账号添加 删除 修改 都是基于sqlite数据库的。程序很一般,拿出来和大家分享下。牛人就不用看了,新手还是值得学习的!
总共有四个activity:下面这个是显示账号列表的
package com.example.passwordbox; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import database.DBAdapter; import database.goods; import ImageAdapter.listAdapter; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.app.ListActivity; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnCreateContextMenuListener; import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class AccountlistActivity extends Activity implements OnItemClickListener ,OnMenuItemClickListener{ Button btn1=null; Button btn2=null; private ListView listview; DBAdapter db=null; @SuppressWarnings("rawtypes") List list=null; goods good = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.accountlist); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar); //titlebar为自己标题栏的布局 listview=(ListView)findViewById(R.id.list); db = new DBAdapter(this); db.open(); btn1=(Button)findViewById(R.id.buttonn); btn1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { Intent intent1=new Intent(); intent1.setClass(AccountlistActivity.this, NewActivity.class); startActivity(intent1); AccountlistActivity.this.finish(); } }); btn2=(Button)findViewById(R.id.buttonm); btn2.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { Intent intent2=new Intent(); intent2.setClass(AccountlistActivity.this, NewActivity.class); startActivity(intent2); AccountlistActivity.this.finish(); } }); listview.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){ @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // TODO Auto-generated method stub menu.setHeaderTitle("请选择操作"); menu.add(0, 0, 0, "删除"); menu.add(0, 1, 0, "修改"); } }); show(); } //长按菜单响应函数 @Override public boolean onContextItemSelected(MenuItem item) { //setTitle("点击了长按菜单里面的第"+item.getItemId()+"个项目"); final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item .getMenuInfo(); int id = (int)info.id;//这里的info.id对应的是item对应的值 if(item.getItemId()==0) { //根据id删除 db.open(); //int id = (int)info.id;//这里的info.id对应的是item对应的值 showall(); int m=((goods)list.get(id)).getId(); Log.i("删除ID值", ""+id); // moveToPosition(id) // db.deleteTitle(id); db.deleteTitle(m); db.close(); Toast.makeText(getApplicationContext(), "删除成功", Toast.LENGTH_SHORT).show(); show(); } else { //根据id LayoutInflater factory = LayoutInflater.from(this); final View textEntryView = factory.inflate(R.layout.reserve, null); final EditText editTextName = (EditText) textEntryView.findViewById(R.id.editTextName); final EditText editTextNumEditText = (EditText)textEntryView.findViewById(R.id.editTextNum); final EditText editTextaccEditText = (EditText)textEntryView.findViewById(R.id.edit); AlertDialog.Builder ad1 = new AlertDialog.Builder(AccountlistActivity.this); ad1.setTitle("修改账户及密码:"); ad1.setIcon(android.R.drawable.ic_dialog_info); ad1.setView(textEntryView); db.open(); // int id = (int)info.id;//这里的info.id对应的就是item的行号 showall(); editTextaccEditText.setText(((goods)list.get(id)).getName()); editTextName.setText(((goods)list.get(id)).getAccount()); editTextNumEditText.setText(((goods)list.get(id)).getPass()); Log.i("修改账号", ""+((goods)list.get(id)).getAccount()); ad1.setPositiveButton("是", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int i) { Log.i("111111", editTextName.getText().toString()); int id = (int)info.id; String name=editTextaccEditText.getText().toString(); String account=editTextName.getText().toString(); String pass=editTextNumEditText.getText().toString(); Log.i("修改ID值", ""+id); int m=((goods)list.get(id)).getId(); //Log.i("删除ID值", ""+id); db.updateTitle(m, name,account, pass); db.close(); show(); Toast.makeText(getApplicationContext(), "修改成功", Toast.LENGTH_SHORT).show(); } }); ad1.setNegativeButton("否", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int i) { } }); ad1.show();// 显示对话框 } return super.onContextItemSelected(item); } // protected void showAddDialog() { // // // // } @SuppressWarnings({ "unchecked", "rawtypes" }) public void show() { db.open(); showall(); Log.i("查询结果", "内容"+list.toString()); listAdapter adapter = new listAdapter(this.getApplicationContext(), list); db.close(); listview.setAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.accountlist, menu); return true; } @Override //id被点击元素的行id //视图在adapter中的位置 //在AdapterView中被点击的视图(它是由adapter提供的一个视图) public void onItemClick(AdapterView<?> AdapterViewparent, View view, int position, long id) { // TODO Auto-generated method stub if(id<-1) { // 点击的是headerView或者footerView return; } int realPosition=(int)id; // T item=getItem(realPosition); // 响应代码 } public List showall() { list=new ArrayList(); Cursor cur=db.getAllTitles(); if(cur==null) { Log.i("查询结果", "weikong"); } for(cur.moveToFirst();!cur.isAfterLast();cur.moveToNext()) { good=new goods();//必须每次new一个对象 才能使得list add()不断添加 int idColumn=cur.getColumnIndex("_id"); int nameColumn = cur.getColumnIndex("name"); int accColumn = cur.getColumnIndex("account"); int phoneColumn = cur.getColumnIndex("pass"); String name = cur.getString(nameColumn); String pass = cur.getString(phoneColumn); String account=cur.getString(accColumn); String id=cur.getString(idColumn); good.setId((int)Integer.parseInt(id)); good.setName(name); good.setAccount(account); good.setPass(pass); Log.i("查询结果", "weikong"+good.getName()); list.add(good); } return list; } @Override public boolean onMenuItemClick(MenuItem arg0) { // TODO Auto-generated method stub return false; } }
下面这个是程序启动页面:
package com.example.passwordbox; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.Window; import android.view.WindowManager; public class RunActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.run); new Handler().postDelayed(new Runnable(){ public void run() { RedirectNewActivity(); } }, 2000); } public void RedirectNewActivity() { Intent intent=new Intent(); intent.setClass(RunActivity.this, NewActivity.class); startActivity(intent); RunActivity.this.finish(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.run, menu); return true; } }
下面这个是进去程序后的主页面:
package com.example.passwordbox; import ImageAdapter.imageAdapter; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.GridView; import android.widget.ImageButton; public class NewActivity extends Activity implements OnItemClickListener, OnClickListener{ private Resources resMgr = null; Button bt1=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.news); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar); //titlebar为自己标题栏的布局 resMgr=getResources(); bt1=(Button)findViewById(R.id.buttonn); bt1.setOnClickListener(this); GridView gridView = (GridView) findViewById(R.id.gridView1); String strContent[] = { resMgr.getString(R.string.add), resMgr.getString(R.string.show), }; gridView.setAdapter(new imageAdapter(this, strContent)); gridView.setOnItemClickListener(this); } private void close() { new AlertDialog.Builder(this) // .setIcon(R.drawable.services) .setTitle(R.string.MAINACTIVITY_POPUP_QUIT_TITLE) .setMessage(R.string.MAINACTIVITY_POPUP_QUIT_MESSAGE) .setNegativeButton(R.string.MAINACTIVITY_POPUP_QUIT_CANCEL, new DialogInterface.OnClickListener() { // @Override public void onClick(DialogInterface dialog, int which) { } }) .setPositiveButton(R.string.MAINACTIVITY_POPUP_QUIT_OK, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { finish(); //System.exit(0); } }).show(); } /* * (non-Javadoc) * * @see android.app.Activity#dispatchKeyEvent(android.view.KeyEvent) */ @Override public boolean dispatchKeyEvent(KeyEvent event) { // TODO Auto-generated method stub if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { close();// 这是自定义的代码 } return true; } return super.dispatchKeyEvent(event); } @Override public boolean onCreateOptionsMenu(Menu menu){ super.onCreateOptionsMenu(menu); menu.add(0,0,0,"设置");//第二个参数是menu的id,第4个参数是菜单显示的内容,其余的不重要。 menu.add(0,1,0,"关于"); menu.add(0,2,0,"退出"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item){ super.onOptionsItemSelected(item); switch(item.getItemId()) { case 0: break; case 1: new AlertDialog.Builder(this) .setTitle("关于") .setMessage("本软件为爱心制作") .setPositiveButton("确定", null) .show(); break; case 2: this.finish(); break; } return true; } @Override public void onItemClick(AdapterView<?> parent, View v, int position, long arg3) { // TODO Auto-generated method stub switch(position){ case 0: { Intent intent1=new Intent(); intent1.setClass(NewActivity.this, AddaccountActivity.class); startActivity(intent1); NewActivity.this.finish(); break; } case 1: { Intent intent2=new Intent(); intent2.setClass(NewActivity.this, AccountlistActivity.class); startActivity(intent2); NewActivity.this.finish(); break; } } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (keyCode == KeyEvent.KEYCODE_BACK) { close(); return true; } else { return super.onKeyDown(keyCode, event); } } @Override public void onClick(View v) { // TODO Auto-generated method stub close(); } }
下面这个是添加账号信息的activity:
package com.example.passwordbox; import database.DBAdapter; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class AddaccountActivity extends Activity { private Button btt1=null; private Button btt2=null; private Button btt3=null; EditText tx1=null; EditText tx2=null; EditText tx3=null; DBAdapter db=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.addaccount); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar); //titlebar为自己标题栏的布局 db = new DBAdapter(this); tx1=(EditText)findViewById(R.id.editText1); tx2=(EditText)findViewById(R.id.editText2); tx3=(EditText)findViewById(R.id.editTextacc); btt1=(Button)findViewById(R.id.buttonn); btt1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { Intent intent1=new Intent(); intent1.setClass(AddaccountActivity.this, NewActivity.class); startActivity(intent1); AddaccountActivity.this.finish(); } }); btt2=(Button)findViewById(R.id.buttonm); btt2.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { Intent intent2=new Intent(); intent2.setClass(AddaccountActivity.this, NewActivity.class); startActivity(intent2); AddaccountActivity.this.finish(); } }); btt3=(Button)findViewById(R.id.button10); btt3.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(tx1.getText().length()!=0||tx1.getText().length()!=0) { db.open(); long id=db.insertTitle(tx1.getText().toString(),tx3.getText().toString(), tx2.getText().toString()); Log.i("插入结果", "id"+id); db.close(); Intent intent2=new Intent(); intent2.setClass(AddaccountActivity.this, AccountlistActivity.class); startActivity(intent2); AddaccountActivity.this.finish(); } else { new AlertDialog.Builder(AddaccountActivity.this).setMessage("本框不能为空!").setPositiveButton("确定", null).show(); } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.addaccount, menu); return true; } }
实体类:
package database; public class goods { private int id; private String name; private String account; private String pass; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } }
数据库操作类:
package database; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteCursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; //库表中两个字段AppName AppPass public class DBAdapter { public static final String KEY_ROWID = "_id"; public static final String AppName="name"; public static final String AppAccount="account"; public static final String AppPass="pass"; private static final String TAG = "DBAdapter"; private static final String DATABASE_NAME = "BOX"; private static final String DATABASE_TABLE = "yuyu"; private static final int DATABASE_VERSION = 1; private static final String DATABASE_CREATE = "create table yuyu (_id integer primary key autoincrement, " + "name text not null,account text not null, pass text not null);"; private final Context context; private DatabaseHelper DBHelper; private 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); } //创建一个新的数据库 public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE); } //升级数据库 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 titles"); onCreate(db); } } //---打开数据库--- public DBAdapter open() throws SQLException { db = DBHelper.getWritableDatabase(); return this; } //---关闭数据库--- public void close() { DBHelper.close(); } //---向数据库插入一个标题--- public long insertTitle(String name,String account ,String pass) { ContentValues initialValues = new ContentValues(); //initialValues.put(KEY_ROWID, _id); initialValues.put(AppName, name); initialValues.put(AppAccount, account); initialValues.put(AppPass, pass); return db.insert(DATABASE_TABLE, null, initialValues); } //---删除一个指定的标题--- public boolean deleteTitle(long rowId) { return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; } //---检索所有标题--- public Cursor getAllTitles() { return db.query(DATABASE_TABLE, new String[] {KEY_ROWID,AppName,AppAccount,AppPass},null,null,null,null,null); } //---检索一个指定的标题--- public Cursor getTitle(long rowId) throws SQLException { Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] { KEY_ROWID, AppName, AppAccount, AppPass }, KEY_ROWID + "=" + rowId, null, null, null, null, null); if (mCursor != null) { mCursor.moveToFirst(); } return mCursor; } //---更新一个标题--- public boolean updateTitle(long rowId, String name,String account, String pass) { ContentValues args = new ContentValues(); args.put(AppName, name); args.put(AppAccount, account); args.put(AppPass, pass); return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; } }
主页面上两个图标的适配类:
package ImageAdapter; import com.example.passwordbox.R; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class imageAdapter extends BaseAdapter { private Integer[] arrImage = { R.drawable.epurse, R.drawable.ecard, }; String arrText[] = null;// {"登录", "充值", "消费", "查询余额", "历史记录", "设置", "关于", // "帮助","退出"}; private Context mContext; public imageAdapter(Context context, String[] arrText) { mContext = context; this.arrText = arrText; } public int getCount() { return arrImage.length; } /* * (non-Javadoc) * * @see android.widget.Adapter#getView(int, android.view.View, * android.view.ViewGroup) */ @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder holder = new ViewHolder(); if (convertView == null) { LayoutInflater mInflater = LayoutInflater.from(mContext); convertView = mInflater.inflate(R.layout.item, null); holder.image = (ImageView) convertView.findViewById(R.id.ItemImage); holder.text = (TextView) convertView.findViewById(R.id.ItemText); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag();// imageview=(ImageView) // convertView; } holder.image.setImageResource(arrImage[position]); holder.text.setText(arrText[position]); return convertView; } public Object getItem(int position) { // TODO Auto-generated method stub return null; } public long getItemId(int position) { // TODO Auto-generated method stub return 0; } private static class ViewHolder { ImageView image;// 图片 TextView text;// 文字 } }
list列表的适配类:
package ImageAdapter; import java.util.List; import com.example.passwordbox.R; import database.goods; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class listAdapter extends BaseAdapter{ private List<goods> list;//绑定的数据集 //private int source;//资源布局文件 Context mContext; private LayoutInflater inflater; //布局填充器,Android的内置服务,作用:使用xml文件来生成对应的view对象 public listAdapter (Context context,List<goods> good)//int resource { this.list=good; //this.source=resource; this.mContext=context; //得到布局填充服务 inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return list.get(arg0); } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public View getView(int position, View convertView, ViewGroup arg2) { // TODO Auto-generated method stub //判断是否为第一页 //提供缓存机制 ViewCache cache; if(convertView == null){ //为条目创建View对象,生成条目界面对象 convertView = inflater.inflate(R.layout.txview, null); //得到当前条目的数据 cache = new ViewCache(); cache .name = (TextView)convertView.findViewById(R.id.textView5); cache .account = (TextView)convertView.findViewById(R.id.textView6); cache.pass = (TextView)convertView.findViewById(R.id.textView7); //用视图标识临时存放缓存数据 // convertView.setTag(cache); } else { cache = (ViewCache) convertView.getTag(); } //得到当前条目对象 goods stu=new goods(); stu = list.get(position); Log.i("list内容", ""+list.toString()); //为当前条目赋值 cache.name.setText(" "+stu.getName().toString()+" "); cache.account.setText(" "+stu.getAccount());//转化成string cache.pass.setText(" "+stu.getPass().toString()); convertView.setTag(cache); return convertView; } private final class ViewCache { public TextView name; public TextView account; public TextView pass; } }
具体的layout有好几个 不在这贴了,想要的同学可以找我,我发给你 我的qq:405356078 加的时候注明博客园 否则不加