Android——一个神奇的通讯录APP

一个神奇的通讯录APP

效果视频

Android——一个神奇的通讯录APP

通讯录

; 联系人总览

效果图

Android——一个神奇的通讯录APP

; SQLite数据库

建表

使用常量定义需要使用的行,方便后期更改;简洁,方便

public class Helper extends SQLiteOpenHelper {
    /**数据库名称*/
    public static final String DataBase = "MailList.db";
    public static final SQLiteDatabase.CursorFactory factory = null;
    public static int version = 1;
    /**表名*/
    public static final String TableName = "Contacts";
    /**行名*/
    public static final String Row_LastName = "LastName";
    public static final String Row_FirstName = "FirstName";
    public static final String Row_PinYin = "PinYin";
    public static final String Row_Phone = "PhoneNumber";
    public static final String Row_School = "School";
    public static final String Row_Address = "Address";
    public static final String Row_Other = "Other";

    public Helper(@Nullable Context context) {
        super( context, DataBase, factory, version );
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table " + TableName + "( "+Row_Phone+" varchar(20) primary key, "+Row_LastName+" varchar(20),"+Row_FirstName+" varchar(20),"+Row_PinYin+" varchar(20), "+Row_School+" varchar(20),"+Row_Address+" varchar(20),"+Row_Other+" varchar(20));";
        db.execSQL( sql );
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists "+TableName);
        onCreate(db);
    }
}
CRUD

将SQLite数据库的CRUD操作封装为一个Dao类,便于管理

public void Insert(News news){
        DB = helper.getReadableDatabase();
        if (DB.isOpen())
        {
            ContentValues values = new ContentValues();
            values.put( Helper.Row_Phone,news.getPhoneNumber());
            values.put( Helper.Row_LastName,news.getLastName());
            values.put( Helper.Row_FirstName,news.getFirstName());
            values.put(Helper.Row_PinYin,news.getPinYin());
            values.put( Helper.Row_School,news.getSchool());
            values.put( Helper.Row_Address,news.getAddress());
            values.put(Helper.Row_Other,news.getOther());
            long RowId = DB.insert(Helper.TableName,null,values);
            if(RowId == -1)
                Log.i(TAG, "数据插入失败!");
            else
                Log.i(TAG, "数据插入成功!"+RowId);
        }
    }

列出根据某个字段删掉某行和删掉表中所有数据两种方法

public void Delete(String Phone){
        DB = helper.getReadableDatabase();
        if (DB.isOpen()){
            String whereClause = "PhoneNumber = ?";
            String[] whereArgs = {Phone + ""};
            int count = DB.delete(Helper.TableName, whereClause, whereArgs);
            if (count > 0)
                Log.i(TAG, "删除了: " + count + "行");
            else
                Log.i(TAG, "数据未删除!");
            DB.close(); // 数据库关闭
        }
    }
    public void DeleteAll(){
        DB = helper.getReadableDatabase();
        if (DB.isOpen()){
            String whereClause = null;
            String[] whereArgs = null;
            int count = DB.delete(Helper.TableName, whereClause, whereArgs);
            if (count > 0)
                Log.i(TAG, "删除了: " + count + "行");
            else
                Log.i(TAG, "数据未删除!");
            DB.close(); // 数据库关闭
        }
    }

以PhoneNumber为索引改该行的数据元素

public void Update(String PhoneNumber,String School,String Addr,String Other){
        DB = helper.getReadableDatabase();
        if (DB.isOpen()){
            ContentValues values = new ContentValues();
            values.put( Helper.Row_School,School);
            values.put( Helper.Row_Address,Addr);
            values.put(Helper.Row_Other,Other);
            int count = DB.update(Helper.TableName,values,"PhoneNumber = ?",new String[]{PhoneNumber});
            if (count > 0){
                Log.d(TAG,"update password row="+count);
            }else {
                Log.d(TAG,"update fail");
            }
            DB.close();
        }
    }

获取表中所有数据

