Android Studio实现通讯录

Posted 振华OPPO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Studio实现通讯录相关的知识,希望对你有一定的参考价值。

一、项目概述

本次项目主要实现了联系人信息(姓名和电话)的增加、删除、修改和查询功能。主要用到SQLiteDatabase来存储数据,SQLite数据库和其他的SQL数据库不同, 我们并不需要在手机上另外安装一个数据库软件,android系统已经集成了这个数据库。我们下面会详细介绍SQLite数据库。

二、开发环境

开发环境还是老样子哈,JDK选择1.8版本,API选28,Android Studio版本最好是3.6.1。
在这里插入图片描述

三、详细设计

1、界面的搭建

整体布局是线性布局LinearLayout。我设置了页边距:android:padding=“10dp”,orientation方向选择的也是vertical垂直方式。下面先是放置了一个小的LinearLayout,里面是一个文本框和一个输入框,代表姓名。紧接着再放一个LinearLayout,里面也是一个文本框加一个输入框,表示电话号码。这是每个项目都常见的基本设计了。代码如下:

    <LinearLayout
        android:layout_marginTop="130dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="姓 名:"
            android:textSize="28sp"/>
        <EditText
            android:id="@+id/et_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入姓名"
            android:textSize="26sp"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="电 话:"
            android:textSize="28sp"/>
        <EditText
            android:id="@+id/et_phone"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入电话号码"
            android:textSize="26sp"/>
    </LinearLayout>

下面是四个按钮,我设置了四种颜色区分它。这里我让四个按钮的宽度平分父布局,将这四个按钮的width都设为0dp,然后将weight都设置为1就可以实现。

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp">
        <Button
            android:id="@+id/btn_add"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="2dp"
            android:layout_weight="1"
            android:background="#7CFC00"
            android:text="添加"
            android:textSize="18sp"/>

        <Button
            android:id="@+id/btn_query"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="2dp"
            android:layout_weight="1"
            android:background="#DCB5FF"
            android:text="查询"
            android:textSize="18sp"/>
        <Button
            android:id="@+id/btn_update"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="2dp"
            android:layout_weight="1"
            android:background="#97FFFF"
            android:text="修改"
            android:textSize="18sp"/>
        <Button
            android:id="@+id/btn_delete"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="2dp"
            android:layout_weight="1"
            android:background="#ACD6FF"
            android:text="删除"
            android:textSize="18sp"/>
    </LinearLayout>

最底下还有一个隐着的TextView,它是用来显示查询到的联系人信息。

<TextView
        android:id="@+id/tv_show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:textSize="20sp"/>

在这里插入图片描述

2、SQLite数据库

2.1、SQLite是什么?

SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,很适合在移动设备上使用, 不仅支持标准SQL语法,还遵循ACID(数据库事务)原则,无需账号,使用起来非常方便!Android内置的SQLite是SQLite 3版本的。

2.2、为什么要用SQLite?

前面我们学习了使用文件与SharedPreference来保存数据,但是在很多情况下,文件并不一定是有效的,如多线程并发访问是相关的;app要处理可能变化的复杂数据结构等等。比如银行的存钱与取钱!使用前两者就会显得很无力或者繁琐,数据库的出现可以解决这种问题,而Android又给我们提供了这样一个轻量级的SQLite,那肯定要好好用啊。

2.3、SQLite有什么特点?

SQLite支持五种数据类型:NULL,INTEGER,REAL(浮点数),TEXT(字符串文本)和BLOB(二进制对象) 虽然只有五种,但是对于varchar,char等其他数据类型都是可以保存的;因为SQLite有个最大的特点: 你可以将各种数据类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。
比如你可以在Integer类型的字段中存放String字符串,当然除了声明为主键INTEGER PRIMARY KEY的字段只能够存储64位整数。
另外,SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息。如下面语句会忽略 name字段的类型信息:

 CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQlite通过文件来保存数据库,一个文件就是一个数据库,数据库中又包含多个表格,表格里又有 多条记录,每个记录由多个字段构成,每个字段有对应的值,每个值我们可以指定类型,也可以不指定 类型(主键除外)

3、SQLite相关的类

3.1、SQLiteOpenHelper

抽象类,我们通过继承该类,然后重写数据库创建以及更新的方法, 我们还可以通过该类的对象获得数据库实例,或者关闭数据库。

3.2、SQLiteDatabase

数据库访问类:我们可以通过该类的对象来对数据库做一些增删改查的操作。

3.3、Cursor

游标,有点类似于JDBC里的resultset,结果集!可以简单理解为指向数据库中某 一个记录的指针。

4、创建数据库与版本管理

Android给我们提供了SQLiteOpenHelper的两个方法:onCreate( )与onUpgrade( )来实现
onCreate(database):首次使用软件时生成数据库表。
onUpgrade(database,oldVersion,newVersion):在数据库的版本发生变化时会被调用, 一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的。

  class MyHelper extends SQLiteOpenHelper{
        public MyHelper(Context context){
            super(context,"dzh.db",null,1);//数据库文件夹名为dzh.db
        }
        //数据库第一次创建时被调用
        @Override
        public void onCreate(SQLiteDatabase db){
            db.execSQL("CREATE TABLE person(_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20),phone VARCHAR(20))");
        }
        //软件版本号发生改变时调用
        @Override
        public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){

        }

