android实现联系人第二版(加群832021435)

> 已经实现了sqlite的数据库的增删改查,今天参照*androidstudio实现联系人功能 第一版 2018年07月16日 21:11:06
中还没有实现的两个功能做了改进。下面我将会直接放上代码,
图片请大家参照我的博客第一版里面的,
,图片请大家参照我的博客第一版里面的
,图片请大家参照我的博客第一版里面的
虽然做了一些改进,但具体原理是一样的2018年07月16日 21:11:06 jscsd226。
**>layout有三个 Java文件两个,数据库一个。大家复制代码的时候不要单纯的复制,要把握其中的共同点,吸收,才能慢慢提高。

  1. activity_main
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout 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:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#F0E6FD"

    tools:context=".MainActivity">


    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="25dp"
        android:layout_y="84dp"

        android:text="请输入姓名:"
        android:textColor="#00E5BE" />

    <EditText
        android:id="@+id/search_et"
        android:layout_width="109dp"
        android:layout_height="wrap_content"
        android:layout_x="134dp"
        android:layout_y="65dp"
        android:hint="姓名"
        android:textColor="#00E5BE"
        android:textSize="18sp" />


    <Button
        android:id="@+id/search_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="144dp"
        android:layout_y="137dp"
        android:background="#F0E6FD"
        android:text="查询所有联系人"
        android:textColor="#00E5BE" />

    <Button
        android:id="@+id/btn_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="274dp"
        android:layout_y="141dp"
        android:background="#F0E6FD"
        android:text="添加联系人"
        android:textColor="#00E5BE" />

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="296dp"
        android:layout_alignParentTop="true"
        android:layout_x="0dp"
        android:layout_y="213dp"
        tools:layout_editor_absoluteX="219dp"
        tools:layout_editor_absoluteY="455dp" />



    <Button
        android:id="@+id/btn_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="22dp"
        android:layout_y="137dp"
        android:background="#F0E6FD"
        android:text="删除联系人"
        android:textColor="#00E5BE"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="130dp" />

    <Button
        android:id="@+id/search_btn_bit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="272dp"
        android:layout_y="71dp"
        android:background="#F0E6FD"
        android:text="查询联系人"
        android:textColor="#00E5BE"
        tools:layout_editor_absoluteX="241dp"
        tools:layout_editor_absoluteY="66dp" />

</AbsoluteLayout>


2
.activity_add

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
    android:id="@+id/widget0"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#F0E6FD"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <EditText
        android:id="@+id/add_word"
        android:layout_width="181dp"
        android:layout_height="wrap_content"
        android:layout_x="144dp"
        android:layout_y="40dp"
        android:hint="姓名"
        android:textSize="18sp" />

    <EditText
        android:id="@+id/add_interpret"
        android:layout_width="180dp"
        android:layout_height="wrap_content"
        android:layout_x="146dp"
        android:layout_y="94dp"
        android:hint="联系方式"
        android:inputType="number"
        android:maxLength="11"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/widget39"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="55dp"
        android:layout_y="54dp"

        android:text="请输入姓名:" />

    <TextView
        android:id="@+id/widget40"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="56dp"
        android:layout_y="106dp"

        android:text="请输入电话:" />

    <Button
        android:id="@+id/save_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="88dp"
        android:layout_y="160dp"
        android:text="保存" />

    <Button
        android:id="@+id/cancel_btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_x="213dp"
        android:layout_y="159dp"
        android:text="返回" />
</AbsoluteLayout>

3.result_main

<?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/result_word"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/result_interpret"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

4.mainActivity

package jscsd.sqlitedatabasetwo;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.widget.AdapterView;
import android.widget.Button;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;


public class MainActivity extends Activity {

    private   MyDatabaseHelper dbOpenHelper;//定义DBOpenHelper
    private SQLiteDatabase dbRead,dbWrite;
    private SimpleCursorAdapter adapter;


/*
    创建AlertDialog的步骤:

    1、创建AlertDialog.Builder对象

  2、调用Builder对象的setTitle方法设置标题,setIcon方法设置图标

  3、调用Builder相关方法如setMessage方法、setItems方法、setSingleChoiceItems方法、setMultiChoiceItems方法、setAdapter方法、setView方法设置不同类型的对话框内容。

    4、调用setPositiveButton、setNegativeButton、setNeutralButton设置多个按钮

  5、调用Builder对象的create()方法创建AlertDialog对象

  6、调用AlertDialog对象的show()方法将对话框显示出来
*/