public List<news> QueryAll() {
        DB = helper.getReadableDatabase();  // &#x83B7;&#x5F97;&#x4E00;&#x4E2A;&#x53EA;&#x8BFB;&#x7684;&#x6570;&#x636E;&#x5E93;&#x5BF9;&#x8C61;
        if(DB.isOpen()) {
            String[] columns = {Helper.Row_Phone, Helper.Row_LastName,Helper.Row_FirstName,Helper.Row_PinYin,Helper.Row_School,Helper.Row_Address,Helper.Row_Other};  // &#x9700;&#x8981;&#x7684;&#x5217;
            String selection = null;    // &#x9009;&#x62E9;&#x6761;&#x4EF6;, &#x7ED9;null&#x67E5;&#x8BE2;&#x6240;&#x6709;
            String[] selectionArgs = null;  // &#x9009;&#x62E9;&#x6761;&#x4EF6;&#x7684;&#x53C2;&#x6570;, &#x4F1A;&#x628A;&#x9009;&#x62E9;&#x6761;&#x4EF6;&#x4E2D;&#x7684;? &#x66FF;&#x6362;&#x6210;&#x6570;&#x636E;&#x4E2D;&#x7684;&#x503C;
            String groupBy = null;  // &#x5206;&#x7EC4;&#x8BED;&#x53E5;  group by name
            String having = null;   // &#x8FC7;&#x6EE4;&#x8BED;&#x53E5;
            String orderBy = null;  // &#x6392;&#x5E8F;
            Cursor cursor = DB.query(Helper.TableName, columns, selection, selectionArgs, groupBy, having, orderBy);
            String last;
            String first;
            String pinyin;
            String phone;
            String school;
            String addr;
            String other;

            if(cursor != null && cursor.getCount() > 0) {
                List<news> news = new ArrayList<news>();
                while(cursor.moveToNext()) {
                    last = cursor.getString(cursor.getColumnIndex( Helper.Row_LastName ));
                    first = cursor.getString(cursor.getColumnIndex( Helper.Row_FirstName ));
                    phone = cursor.getString(cursor.getColumnIndex( Helper.Row_Phone));
                    pinyin = cursor.getString(cursor.getColumnIndex( Helper.Row_PinYin));
                    school = cursor.getString(cursor.getColumnIndex(Helper.Row_School));
                    addr = cursor.getString(cursor.getColumnIndex( Helper.Row_Address ));
                    other = cursor.getString( cursor.getColumnIndex( Helper.Row_Other ) );
                    news.add(new News(last,first,pinyin,phone,school,addr,other));
                }
                DB.close();
                return news;
            }
            if (cursor != null) {
                cursor.close();
            }
            DB.close();
        }
        return null;
    }
</news></news></news>

滚动条

请移步另外一篇博客

联系人分组

 private void InitContacts(){
        newsList = dao.QueryAll();
        RemoveAll();
        String curGroup = "0";
        ArrayList<string> indexList = new ArrayList<>();
        if (newsList != null){
            for (int i = 0; i <newslist.size() ; i++) { contactsinfo info="new" contactsinfo(newslist.get(i).getlastname()+newslist.get(i).getfirstname(),newslist.get(i).getpinyin(),newslist.get(i).getphonenumber(),false,false); if (!info.getgroup().equals(curgroup)) group 信息与保存的不一致, 那么就是该 的第一个 info.setisfirstingroup(true); 同时将该 信息添加到索引中 indexlist.add(info.getgroup()); 它的上一个城市就是上一个 的最后一个 (i> 0) {
                        contactsInfoList.get(contactsInfoList.size() - 1).setIsLastInGroup(true);
                    }
                    curGroup = info.getGroup();
                }
                contactsInfoList.add(info);
            }
        }
    }
</newslist.size()></string>

数据库数据与滚动条绑定

      SideBar.setOnTouchLetterChangedListener(new SideBar.OnTouchingLetterChangedListener() {
            @Override
            public void onTouchingLetterChanged(String s) {
                int position = Adapter.getPositionForSection(s.charAt(0));
                if (position != -1) {
                    manager.scrollToPositionWithOffset(position, 0);
                }
            }
        });

添加联系人

效果图

Android——一个神奇的通讯录APP

; 添加紧急电话联系人

一开始添加紧急联系人的好处有两点:

  1. 救命稻草,时期必有急用!!!
  2. 防止数据库为空,避免尚未添加联系人时RecyclerView为空
数据源
public class Emergency {
   //lastname firstname &#x62FC;&#x97F3; tel
    public static final String[][] PoliceTel = {
            {"&#x516C;&#x5B89;","&#x62A5;&#x8B66;&#x7535;&#x8BDD;","gongan","110"},
           {"&#x706B;&#x8B66;","&#x62A5;&#x8B66;&#x7535;&#x8BDD;","huojing","119"},
           {"&#x6025;&#x6551;&#x4E2D;&#x5FC3;","&#x7535;&#x8BDD;","jijiu","120"},
           {"&#x4EA4;&#x901A;&#x4E8B;&#x6545;","&#x62A5;&#x8B66;&#x7535;&#x8BDD;","jiaotong","122"}};
}
添加
//    &#x6DFB;&#x52A0;&#x7D27;&#x6025;&#x62A5;&#x8B66;&#x7535;&#x8BDD;
    private void AddEmergency(){
        try {
            newsList = dao.QueryAll();
        }catch (NullPointerException e){
            for (int i = 0; i < 4; i++) {
                dao.Insert(new News(Emergency.PoliceTel[i][0],Emergency.PoliceTel[i][1],Emergency.PoliceTel[i][2],Emergency.PoliceTel[i][3],"-","-","-"));
            }
        }
    }

新增

对用户输入的数据进行一下判断,然后对数据库进行插入操作。返回主界面后,对适配器进行一个刷新即可显示

