实验六 Android Studio SQLite数据存储和访问【班级名单列表视图02】

一、实验目的

SQLite数据存储和访问。

二、实验内容

将班级名单以SQLite的方式保存在本地
1. 每个列表项包含:学号和姓名,电话;
2. 可以删除列表项,添加列表项(数据更新到SQLite数据库);
3. 可以读取联系人(使用内容提供者),将联系人的名字和电话号码读入到名单列表并插入数据库;
4. 支持在新的页面中学号和姓名,电话。

三、结构搭建

四、代码实现

AndroidManifest.xml


build.gradle

implementation 'androidx.recyclerview:recyclerview:1.0.0'

实验六 Android Studio SQLite数据存储和访问【班级名单列表视图02】

activity_main.xml


fragment_list.xml


list_item_layout.xml


FragmentList

package com.suke.recyclerstudentsqlite;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.nfc.Tag;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class FragmentList extends Fragment {

    //控制台打印提示
    private final String TagCreate = "create";
    private final String TagDelete = "delete";
    //创建学生信息列表
    private List dataStu = new ArrayList<>();
    //学号、姓名、手机号
    private EditText editId;
    private EditText editName;
    private EditText editTel;
    //头像
    private ImageView imageView;
    //添加学生信息按钮
    private Button btnCommit;
    //添加通讯录联系人信息
    private Button btnGetPhoneInfo;
    //RecyclerView的工具类
    private StudentAdapter studentAdapter;
    //学生信息视图列表
    private RecyclerView rcvStu;
    //数据库读写
    SQLiteDatabase readableDatabase;
    SQLiteDatabase writableDatabase;
    ContentValues values;

    /*String[] ids = new String[]{"19200135221", "19200135222", "19200135223", "19200135224", "19200135225", "19200135226"};
    String[] names = new String[]{"书启秋枫", "Gaze", "无羡", "阿斌", "家和万事兴", "Suk"};
    String[] tels = new String[]{"15312133001", "153121330012", "153121330013", "153121330014", "153121330015", "153121330016"};*/
    //数组存图片
    int[] images = new int[]{R.drawable.ls, R.drawable.cc, R.drawable.mr, R.drawable.zb, R.drawable.zjh, R.drawable.lishuo};

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        check();
    }

    //检查获取通讯录权限
    private void check() {
        //判断是否有权限
        if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_CONTACTS}, 201);
        } else {
            return;
        }
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //1.获取fragment_list视图
        View view = inflater.inflate(R.layout.fragment_list, container, false);
        //2.初始化视图
        initView(view);
        //3.初始化数据
        initData();
        //4.返回视图
        return view;
    }

    //刷新学生列表
    public void refreshList() {
        //清空学生列表
        dataStu.clear();
        //cursor游标读取数据库内容
        Cursor cursor = readableDatabase.query("students", null, null, null, null, null, null);
        //游标获取学生学号、姓名、手机号、图片号
        while (cursor.moveToNext()) {
            @SuppressLint("Range") String stu_id = cursor.getString(cursor.getColumnIndex("stu_id"));
            @SuppressLint("Range") String stu_name = cursor.getString(cursor.getColumnIndex("stu_name"));
            @SuppressLint("Range") String stu_tel = cursor.getString(cursor.getColumnIndex("stu_tel"));
            @SuppressLint("Range") Integer stu_image = cursor.getInt(cursor.getColumnIndex("stu_image"));
            dataStu.add(new Student(stu_id, stu_name, stu_tel, stu_image));
        }
    }

    //2.初始化视图
    private void initView(View view) {
        editId = view.findViewById(R.id.edit_id);
        editName = view.findViewById(R.id.edit_name);
        editTel = view.findViewById(R.id.edit_tel);
        btnCommit = view.findViewById(R.id.btn_commit);
        imageView = view.findViewById(R.id.image_stu);
        rcvStu = view.findViewById(R.id.rcv_stu);
        btnGetPhoneInfo = view.findViewById(R.id.btn_getPhone);

        //设置 recyclerview 显示布局
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
        rcvStu.setLayoutManager(linearLayoutManager);

    }

    //3.初始化数据
    private void initData() {
        //创建数据库 Student.db
        SQLiteOpenHelper helper = MySqlite.getInstance(getContext());
        //只有执行下面才能创建出数据库和表 students
        writableDatabase = helper.getWritableDatabase();
        readableDatabase = helper.getReadableDatabase();
        //刷新学生列表获取学生数据库信息
        refreshList();

        //选择随机头像
        final int[] random = {0};
        imageView.setOnClickListener(v -> {
            random[0] = new Random().nextInt(6);
            imageView.setImageResource(images[random[0]]);
        });

        //获取通讯录联系人信息
        btnGetPhoneInfo.setOnClickListener(v -> {
            PhoneInfo phoneInfo = new PhoneInfo(getContext());
            dataStu = phoneInfo.getPhone();
            String id = editId.getText().toString();
            //根据id序号查找联系人信息并写入文本框中
            for (Student s : dataStu) {
                if (id.equals(s.getSno())) {
                    editName.setText(s.getSname());
                    editTel.setText(s.getStele());
                } else {
                    Toast.makeText(getContext(), "学号错误!无法找到该联系人", Toast.LENGTH_SHORT).show();
                }
            }
        });

        //添加学生信息(lambda表达式)
        btnCommit.setOnClickListener(v -> {
            String id = editId.getText().toString();
            String name = editName.getText().toString();
            String tel = editTel.getText().toString();
            //向数据表 添加学生信息
            values = new ContentValues();
            values.put("stu_id", id);
            values.put("stu_name", name);
            values.put("stu_tel", tel);
            values.put("stu_image", random[0]);
            if (writableDatabase.insert("students", null, values) > 0) {
                refreshList();
                Toast.makeText(getContext(), "创建成功!", Toast.LENGTH_SHORT).show();
                Log.e(TagCreate, "学生创建成功");
                //将添加学生信息处置空
                editId.setText("");
                editName.setText("");
                editTel.setText("");
                studentAdapter.notifyDataSetChanged();
            }

        });
        studentAdapter = new StudentAdapter();
        rcvStu.setAdapter(studentAdapter);
    }

    private class StudentAdapter extends RecyclerView.Adapter {

        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = View.inflate(getContext(), R.layout.list_item_layout, null);
            return new MyViewHolder(view);
        }

        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
            holder.tvId.setText(dataStu.get(position).getSno());
            holder.tvName.setText(dataStu.get(position).getSname());
            holder.tvTel.setText(dataStu.get(position).getStele());
            holder.imageView.setImageResource(images[dataStu.get(position).getImageId()]);

            //拨打电话(隐式调用)
            holder.btnCall.setOnClickListener(v -> {
                String tel = dataStu.get(position).getStele();
                //传入两个参数(一个是拨号盘,一个是电话号)
                Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + tel));
                //实例化之后startActivity执行
                startActivity(intent);
            });

            //切换随机头像
            holder.imageView.setOnClickListener(v -> {
                Random random = new Random();
                holder.imageView.setImageResource(images[random.nextInt(6)]);
            });

            //删除学生信息
            holder.btnDelete.setOnClickListener(v -> {
                //数据库删除学生信息
                writableDatabase.delete("students", "stu_id=?", new String[]{(dataStu.get(position).getSno())});
                Toast.makeText(getContext(), "删除成功!", Toast.LENGTH_SHORT).show();
                dataStu.remove(position);
                studentAdapter.notifyDataSetChanged();
                Log.e(TagDelete, "学生已删除");
            });
        }

        //RecyclerView视图列表展示数量
        @Override
        public int getItemCount() {
            //判断是否为空
            return dataStu == null ? 0 : dataStu.size();
        }

        public class MyViewHolder extends RecyclerView.ViewHolder {
            //学号、姓名、手机号
            private TextView tvId;
            private TextView tvName;
            private TextView tvTel;
            //学生头像
            private ImageView imageView;
            //拨打电话
            private Button btnCall;
            //删除学生
            private ImageButton btnDelete;

            public MyViewHolder(@NonNull View itemView) {
                super(itemView);
                tvId = itemView.findViewById(R.id.tv_id);
                tvName = itemView.findViewById(R.id.tv_name);
                tvTel = itemView.findViewById(R.id.tv_tel);
                imageView = itemView.findViewById(R.id.imageView);
                btnCall = itemView.findViewById(R.id.btn_call);
                btnDelete = itemView.findViewById(R.id.btn_delete);
            }
        }
    }
}