    private AdapterView.OnItemLongClickListener listViewItemLongClickListener=new AdapterView.OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view,
                                       final int position, long id) {

            new AlertDialog.Builder(MainActivity.this).setTitle("提醒").setMessage("您确定要删除该项吗").setNegativeButton("取消", null).setPositiveButton("确定", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Cursor c = adapter.getCursor();
                    c.moveToPosition(position);

                    int itemId = c.getInt(c.getColumnIndex("_id"));
                    dbWrite.delete("dict", "_id=?", new String[]{itemId+""});
                    refreshListView();
                }
            }).show();

            return true;   //如果是true操作系统执行的反馈(震动或者声音)  如果是false 则不触发
        }
    };




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dbOpenHelper = new MyDatabaseHelper(this);
        SQLiteDatabase db = dbOpenHelper.getReadableDatabase();


        final ListView listView = (ListView) findViewById(R.id.list);
        final EditText etSearch = (EditText) findViewById(R.id.search_et);
        Button btnSearch = (Button) findViewById(R.id.search_btn);
        Button btnSearch_bit = (Button) findViewById(R.id.search_btn_bit);
        Button btn_add = (Button) findViewById(R.id.btn_add);
        Button btn_delete = (Button) findViewById(R.id.btn_delete);

        //触发方法的实现  长按触发删除某一行
        dbRead = dbOpenHelper.getReadableDatabase();
        dbWrite = dbOpenHelper.getWritableDatabase();
        adapter = new SimpleCursorAdapter(this, R.layout.result_main, null, new String[]{"word", "detail"}, new int[]{R.id.result_word, R.id.result_interpret});
        refreshListView();
        listView.setOnItemLongClickListener(listViewItemLongClickListener);


        //删除的实现
        //方法:
        //      1.假如要删除所有的,把条件和后面的置为空。
        //      2.假如要删除指定的某一个,即加入占位符,后面的把要删除的某一行写上。
        //      3.假如要删除其中的某个咋们输入的自己的数,则先用getTest().toString()方法获取到输入的数据,然后在后面调用,即可。
        btn_delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //获得数据库的写操作,并声明db,以便用于手续的sql语句操作
                SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
                //定义key,获得输入框输入的数据,便于后续的删除操作
                String key = etSearch.getText().toString();
                //此处一定注意
                //              我们在判断是否相等时,数字方面的用==,而字符与字符串必须要用equals方法
                if (key.equals("")) {
                    Toast.makeText(MainActivity.this, "没有可删除的数据", Toast.LENGTH_LONG).show();
                } else {
                    //db.delete("dict","nulll",null);  这句话是删除表中的所有的数据
                    db.delete("dict", "word=?", new String[]{key});   //删除之前定义的key
                    Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_LONG).show();
                }
            }
        });


        //跳转界面用 Intent实现,这是通用的一种方式。
        btn_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(MainActivity.this, AddActivity.class);
                //通过Intent跳转添加生词界面
                startActivity(intent);

            }
        });

        //查询其中的某一个,
        btnSearch_bit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String key = etSearch.getText().toString();//获取要查询的姓名
                //query("user",new String[]{"id","name"},"id=?",new String[]{"1"},null,null,null)
                Cursor cursor = dbOpenHelper.getReadableDatabase().query("dict", null, "word=?", new String[]{key}, null, null, null);
                //创建ArrayList对象,用于保存查询输出的结果
                ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>();// 创建一个结果集 两个String类型
                while (cursor.moveToNext()) {
                    //用while循环一直判断,当下一条为假时,我们的游标循环也就结束了
                    //cursor.movetonext   定义一个游标 它的作用是将游标向下挪动一位 判断当前游标位置的下一条还有没有数据 如果有 就返回真 如果无 就返回假
                    Map<String, String> map = new HashMap<>(); //新开辟一个map的集合空间
                    // map.put("id",cursor.getString(0));
                    map.put("word", cursor.getString(1));//在第一行输出姓名
                    map.put("interpret", cursor.getString(2));//在第二行输出电话
                    resultList.add(map);//在XML文件resultList 显示
                }
                if (resultList == null || resultList.size() == 0) {
                    Toast.makeText(MainActivity.this, "查无此人", Toast.LENGTH_LONG).show();
                } else {
                    //定义一个simpleAdapter,供列表项使用
                    SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultList, R.layout.result_main,
                            new String[]{"word", "interpret"}, new int[]{
                            R.id.result_word, R.id.result_interpret});
                    listView.setAdapter(simpleAdapter);
                }


            }
        });

        //查询所有的
        btnSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               // String key = etSearch.getText().toString();//获取要查询的姓名
                //query("user",new String[]{"id","name"},"id=?",new String[]{"1"},null,null,null)
                Cursor cursor = dbOpenHelper.getReadableDatabase().query("dict", null, null, null, null, null, null);
                //创建ArrayList对象,用于保存查询输出的结果
                ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>();// 创建一个结果集 两个String类型
                while (cursor.moveToNext()) {
                    //用while循环一直判断,当下一条为假时,我们的游标循环也就结束了
                    //cursor.movetonext   定义一个游标 它的作用是将游标向下挪动一位 判断当前游标位置的下一条还有没有数据 如果有 就返回真 如果无 就返回假
                    Map<String, String> map = new HashMap<>(); //新开辟一个map的集合空间
                    map.put("word", cursor.getString(1));//在第一行输出姓名
                    map.put("interpret", cursor.getString(2));//在第二行输出电话
                    resultList.add(map);//在XML文件resultList 显示
                }
                if (resultList == null || resultList.size() == 0) {
                    Toast.makeText(MainActivity.this, "没有相关记录", Toast.LENGTH_LONG).show();
                } else {
                    //定义一个simpleAdapter,供列表项使用
                    SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultList, R.layout.result_main,
                            new String[]{"word", "interpret"}, new int[]{
                            R.id.result_word, R.id.result_interpret});
                    listView.setAdapter(simpleAdapter);
                }


            }
        });


    }


    private void refreshListView(){
        Cursor c = dbRead.query("dict", null, null, null, null, null, null);
        adapter.changeCursor(c);
    }
    //释放数据库连接
    @Override
    protected void onDestroy(){
        super.onDestroy();
        if(dbOpenHelper!=null){
            dbOpenHelper.close();
        }
    }

    //双击退出  使用按下的方式。双击退出一共有三种方式 按下 弹起 定时