private void AddContacts(){
        String lastname = LastName.getText().toString();
        String firstname = FirstName.getText().toString();
        String pinyin = ChatExchange.getInstance().getPinyin(lastname+firstname);
        String phone = PhoneNumber.getText().toString();
        String school = School.getText().toString();
        String addr = Address.getText().toString();
        String other = Other.getText().toString();
        if (TextUtils.isEmpty(lastname)){
            Tips.setText("&#x59D3;&#x6C0F;&#x4E0D;&#x80FD;&#x4E3A;&#x7A7A;");
            Error.show();
            return;
        }
        if (TextUtils.isEmpty(firstname)){
            Tips.setText("&#x540D;&#x5B57;&#x4E0D;&#x80FD;&#x4E3A;&#x7A7A;");
            Error.show();
            return;
        }
        if (TextUtils.isEmpty(phone)){
            Tips.setText("&#x624B;&#x673A;&#x53F7;&#x7801;&#x4E0D;&#x80FD;&#x4E3A;&#x7A7A;");
            Error.show();
            return;
        }
        if (newsList != null){
            for (int i = 0; i <newslist.size() ; i++) { if (phone.equals(newslist.get(i).getphonenumber())){ tips.settext("该手机号码已被绑定"); return; } news news(lastname,firstname,pinyin,phone,school="=" null ? " ":school,addr="=" ":addr,other="=" ":other); dao.insert(news); tips.settext("插入成功"); error.show(); < code></newslist.size()>

编辑与查看联系人

查看

效果图

Android——一个神奇的通讯录APP
; 大图姓氏

姓氏背景是一个渐变色xml文件

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <gradient android:startcolor="#BDB8B8" android:endcolor="#E97878">
</gradient></shape>

姓氏通过截取LastName字段的第一个元素,大部分LastName为一个字,单避免复姓以及乱输入等情况,就截取第一个字符。姓名就结合LastName和FirstName

 LastName.setText(newsList.get(i).getLastName().substring(0,1));
Name.setText(newsList.get(i).getLastName()+newsList.get(i).getFirstName());
数据收发

在联系人总览界面跳转联系人详情界面时,对RecyclerView子项进行点击事件监听,并将此子项的手机号码一并传输

    private void Listener(){
        Adapter.setOnclick(new AllManAdapter.OnClick() {
            @Override
            public void OnClickListener(View view, int Position) {
                Intent intent = new Intent(ContactsActivity.this,DetailsActivity.class);
                String Phone = contactsInfoList.get(Position).getCityID();
                intent.putExtra("PhoneNumber",Phone);
                startActivity(intent);
            }
        });
    }

从主界面获取intent携带的数据,并以此为索引,遍历数据库,获取与它相关行的所有数据

PhoneNumber = getIntent().getStringExtra("PhoneNumber");
        if (!TextUtils.isEmpty(PhoneNumber)){
            Phone.setText(PhoneNumber);
        }
try{
            newsList = dao.QueryAll();
        }catch (NullPointerException e){
            e.printStackTrace();
        }
        if (newsList != null){
            for (int i = 0; i <newslist.size() ; i++) { if (phonenumber.equals(newslist.get(i).getphonenumber())){ address.settext(newslist.get(i).getaddress()); school.settext(newslist.get(i).getschool()); note.settext(newslist.get(i).getother()); lastname.settext(newslist.get(i).getlastname().substring(0,1)); name.settext(newslist.get(i).getlastname()+newslist.get(i).getfirstname()); } < code></newslist.size()>

编辑及删除

Android——一个神奇的通讯录APP

编辑 点击编辑按钮之后,对一些EditText进行解封,以便用户可以进行编辑 `

public void OtherThings(View view){
    count++;
    if (count %2 == 0){
        //&#x7F16;&#x8F91;&#x72B6;&#x6001;
        UnLock();
        EditMessage.setText("&#x5B8C;&#x6210;");
    }else {
        //&#x6B63;&#x5E38;&#x72B6;&#x6001;
        Lock();
        UpdateSQL();
        EditMessage.setText("&#x7F16;&#x8F91;");
    }
}

最后将用户修改的数据以手机号码为媒介对数据库进行更新操作

    private void UpdateSQL(){
        String addr = Address.getText().toString();
        String school = School.getText().toString();
        String node = Note.getText().toString();
        dao.Update(PhoneNumber,school,addr,node);
    }
删除

直接以手机号码为媒介对数据库该行进行删除操作即可

dao.Delete(PhoneNumber);

拨号

申请权限

静态申请

<uses-permission android:name="android.permission.CALL_PHONE">
</uses-permission>

动态申请

 if (ActivityCompat.checkSelfPermission(DetailsActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(DetailsActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
                    startActivity(intent);
                    return;
                }
隐式Intent
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + PhoneNumber));
startActivity(intent);

Original: https://blog.csdn.net/News53231323/article/details/123559270
Author: FranzLiszt1847
Title: Android——一个神奇的通讯录APP

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/816831/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球