MainActivity

package com.suke.recyclerstudentsqlite;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FragmentManager fm = getSupportFragmentManager();
        Fragment fragment = fm.findFragmentById(R.id.fragment_list);
        if (fragment == null) {
            fragment = new FragmentList();
            fm.beginTransaction()
                    .add(R.id.fragment_list, fragment)
                    .commit();
        }
    }
}

MySqlite


package com.suke.recyclerstudentsqlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

import androidx.annotation.Nullable;

/*
 * MySqlite 工具类  单例模式(1.构造函数私有化  2.对外提供函数)
 * */

public class MySqlite extends SQLiteOpenHelper {

    //2.对外提供函数
    private static SQLiteOpenHelper mInstance;

    public static synchronized SQLiteOpenHelper getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new MySqlite(context, "Student.db", null, 1);
        }
        return mInstance;
    }

    //1.构造函数私有化
    public MySqlite(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    /*
     * 数据初始化时使用的
     * 创建表   表数据初始化  数据库第一次创建的时候调用
     * 第二次发现表已存在 就不会重复创建了: 意味着此函数只会执行一次
     * */

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String sql = "CREATE TABLE IF NOT EXISTS students (" +
                "stu_id TEXT PRIMARY KEY, " +
                "stu_name TEXT, " +
                "stu_tel TEXT," +
                "stu_image INTEGER" +
                ")";
        sqLiteDatabase.execSQL(sql);
    }

    //数据库升级用的
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