上述代码第一次启动应用,我们会创建这个dzh.db的文件,并且会执行onCreate()里的方法, 创建一个person的表,它有两个字段:主键personId和name字段;接着如果我们修改db的版本号,那么下次启动就会调用onUpgrade()里的方法,这里我们没有去填写方法,感兴趣的小伙伴可以试一下!

5、实现增删改查

本项目直接使用Android给我们提供的操作数据库的一些API方法,下面我们用项目中的这部分增删改查的代码来演示下这些API的用法。

 @Override
    public void onClick(View v){
        String name,phone;//声明姓名和电话字段
        SQLiteDatabase db;//声明一个数据库db
        ContentValues values;//创建values对象
        switch (v.getId()){
            case R.id.btn_add://添加数据
                name=mEtName.getText().toString();//获取字符串数据
                phone=mEtPhone.getText().toString();
                db=myHelper.getWritableDatabase();//获取可读写SQLiteDatabase对象
                values=new ContentValues();//创建ContentValues值
                values.put("name",name);//将数据添加到ContentValues对象
                values.put("phone",phone);
                //参数依次是:表名,强行插入null值的数据列的列名,一行记录的数据
                db.insert("person",null,values);//将数据插入到表中
                Toast.makeText(this,"信息已添加",Toast.LENGTH_SHORT).show();//提示信息
                db.close();//关闭数据库
                break;
            case R.id.btn_query://查询数据
                db=myHelper.getReadableDatabase();
                //参数依次是:表名,列名,where约束条件,where中占位符提供具体的值,指定group by的列,进一步约束
                Cursor cursor=db.query("person",null,null,null,null,
                null,null);//声明并打开游标
                if(cursor.getCount()==0){//获得总的数据条数
                    mTvShow.setText(" ");
                    Toast.makeText(this,"没有数据",Toast.LENGTH_SHORT).show();
                }else {
                    cursor.moveToFirst();//指针移动到第一行,成功返回true,也说明有数据
                    mTvShow.setText("Name: "+cursor.getString(1)+
                        " ;Tel: "+cursor.getString(2));
                }
                while (cursor.moveToNext()){//指针移动到下一行,成功返回true,表明还有元素
                    mTvShow.append("\\n"+"Name:"+cursor.getString(1)+
                        " ;Tel: "+cursor.getString(2));
                }
                cursor.close();//关闭游标
                db.close();
                break;
            case R.id.btn_update://修改数据
                db=myHelper.getReadableDatabase();
                values=new ContentValues();//要修改的数据
                values.put("phone",phone=mEtPhone.getText().toString());
                //参数依次是表名,修改后的值,where条件,以及约束,如果不指定三和四两个参数,会更改所有行
                db.update("person",values,"name=?",
                        new String[]{mEtName.getText().toString()});//更新并得到行数
                Toast.makeText(this,"信息已修改",Toast.LENGTH_SHORT).show();
                db.close();
                break;
            case R.id.btn_delete://删除数据
                db=myHelper.getWritableDatabase();
                //参数依次是表名,以及where条件与约束
                db.delete("person",null,null);
                Toast.makeText(this,"信息已删除",Toast.LENGTH_SHORT).show();
                mTvShow.setText(" ");
                db.close();
                break;
        }
    }

四、项目效果

1、运行模拟器,启动应用
在这里插入图片描述
2、输入姓名和电话,点击添加按钮,显示信息已添加
在这里插入图片描述
3、点击查询按钮,发现底下出现已有联系人的信息(因为背景看不清)
在这里插入图片描述
4、点击修改按钮,修改已有联系人的信息,将姓名由DZH改为SH,弹出“修改信息成功”的提示信息
在这里插入图片描述
5、点击删除按钮,将显示的联系人信息删除,然后点击查询按钮,因为没有联系人数据,弹出“没有数据”的提示信息在这里插入图片描述
6、添加三条新的数据进去,然后查询,可以看到显示了三条记录
在这里插入图片描述
7、不要关掉模拟器,在右侧Device File Explorer中找到data文件夹,然后在data文件夹下找到zj.dzh.directory文件夹,继续展开文件夹
在这里插入图片描述
找到databases文件夹,有个dzh.db,就是我们创建的数据库,将它保存到本地
在这里插入图片描述
8、使用SQLite图形化工具查看db文件,推荐用SQLite Expert Professional打开刚刚的db文件,就会发现有张person表,下面显示了三条联系人记录

五、项目总结

本次通讯录项目主要考验学生对于SQLite数据库的使用,还是比较基础的,刚接触Android的同学只要动手打一遍就会理解了。这些知识点在今后的Android项目中会经常使用,因此希望大家能够熟练掌握上述知识点的使用,方便后续开发项目。

六、源码下载

需要源码学习的同学可以关注我的微信公众号,回复:通讯录,即可免费获取源码,还有更多免费的Android项目等你来学习。
在这里插入图片描述

这凡尘到底有什么可留恋的?
原来,都是这些小欢喜啊。
它们在我的生命里唱着歌,跳着舞。
活着,也就成了一件特别让人不舍的事情。
2016.3.12 17:34 YXN

以上是关于Android Studio实现通讯录的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio实现通讯录

Android课程---Android Studio使用小技巧:提取方法代码片段

Android Studio创建AIDL文件并实现进程间通讯

错误记录Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. | Android Studio 降级 )(代码片段

错误记录Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. | Android Studio 降级 )(代码片段

在Android Studio片段之间切换时地图片段不隐藏