zoukankan      html  css  js  c++  java
  • 暑假作业--密码备忘录

    暑假作业--密码备忘录

    项目介绍

    app功能:一个手机用户拥有一个账户本,能够将平时自己容易的忘记的账户记录下来,每次重启app时数据不会清零,不需要担心数据丢失,只要打开app,便可获取到自己的账户本。

    效果图

    实现的效果图,如下:
    以下界面分别为进入app界面


    提交账户内容界面

    账户列表界面

    删除账户信息


    实现的工程目录如下

    实现的具体过程:

    a.布局代码:

    (1)登录界面图:activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
        <RelativeLayout
            android:background="@color/colorPrimary"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="40dp">
            <TextView
                android:layout_centerInParent="true"
                android:text="首页"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
            <Button
                android:layout_marginRight="10dp"
                android:layout_centerVertical="true"
                android:id="@+id/bt_add"
                android:background="@color/colorAccent"
                android:layout_alignParentRight="true"
                android:text="添加"
                android:layout_width="50dp"
                android:layout_height="30dp" />
        </RelativeLayout>
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
    </LinearLayout>
    

    (2)注册界面:act_login.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:layout_width="match_parent"
            android:layout_height="71dp"
            android:background="@color/colorPrimary"
            android:gravity="center"
            android:text="登录" />
    
    
        <EditText
            android:id="@+id/et"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_margin="50dp"
            android:background="@drawable/shap_circle"
            android:gravity="center_vertical"
            android:hint="输入0000打开app"
            android:inputType="textPassword"
            android:paddingLeft="10dp" />
    
    
        <Button
            android:id="@+id/Button"
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="100dp"
            android:background="@color/colorPrimary"
            android:text="登录" />
    </LinearLayout>
    

    (3)添加账户页面:act_add.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:background="@color/colorPrimary"
            android:gravity="center"
            android:text="添加"
            android:layout_width="match_parent"
            android:layout_height="40dp" />
    
        <EditText
            android:id="@+id/EditText"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginTop="10dp"
            android:hint="请输入平台" />
    
        <EditText
            android:id="@+id/EditText1"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginTop="10dp"
            android:hint="请输入账号" />
    
        <EditText
            android:id="@+id/EditText2"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginTop="10dp"
            android:hint="请输入密码" />
    
        <Button
            android:id="@+id/Button"
            android:layout_width="100dp"
            android:layout_height="50dp"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="20dp"
            android:background="@color/colorPrimary"
            android:text="添加" />
    </LinearLayout>
    

    (4)账户具体信息页面: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="wrap_content"
        android:orientation="vertical"
        android:padding="10dp">
    
        <TextView
    
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="标题" />
    
        <TextView
            android:id="@+id/tv_account"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="账号" />
    
        <TextView
            android:id="@+id/tv_pwd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="密码" />
    
        <TextView
            android:id="@+id/tv_del"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="right"
            android:text="删除"
            android:textColor="@color/colorAccent" />
    </LinearLayout>
    

    b.实现代码:
    (1)登陆界面:Login——主要是实现跳转页面的功能,输入0000直接打开app,因为这是一个记录密码的app,用户都需要用app来记录密码了,如果还让他记录app的登陆密码就太过分了。

    import android.content.Intent;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class Login extends AppCompatActivity implements View.OnClickListener {
        private EditText et;
        private Button Button;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.act_login);
            initView();
        }
    
        private void initView() {
            et = (EditText) findViewById(R.id.et);
            Button = (Button) findViewById(R.id.Button);
    
            Button.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.Button:
                    submit();
                    break;
            }
        }
    
        private void submit() {
            String etString = et.getText().toString().trim();
            if (TextUtils.isEmpty(etString)) {
                Toast.makeText(this, "输入0000打开app", Toast.LENGTH_SHORT).show();
                return;
            }
    
    
            if ("0000".equals(etString)){
                Intent intent =new Intent(Login.this,MainActivity.class);
                startActivity(intent);
                finish();
            }else {
                Toast.makeText(this, "您输错了", Toast.LENGTH_SHORT).show();
            }
    
        }
    }
    
    

    (2)建立一个Model类来保存数据,主要含有用户名,密码和相关信息。

    public class Model {
        public String id;
        public String title;
        public String account;
        public String pwd;
    
        public Model(String id, String title, String account, String pwd) {
            this.id = id;
            this.title = title;
            this.account = account;
            this.pwd = pwd;
        }
    }
    
    

    (3)建立完后,我们要自定义一个适配器BaseAdapter去加载数据到列表界面中:

    import android.support.annotation.Nullable;
    
    import com.chad.library.adapter.base.BaseQuickAdapter;
    import com.chad.library.adapter.base.BaseViewHolder;
    
    import java.util.List;
    //RecyclerView 通用适配 BaseQuickAdapter 参考网址:https://blog.csdn.net/u011622280/article/details/69229930
    public class BaseAdapter<T> extends BaseQuickAdapter<T,BaseViewHolder> {
    
        private final ConVert conVert;
    
        public BaseAdapter(int layoutResId, @Nullable List data, ConVert<T> conVert) {
    
            super(layoutResId, data);
            this.conVert =conVert;
    
        }
    
        @Override
        protected void convert(BaseViewHolder helper, T item) {
            conVert.convert(helper,item);
        }
        public interface ConVert<T>{
            void convert(BaseViewHolder helper, T t);
        }
    }
    

    (4)添加账户界面:Add——主要实现获取到用户输入的信息,然后保存到数据库中。

    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class Add extends AppCompatActivity implements View.OnClickListener {
        private EditText et_title;
        private EditText et_account;
        private EditText et_pwd;
        private Button bt_add;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.act_add);
            initView();
        }
    
        private void initView() {
            et_title = (EditText) findViewById(R.id.EditText);
            et_account = (EditText) findViewById(R.id.EditText1);
            et_pwd = (EditText) findViewById(R.id.EditText2);
            bt_add = (Button) findViewById(R.id.Button);
    
            bt_add.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.Button:
                    submit();
                    break;
            }
        }
    
        private void submit() {
            // validate
            String title = et_title.getText().toString().trim();
            if (TextUtils.isEmpty(title)) {
                Toast.makeText(this, "请输入平台", Toast.LENGTH_SHORT).show();
                return;
            }
    
            String account = et_account.getText().toString().trim();
            if (TextUtils.isEmpty(account)) {
                Toast.makeText(this, "请输入账号", Toast.LENGTH_SHORT).show();
                return;
            }
    
            String pwd = et_pwd.getText().toString().trim();
            if (TextUtils.isEmpty(pwd)) {
                Toast.makeText(this, "请输入密码", Toast.LENGTH_SHORT).show();
                return;
            }
    
    
           new SqlDao(this).add(title,account,pwd);
            finish();
    
        }
    }
    
    

    (5)添加完信息后,我们应该将在列表界面中更新出相关数据出来,那么我们去更新数据,即数据库中获取数据,那么这里要去搜索与用户相对应的信息,而这里我们直接去搜索表名为用户名的表格即可,因为我们之前已经设置了表名为用户。以及删除列表项的功能。

    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
    
    //数据库帮助类
    public class DBHelper extends SQLiteOpenHelper {
    
    private static final String TAG = "TestSQLite";
    public static final int VERSION = 1;
    
    //必须要有构造函数
    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,
                    int version) {
    super(context, name, factory, version); 
    } 
       
    // 当第一次创建数据库的时候,调用该方法  
    public void onCreate(SQLiteDatabase db) { 
    String sql = "create table a_table(id INTEGER primary key autoincrement,title varchar(20),account  varchar(85),pwd  varchar(85))";
    
    //输出创建数据库的日志信息
    Log.i(TAG, "create Database------------->");
    //execSQL函数用于执行SQL语句 
    db.execSQL(sql); 
    
    }
       
    //当更新数据库的时候执行该方法 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    //输出更新数据库的日志信息 
    Log.i(TAG, "update Database------------->"); 
    } 
    }
    

    (6)打开关闭数据库:Sqldao——获取到传递过来的信息,并加载到布局中即可。

    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class SqlDao {
        private Context context;
        private final DBHelper dbHelper;
    
        public SqlDao(Context context){
            this.context=context;
            dbHelper = new DBHelper(context,"a_db",null,1);
        }
        public void add(String title,String account,String pwd){
            SQLiteDatabase db =dbHelper.getWritableDatabase();
    
            //生成ContentValues对象 //key:列名,value:想插入的值
            ContentValues cv = new ContentValues();
            //往ContentValues对象存放数据
    
            cv.put("title", title);
            cv.put("account", account);
            cv.put("pwd", pwd);
    
            //调用insert方法,将数据插入数据库
            db.insert("a_table", null, cv);
            Toast.makeText(context,"添加成功", Toast.LENGTH_LONG).show();
            //关闭数据库
            db.close();
        }
    
    
            //删除关键词
        public void delete(String id){
    
            //得到一个可写的数据库
            SQLiteDatabase db =dbHelper.getWritableDatabase();
    
            db.delete("a_table","id = ?",new String[]{id});
            Toast.makeText(context,"删除成功",Toast.LENGTH_LONG).show();
            //关闭数据库
            db.close();
    
        }
    
    
        public   List<Model> getData(){
    
            List<Model> list=new ArrayList<>();
            //得到一个可写的数据库
            SQLiteDatabase db =dbHelper.getReadableDatabase();
            //参数1:表名
            //参数2:要想显示的列
            //参数3:where子句
            //参数4:where子句对应的条件值
            //参数5:分组方式
            //参数6:having条件
            //参数7:排序方式
            Cursor cursor = db.query("a_table", new String[]{"id","title","account","pwd"}, "", null, null, null, null);
            while(cursor.moveToNext()){
                String id = cursor.getString(cursor.getColumnIndex("id"));
                String title = cursor.getString(cursor.getColumnIndex("title"));
                String account = cursor.getString(cursor.getColumnIndex("account"));
                String pwd = cursor.getString(cursor.getColumnIndex("pwd"));
    
                list.add(new Model(id,title,account,pwd));
            }
    
    
            //关闭数据库
            db.close();
            return  list;
        }
    }
    

    (7)主界面:MainActivity

    import android.content.DialogInterface;
    import android.content.Intent;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.os.Bundle;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.View;
    import android.widget.Button;
    import com.chad.library.adapter.base.BaseViewHolder;
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        private RecyclerView recycler;
        private Button bt_add;
        private List<Model> list=new ArrayList<>();
        private BaseAdapter<Model> adapter;
        private SqlDao sqlDao;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            sqlDao = new SqlDao(this);
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
        }
    
        private void initView() {
            recycler = (RecyclerView) findViewById(R.id.recycler);
    
            bt_add = (Button) findViewById(R.id.bt_add);
            bt_add.setOnClickListener(this);
            recycler.setLayoutManager(new LinearLayoutManager(this));
            adapter = new BaseAdapter<>(R.layout.item, list, new BaseAdapter.ConVert<Model>() {
    
                @Override
                public void convert(BaseViewHolder helper, final Model model) {
                    helper.setText(R.id.tv_title,model.title);
                    helper.setText(R.id.tv_account,model.account);
                    helper.setText(R.id.tv_pwd,model.pwd);
                    helper.getView(R.id.tv_del).setOnClickListener(new View.OnClickListener() {
    
                        private AlertDialog dialog;
    
                        @Override
                        public void onClick(View view) {
                            AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
                            builder.setMessage("确认删除吗?");
                            builder.setNegativeButton("确认", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    sqlDao.delete(model.id);
                                    list.remove(model);
                                    adapter.notifyDataSetChanged();
                                    dialog.dismiss();
                                }
                            }); builder.setPositiveButton("取消", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    dialog.dismiss();
                                }
                            });
                            dialog = builder.create();
                            dialog.show();
                        }
                    });
                }
            });
            recycler.setAdapter(adapter);
    
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.bt_add:
                    Intent intent =new Intent(MainActivity.this,Add.class);
                    startActivity(intent);
                    break;
            }
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            list.clear();
            getData();
    
        }
    
        public  void getData(){
    
            DBHelper dbHelper = new DBHelper(this, "a_db", null, 1);
    //得到一个可写的数据库
            SQLiteDatabase db =dbHelper.getReadableDatabase();
    //参数1:表名
    //参数2:要想显示的列
    //参数3:where子句
    //参数4:where子句对应的条件值
    //参数5:分组方式
    //参数6:having条件
    //参数7:排序方式
            Cursor cursor = db.query("a_table", new String[]{"id","title","account","pwd"}, "", null, null, null, null);
            while(cursor.moveToNext()){
                String id = cursor.getString(cursor.getColumnIndex("id"));
                String title = cursor.getString(cursor.getColumnIndex("title"));
                String account = cursor.getString(cursor.getColumnIndex("account"));
                String pwd = cursor.getString(cursor.getColumnIndex("pwd"));
    
                list.add(new Model(id,title,account,pwd));
            }
    
            adapter.notifyDataSetChanged();
    //关闭数据库
            db.close();
    
        }
    }
    

    总结

    这是第一次尝试使用as自带的数据库,并从数据库中获取数据,在使用数据库过程中,有个问题被困扰了很久,就是关于如何实现为每一个用户建立一个对应的表格,将用户的信息保存到对应的表格中,后来通过设置表名唯一,搜索表名来获取表中数据来实现。还有一个未实现的问题就是登陆注册界面,虽然说我之前在文中说密码备忘录不需要密码登陆,但实际原因还是因为能力不够,希望在以后的学习中能学习到注册登陆密码,最好再学习一下如果客户忘记密码的话要如何更改密码。总的来说,这一次的实现过程中,处处碰壁,主要是对数据库和as的不熟悉导致,希望之后能够加强as的熟悉,这样受限就不会那么多,不过这步还有很漫长,希望能坚持下去!

  • 相关阅读:
    进程间通信(管道和有名管道)
    BAT面试需要什么样的程序员?
    深入剖析Redis系列: Redis哨兵模式与高可用集群
    七大进程间通信和线程同步
    详解Redis 的持久化机制--RDB和AOF
    大型网站技术架构演进
    Coding Standard(编程规范)
    @RequestBody,415Unsupported Media Type错误
    排序算法
    单例设计模式
  • 原文地址:https://www.cnblogs.com/amberR/p/10051584.html
Copyright © 2011-2022 走看看