PhoneInfo

package com.suke.recyclerstudentsqlite;

import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;

import java.util.ArrayList;
import java.util.List;

public class PhoneInfo {
    //序号
    public final static String ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID;
    //号码
    public final static String NUM = ContactsContract.CommonDataKinds.Phone.NUMBER;
    //联系人姓名
    public final static String NAME = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME;

    //上下文对象
    private Context context;
    //联系人提供者的uri
    private Uri phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

    public PhoneInfo(Context context) {
        this.context = context;
    }

    //获取所有联系人
    public List getPhone() {
        List dataStu = new ArrayList<>();
        ContentResolver cr = context.getContentResolver();
        Cursor cursor = cr.query(phoneUri, new String[]{ID, NUM, NAME}, null, null, null);
        while (cursor.moveToNext()) {
            @SuppressLint("Range") Student student = new Student(cursor.getString(cursor.getColumnIndex(ID)), cursor.getString(cursor.getColumnIndex(NAME)), cursor.getString(cursor.getColumnIndex(NUM)));
            dataStu.add(student);
        }
        return dataStu;
    }
}

Student

package com.suke.recyclerstudentsqlite;

public class Student {
    private String Sno;
    private String Sname;
    private String Stele;
    private int imageId;

    public Student() {
    }

    public Student(String sno, String sname, String stele) {
        Sno = sno;
        Sname = sname;
        Stele = stele;
    }

    public Student(String sno, String sname, String stele, int imageId) {
        Sno = sno;
        Sname = sname;
        Stele = stele;
        this.imageId = imageId;
    }

    public String getSno() {
        return Sno;
    }

    public void setSno(String sno) {
        Sno = sno;
    }

    public String getSname() {
        return Sname;
    }

    public void setSname(String sname) {
        Sname = sname;
    }

    public String getStele() {
        return Stele;
    }

    public void setStele(String stele) {
        Stele = stele;
    }

    public int getImageId() {
        return imageId;
    }

    public void setImageId(int imageId) {
        this.imageId = imageId;
    }
}

五、运行结果

实验六 Android Studio SQLite数据存储和访问【班级名单列表视图02】

实验六 Android Studio SQLite数据存储和访问【班级名单列表视图02】

实验六 Android Studio SQLite数据存储和访问【班级名单列表视图02】

实验六 Android Studio SQLite数据存储和访问【班级名单列表视图02】

实验六 Android Studio SQLite数据存储和访问【班级名单列表视图02】

Original: https://blog.csdn.net/qq_45037155/article/details/124926017
Author: 书启秋枫
Title: 实验六 Android Studio SQLite数据存储和访问【班级名单列表视图02】

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

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

(0)

大家都在看

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