//记录用户首次点击返回键的时间
private long firstTime=0;

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_BACK && event.getAction()==KeyEvent.ACTION_DOWN){
            if (System.currentTimeMillis()-firstTime>2000){
                Toast.makeText(MainActivity.this,"再按一次退出程序--->onKeyDown",Toast.LENGTH_SHORT).show();
                firstTime=System.currentTimeMillis();
            }else{
                finish();
                System.exit(0);
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        // getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


}

5.addActivity

package jscsd.sqlitedatabasetwo;

import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class AddActivity extends AppCompatActivity {

    private MyDatabaseHelper dbOpenHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add);

        dbOpenHelper = new MyDatabaseHelper(this);
        final EditText etWord =(EditText) findViewById(R.id.add_word);
        final EditText etExplain =(EditText) findViewById(R.id.add_interpret);
        Button btn_Save =(Button)findViewById(R.id.save_btn);
        Button btn_Cancel =(Button)findViewById(R.id.cancel_btn1);

        btn_Save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String word =etWord.getText().toString();
                String explain =etExplain.getText().toString();
                if (word.equals("")||explain.equals("")){
                    Toast.makeText(AddActivity.this,"填写的联系人或者电话为空",Toast.LENGTH_SHORT).show();
                }
                else {
                    //调用insertData方法,实现插入数据
                    insertData(dbOpenHelper.getReadableDatabase(),word,explain);
                    //显示提示信息
                    Toast.makeText(AddActivity.this,"添加联系人成功!",Toast.LENGTH_LONG).show();
                }
            }
        });
        btn_Cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(AddActivity.this,MainActivity.class);
                startActivity(intent);
                finish();
            }
        });
    }

    private void insertData(SQLiteDatabase readableDatabase,String word,String explain){
        //生词ContentValues对象
        ContentValues values =new ContentValues();
        //向该对象当中插入键值对,其中键是列名,值是希望插入这一列的值,值必须和数据库的数据类型匹配
        values.put("word",word);//保存联系人
        values.put("detail",explain);//保存电话
        readableDatabase.insert("dict",null,values);//执行插入操作
    }

    //更新操作
    //第一个参数是要更新的表名  第二个是一个ContentValeus对象 第三个是where字句
    //dbOpenHelper.update("dict",values,"id=?",new String[]{"?"});

}

6.myDatabaseHelper.java

package jscsd.sqlitedatabasetwo;

/*
    MyDatabaseHelper作为一个访问sqlite的助手类,提供两个方面的功能
    1.getReadableDatabase(),getWriteableDatabase(), 可以获得sqliteDatabase对象。
    2.提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作。
*/
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDatabaseHelper extends SQLiteOpenHelper {
    //这里面有三个参数
    /*
        第一个是id 主键,它是自动增长的
        第二个与第三个是我们定义的两个数据 姓名 电话
     */
    final String CREATE_TABLE_SQL = "create table dict(_id integer primary  key autoincrement,word varchar(5),detail varchar(11))";

    //在SQLiteOpenHelper的子类当中,必须有该构造函数。
    public MyDatabaseHelper(Context context){
        //必须通过super调用父类中的构造函数
        super(context,"dict.db",null,1);//重写构造方法并设置工厂为null
    }
    @Override
    //该函数在第一次创建数据库时执行
    public void onCreate(SQLiteDatabase db){
        //execSQL用于执行SQL语句
        /*
        怎么预置数据呢
            我们现在有两种方式,
                1.用studiosqlite新建数据库,然后把表导入到我们的手机上 暂时还没有实现
                2.在代码里面直接写入 如下
         */
        db.execSQL(CREATE_TABLE_SQL);//创建单词信息表
        db.execSQL("insert into dict(word,detail) values(?,?)",new String[]{"张SIT","10000000"});
        db.execSQL("insert into dict(word,detail) values(?,?)",new String[]{"田","10000005"});
    }

    @Override
    //重写基类的onUpgrade()方法,以便数据库版本更新
    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
        //提示版本更新并输出旧版本与新版本信息
        System.out.println("---版本更新---"+oldVersion+"--->"+newVersion);
    }


}

到这儿所有的代码就结束了,至于配置文件里面没啥需要改的,我们的studio会自动生成。
如果大家有啥问题,欢迎加群讨论(加群832021435)

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值