Android : Room 数据库的基本用法 —简单应用_一_入门

打印 上一主题 下一主题

主题 574|帖子 574|积分 1722

1.Room先容:

Android Room 是 Android 官方提供的一个长期性库,用于在 Android 应用程序中管理数据库。它提供了一个简单的 API 层,使得使用 SQLite 数据库变得更加容易和方便。
以下是 Android Room 的主要特点:

  • 对象关系映射 (ORM):Room 答应您将 Java 或 Kotlin 对象映射到数据库表中。您可以定义数据模子并使用注解来定义关系和约束。
  • 事件管理:Room 提供了事件管理的功能,可以确保数据的完备性和同等性。它还支持主动提交和回滚机制,雷同于 JDBC 中的事件管理。
  • 数据库抽象:Room 提供了一个抽象层,使得您可以使用简单的 API 来执行 SQL 查询和操作数据库。您不必要编写手动的 SQL 语句,而是使用 Java 或 Kotlin 的查询 API。
  • 同步和异步操作:Room 支持同步和异步操作,使得您可以轻松地在背景线程中执行数据库操作,以制止阻塞主线程。
  • 数据库迁移:当您的应用程序更新时,可能必要更改数据库模式。Room 可以主动处理惩罚迁移过程,确保数据的同等性和完备性。
  • 并发支持:Room 支持多线程并发操作,可以有效地处理惩罚多个并发哀求。
  • 嵌入式数据库:Room 支持嵌入式数据库,这意味着您可以将数据库文件嵌入到您的应用程序中,而不必要单独安装和管理 SQLite 数据库。
  • 支持跨平台:除了 Android 平台,Room 还支持 iOS 和桌面应用程序。
总之,Android Room 是一个功能强盛的长期性库,使得管理 SQLite 数据库变得更加简单和方便。它提供了一个对象关系映射层、事件管理、数据库抽象等功能,可以资助您更轻松地构建和管理 Android 应用程序中的数据库。

2.Room使用:

使用教程: Room  |  Jetpack  |  Android Developers
开发文档:androidx.room  |  Android Developers
1.导入依赖:在build.gradle文件中加入

  1. dependencies {
  2.         //Room
  3.         def room_version = "2.5.0"
  4.         implementation "androidx.room:room-runtime:$room_version"
  5.         annotationProcessor "androidx.room:room-compiler:$room_version"
  6. }
复制代码
2.创建实体类 People.java

  1. package com.example.myroom.entity;
  2. import androidx.room.ColumnInfo;
  3. import androidx.room.Entity;
  4. import androidx.room.PrimaryKey;
  5. //实体类 表名 不写默认内名首字母小写 people
  6. @Entity(tableName = "people")
  7. public class People {
  8.     //主键 自动生成
  9.     @PrimaryKey(autoGenerate = true)
  10.     private int id;
  11.     //列的名称
  12.     @ColumnInfo(name = "user_name")
  13.     private String name;
  14.     //不写默认列的名称为age,sex
  15.     private int age;
  16.     private String sex;
  17.     public People(String name, int age, String sex) {
  18.         this.name = name;
  19.         this.age = age;
  20.         this.sex = sex;
  21.     }
  22.     public void setId(int id) {
  23.         this.id = id;
  24.     }
  25.     public int getId() {
  26.         return id;
  27.     }
  28.     public String getName() {
  29.         return name;
  30.     }
  31.     public void setName(String name) {
  32.         this.name = name;
  33.     }
  34.     public int getAge() {
  35.         return age;
  36.     }
  37.     public void setAge(int age) {
  38.         this.age = age;
  39.     }
  40.     public String getSex() {
  41.         return sex;
  42.     }
  43.     public void setSex(String sex) {
  44.         this.sex = sex;
  45.     }
  46. }
复制代码
3.创建一个接口Dao  PeopleDao.java

  1. package com.example.myroom.dao;
  2. import androidx.room.Dao;
  3. import androidx.room.Delete;
  4. import androidx.room.Insert;
  5. import androidx.room.Query;
  6. import androidx.room.Update;
  7. import com.example.myroom.entity.People;
  8. import java.util.List;
  9. //dao database access object 接口 处理数据库的方法签名
  10. @Dao
  11. public interface PeopleDao {
  12.     //添加  传递一个参数 对象
  13.     @Insert
  14.     void insertDataOne(People people);
  15.     //添加  可以传递多个参数 对象
  16.     @Insert
  17.     void insertDataS(People... people);
  18.     //删除
  19.     @Delete
  20.     int deleteDataS(People... people);
  21.     //修改 传入对象 设置 id 进行修改某一个
  22.     @Update
  23.     int updateData(People... people);
  24.     //查询 根据id倒序
  25.     @Query("select * from people order by id desc")
  26.     List<People> getPeoples();
  27.     //根据id查询
  28.     @Query("select * from people where id =:numb")
  29.     People getPeople(Integer numb);
  30.     //删除表数据
  31.     @Query("delete from people")
  32.     void deleteTableData();
  33. }
复制代码
4.写个抽象类继承RoodDatabase
  1. package com.example.myroom.dao;
  2. import androidx.room.Database;
  3. import androidx.room.RoomDatabase;
  4. import com.example.myroom.entity.People;
  5. //抽象类 继承 RoomDatabase      我们不用实现people中的方法
  6. // version = 1 数据库版本,exportSchema = false不允许导出数据库的架构
  7. @Database(entities = {People.class}, version = 1, exportSchema = false)
  8. public abstract class PeopleDataBase extends RoomDatabase {
  9.     /**
  10.      * Java 抽象类的一些特点
  11.      * 不能被实例化:抽象类不能被实例化,因为它没有具体的实现细节。它只能被继承,并且子类必须实现抽象类中的所有抽象方法。
  12.      * 包含抽象方法:抽象类可以包含抽象方法,这些方法只有声明但没有实现。子类必须实现这些抽象方法,否则它也必须被声明为抽象类。
  13.      * 提供通用功能和行为:抽象类提供了一些通用功能和行为,这些功能和行为可以被其子类继承和重用。子类可以根据需要扩展这些功能和行为,或者重写它们以提供不同的实现。
  14.      * 用于设计高层次的抽象:抽象类可以用于表示一个高层次的抽象概念或者一个通用模板,使得代码更加模块化和可维护。通过将一些公共方法和行为提取到一个抽象类中,可以避免在多个子类中重复实现相同的功能。
  15.      * 扩展性:抽象类可以定义一些扩展的接口,子类可以选择实现这些接口来提供额外的功能。这使得抽象类具有很好的扩展性,可以根据需要添加新的功能和行为
  16.      */
  17. /*
  18.     public abstract PeopleDao peopleDao();
  19. }
复制代码
4.MainActivity.java

  1. package com.example.myroom;
  2. import android.os.Bundle;
  3. import android.util.Log;
  4. import android.view.View;
  5. import android.widget.Button;
  6. import android.widget.EditText;
  7. import android.widget.TextView;
  8. import androidx.appcompat.app.AppCompatActivity;
  9. import androidx.room.Room;
  10. import com.example.myroom.dao.PeopleDao;
  11. import com.example.myroom.dao.PeopleDataBase;
  12. import com.example.myroom.entity.People;
  13. import java.util.List;
  14. public class MainActivity extends AppCompatActivity {
  15.     PeopleDataBase DB;
  16.     private Button btnInsert, btnDelete, btnUpdate, btnSelect, btnDeleteData;
  17.     private TextView textContent;
  18.     private EditText etName, etAge, etSex, etSelect, etDelete, etUpdate;
  19.     @Override
  20.     protected void onCreate(Bundle savedInstanceState) {
  21.         super.onCreate(savedInstanceState);
  22.         setContentView(R.layout.activity_main);
  23.         
  24.         DB = Room.databaseBuilder(this, PeopleDataBase.class, "peopleDB")
  25.                 // 默认不允许在主线程中连接数据库   强制在主线程中处理
  26.                 .allowMainThreadQueries()
  27.                 .build();
  28.         textContent = findViewById(R.id.tvcontent);
  29.         etName = findViewById(R.id.etName);
  30.         etAge = findViewById(R.id.etAge);
  31.         etSex = findViewById(R.id.etSex);
  32.         etSelect = findViewById(R.id.etSelect);
  33.         etDelete = findViewById(R.id.etDelete);
  34.         etUpdate = findViewById(R.id.etUpdate);
  35.         btnInsert = findViewById(R.id.btnSave);
  36.         btnDelete = findViewById(R.id.btnDelete);
  37.         btnUpdate = findViewById(R.id.btnUpdate);
  38.         btnSelect = findViewById(R.id.btnselect);
  39.         btnDeleteData = findViewById(R.id.btnDeleteTB);
  40.         //查询数据
  41.         selectData(null);
  42.         //按钮事件 插入数据
  43.         btnInsert.setOnClickListener(new View.OnClickListener() {
  44.             @Override
  45.             public void onClick(View v) {
  46.                 //插入数据 防止空
  47.                 String name = etName.getText().toString().equals("") ? "张三" : etName.getText().toString();
  48.                 int age = etAge.getText().toString().equals("") ? 20 : Integer.parseInt(etAge.getText().toString());
  49.                 String sex = etSex.getText().toString().equals("") ? "男" : etSex.getText().toString();
  50.                 People people = new People(name, age, sex);
  51.                 DB.peopleDao().insertDataS(people);
  52.                 //查询数据
  53.                 selectData(null);
  54.             }
  55.         });
  56.         //修改数据
  57.         btnUpdate.setOnClickListener(new View.OnClickListener() {
  58.             @Override
  59.             public void onClick(View v) {
  60.                 //修改
  61.                 int id = etUpdate.getText().toString().equals("") ? 0 : Integer.parseInt(etUpdate.getText().toString());
  62.                 if (id != 0) {
  63.                     String name = etName.getText().toString();
  64.                     int age = Integer.parseInt(etAge.getText().toString());
  65.                     String sex = etSex.getText().toString();
  66.                     People people = new People(name, age, sex);
  67.                     people.setId(id);
  68.                     DB.peopleDao().updateData(people);
  69.                     //查询
  70.                     selectData(null);
  71.                 }
  72.             }
  73.         });
  74.         //删除
  75.         btnDelete.setOnClickListener(new View.OnClickListener() {
  76.             @Override
  77.             public void onClick(View v) {
  78.                 int id = etDelete.getText().toString().equals("") ? 0 : Integer.parseInt(etDelete.getText().toString());
  79.                 if (id != 0) {
  80.                     People people = new People();
  81.                     people.setId(id);
  82.                     DB.peopleDao().deleteDataS(people);
  83.                     //查询
  84.                     selectData(null);
  85.                 }
  86.             }
  87.         });
  88.         //根据id 查数据
  89.         btnSelect.setOnClickListener(new View.OnClickListener() {
  90.             @Override
  91.             public void onClick(View v) {
  92.                 int id = etSelect.getText().toString().equals("") ? 0 : Integer.parseInt(etSelect.getText().toString());
  93.                 if (id != 0) {
  94.                     selectData(id);
  95.                 }
  96.             }
  97.         });
  98.         //删除全部数据
  99.         btnDeleteData.setOnClickListener(new View.OnClickListener() {
  100.             @Override
  101.             public void onClick(View v) {
  102.                 DB.peopleDao().deleteTableData();
  103.             }
  104.         });
  105.     }
  106.     /**
  107.      * 查询数据的方法
  108.      */
  109.     public void selectData(Integer id) {
  110.         try {
  111.             StringBuilder text = new StringBuilder();
  112.             if (id == null || id == 0) {
  113.                 List<People> peopleList = DB.peopleDao().getPeoples();
  114.                 if (peopleList.size() != 0) {
  115.                     for (int i = 0; i < peopleList.size(); i++) {
  116.                         People people = peopleList.get(i);
  117.                         text.append("id:")
  118.                                 .append(people.getId())
  119.                                 .append("---name:")
  120.                                 .append(people.getName())
  121.                                 .append("---age:")
  122.                                 .append(people.getAge())
  123.                                 .append("---sex:")
  124.                                 .append(people.getSex())
  125.                                 .append("\n");
  126.                     }
  127.                 } else {
  128.                     text.append("没有可用的数据");
  129.                 }
  130.             } else {
  131.                 People people = DB.peopleDao().getPeople(id);
  132.                 text.append("id:")
  133.                         .append(people.getId())
  134.                         .append("---name:")
  135.                         .append(people.getName())
  136.                         .append("---age:")
  137.                         .append(people.getAge())
  138.                         .append("---sex:")
  139.                         .append(people.getSex());
  140.             }
  141.             textContent.setText(text.toString());
  142.         } catch (Exception e) {
  143.             Log.e("TAG", "----查询失败------------" + e.getMessage());
  144.         }
  145.     }
  146. }
复制代码
5.布局文件 activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     tools:context=".MainActivity">
  8.     <Button
  9.         android:id="@+id/btnUpdate"
  10.         android:layout_width="wrap_content"
  11.         android:layout_height="wrap_content"
  12.         android:text="修改"
  13.         app:layout_constraintBottom_toBottomOf="@+id/etUpdate"
  14.         app:layout_constraintEnd_toStartOf="@+id/guideline10"
  15.         app:layout_constraintHorizontal_bias="0.5"
  16.         app:layout_constraintStart_toEndOf="@+id/etUpdate"
  17.         app:layout_constraintTop_toTopOf="@+id/etUpdate"
  18.         app:layout_constraintVertical_bias="0.0" />
  19.     <androidx.constraintlayout.widget.Guideline
  20.         android:id="@+id/guideline2"
  21.         android:layout_width="wrap_content"
  22.         android:layout_height="wrap_content"
  23.         android:orientation="horizontal"
  24.         app:layout_constraintGuide_percent="0.05" />
  25.     <TextView
  26.         android:id="@+id/textView"
  27.         android:layout_width="match_parent"
  28.         android:layout_height="0dp"
  29.         android:text="Room简单应用:"
  30.         android:textSize="24sp"
  31.         app:layout_constraintBottom_toTopOf="@+id/guideline2"
  32.         app:layout_constraintEnd_toEndOf="parent"
  33.         app:layout_constraintStart_toStartOf="parent"
  34.         app:layout_constraintTop_toTopOf="parent" />
  35.     <Button
  36.         android:id="@+id/btnSave"
  37.         android:layout_width="wrap_content"
  38.         android:layout_height="wrap_content"
  39.         android:layout_marginTop="4dp"
  40.         android:text="保存"
  41.         app:layout_constraintBottom_toTopOf="@+id/guideline9"
  42.         app:layout_constraintEnd_toStartOf="@+id/guideline10"
  43.         app:layout_constraintHorizontal_bias="0.203"
  44.         app:layout_constraintStart_toStartOf="@+id/guideline5"
  45.         app:layout_constraintTop_toTopOf="@+id/guideline4" />
  46.     <Button
  47.         android:id="@+id/btnDelete"
  48.         android:layout_width="wrap_content"
  49.         android:layout_height="wrap_content"
  50.         android:text="删除"
  51.         app:layout_constraintBottom_toBottomOf="@+id/etDelete"
  52.         app:layout_constraintEnd_toStartOf="@+id/guideline10"
  53.         app:layout_constraintHorizontal_bias="0.5"
  54.         app:layout_constraintStart_toEndOf="@+id/etDelete"
  55.         app:layout_constraintTop_toTopOf="@+id/etDelete" />
  56.     <Button
  57.         android:id="@+id/btnselect"
  58.         android:layout_width="wrap_content"
  59.         android:layout_height="wrap_content"
  60.         android:text="查询"
  61.         app:layout_constraintBottom_toBottomOf="@+id/etSelect"
  62.         app:layout_constraintEnd_toStartOf="@+id/guideline10"
  63.         app:layout_constraintHorizontal_bias="0.5"
  64.         app:layout_constraintStart_toEndOf="@+id/etSelect"
  65.         app:layout_constraintTop_toTopOf="@+id/etSelect" />
  66.     <Button
  67.         android:id="@+id/btnDeleteTB"
  68.         android:layout_width="wrap_content"
  69.         android:layout_height="wrap_content"
  70.         android:layout_marginTop="4dp"
  71.         android:text="删除表数据"
  72.         app:layout_constraintBottom_toTopOf="@+id/guideline9"
  73.         app:layout_constraintEnd_toStartOf="@+id/guideline10"
  74.         app:layout_constraintHorizontal_bias="0.873"
  75.         app:layout_constraintStart_toStartOf="@+id/guideline5"
  76.         app:layout_constraintTop_toTopOf="@+id/guideline4" />
  77.     <androidx.constraintlayout.widget.Guideline
  78.         android:id="@+id/guideline3"
  79.         android:layout_width="wrap_content"
  80.         android:layout_height="wrap_content"
  81.         android:orientation="horizontal"
  82.         app:layout_constraintGuide_percent="0.13" />
  83.     <androidx.constraintlayout.widget.Guideline
  84.         android:id="@+id/guideline4"
  85.         android:layout_width="wrap_content"
  86.         android:layout_height="wrap_content"
  87.         android:orientation="horizontal"
  88.         app:layout_constraintGuide_percent="0.29548565" />
  89.     <TextView
  90.         android:id="@+id/textView2"
  91.         android:layout_width="wrap_content"
  92.         android:layout_height="wrap_content"
  93.         android:text="姓名:"
  94.         android:textSize="24sp"
  95.         app:layout_constraintBottom_toTopOf="@+id/guideline3"
  96.         app:layout_constraintEnd_toStartOf="@+id/etName"
  97.         app:layout_constraintHorizontal_bias="0.5"
  98.         app:layout_constraintStart_toStartOf="@+id/guideline5" />
  99.     <EditText
  100.         android:id="@+id/etName"
  101.         android:layout_width="200dp"
  102.         android:layout_height="wrap_content"
  103.         android:ems="10"
  104.         android:hint="请输入"
  105.         android:inputType="text"
  106.         app:layout_constraintBottom_toBottomOf="@+id/textView2"
  107.         app:layout_constraintEnd_toStartOf="@+id/guideline10"
  108.         app:layout_constraintHorizontal_bias="0.5"
  109.         app:layout_constraintStart_toEndOf="@+id/textView2"
  110.         app:layout_constraintTop_toTopOf="@+id/textView2" />
  111.     <androidx.constraintlayout.widget.Guideline
  112.         android:id="@+id/guideline5"
  113.         android:layout_width="wrap_content"
  114.         android:layout_height="wrap_content"
  115.         android:orientation="vertical"
  116.         app:layout_constraintGuide_percent="0.05352798" />
  117.     <androidx.constraintlayout.widget.Guideline
  118.         android:id="@+id/guideline6"
  119.         android:layout_width="wrap_content"
  120.         android:layout_height="wrap_content"
  121.         android:orientation="horizontal"
  122.         app:layout_constraintGuide_percent="0.21" />
  123.     <androidx.constraintlayout.widget.Guideline
  124.         android:id="@+id/guideline8"
  125.         android:layout_width="wrap_content"
  126.         android:layout_height="wrap_content"
  127.         android:orientation="horizontal"
  128.         app:layout_constraintGuide_percent="0.6" />
  129.     <androidx.constraintlayout.widget.Guideline
  130.         android:id="@+id/guideline9"
  131.         android:layout_width="wrap_content"
  132.         android:layout_height="wrap_content"
  133.         android:orientation="horizontal"
  134.         app:layout_constraintGuide_percent="0.37" />
  135.     <TextView
  136.         android:id="@+id/textView3"
  137.         android:layout_width="wrap_content"
  138.         android:layout_height="wrap_content"
  139.         android:text="性别:"
  140.         android:textSize="24sp"
  141.         app:layout_constraintBottom_toTopOf="@+id/guideline6"
  142.         app:layout_constraintEnd_toStartOf="@+id/etSex"
  143.         app:layout_constraintHorizontal_bias="0.5"
  144.         app:layout_constraintStart_toStartOf="@+id/guideline5" />
  145.     <EditText
  146.         android:id="@+id/etSex"
  147.         android:layout_width="200dp"
  148.         android:layout_height="wrap_content"
  149.         android:ems="10"
  150.         android:hint="请输入"
  151.         android:inputType="text"
  152.         app:layout_constraintBottom_toBottomOf="@+id/textView3"
  153.         app:layout_constraintEnd_toStartOf="@+id/guideline10"
  154.         app:layout_constraintHorizontal_bias="0.5"
  155.         app:layout_constraintStart_toEndOf="@+id/textView3"
  156.         app:layout_constraintTop_toTopOf="@+id/textView3" />
  157.     <EditText
  158.         android:id="@+id/etAge"
  159.         android:layout_width="200dp"
  160.         android:layout_height="wrap_content"
  161.         android:ems="10"
  162.         android:hint="请输入"
  163.         android:inputType="number"
  164.         app:layout_constraintBottom_toBottomOf="@+id/textView4"
  165.         app:layout_constraintEnd_toStartOf="@+id/guideline10"
  166.         app:layout_constraintHorizontal_bias="0.5"
  167.         app:layout_constraintStart_toEndOf="@+id/textView4"
  168.         app:layout_constraintTop_toTopOf="@+id/textView4" />
  169.     <TextView
  170.         android:id="@+id/textView4"
  171.         android:layout_width="wrap_content"
  172.         android:layout_height="wrap_content"
  173.         android:text="年龄:"
  174.         android:textSize="24sp"
  175.         app:layout_constraintBottom_toTopOf="@+id/guideline4"
  176.         app:layout_constraintEnd_toStartOf="@+id/etAge"
  177.         app:layout_constraintHorizontal_bias="0.5"
  178.         app:layout_constraintStart_toStartOf="@+id/guideline5" />
  179.     <androidx.constraintlayout.widget.Guideline
  180.         android:id="@+id/guideline10"
  181.         android:layout_width="wrap_content"
  182.         android:layout_height="wrap_content"
  183.         android:orientation="vertical"
  184.         app:layout_constraintGuide_percent="0.9" />
  185.     <EditText
  186.         android:id="@+id/etSelect"
  187.         android:layout_width="100dp"
  188.         android:layout_height="wrap_content"
  189.         android:ems="10"
  190.         android:hint="请输入id"
  191.         android:inputType="number"
  192.         app:layout_constraintBottom_toTopOf="@+id/guideline8"
  193.         app:layout_constraintEnd_toStartOf="@+id/btnselect"
  194.         app:layout_constraintHorizontal_bias="0.5"
  195.         app:layout_constraintStart_toStartOf="@+id/guideline5"
  196.         app:layout_constraintTop_toTopOf="@+id/guideline9"
  197.         app:layout_constraintVertical_bias="0.0" />
  198.     <EditText
  199.         android:id="@+id/etDelete"
  200.         android:layout_width="100dp"
  201.         android:layout_height="wrap_content"
  202.         android:ems="10"
  203.         android:hint="请输入id"
  204.         android:inputType="number"
  205.         app:layout_constraintBottom_toTopOf="@+id/guideline8"
  206.         app:layout_constraintEnd_toStartOf="@+id/btnDelete"
  207.         app:layout_constraintHorizontal_bias="0.5"
  208.         app:layout_constraintStart_toStartOf="@+id/guideline5"
  209.         app:layout_constraintTop_toTopOf="@+id/guideline9"
  210.         app:layout_constraintVertical_bias="0.451" />
  211.     <EditText
  212.         android:id="@+id/etUpdate"
  213.         android:layout_width="100dp"
  214.         android:layout_height="wrap_content"
  215.         android:ems="10"
  216.         android:hint="请输入id"
  217.         android:inputType="number"
  218.         app:layout_constraintBottom_toTopOf="@+id/guideline8"
  219.         app:layout_constraintEnd_toStartOf="@+id/btnUpdate"
  220.         app:layout_constraintHorizontal_bias="0.5"
  221.         app:layout_constraintStart_toStartOf="@+id/guideline5"
  222.         app:layout_constraintTop_toTopOf="@+id/etSelect"
  223.         app:layout_constraintVertical_bias="1.0" />
  224.     <TextView
  225.         android:id="@+id/tvcontent"
  226.         android:layout_width="0dp"
  227.         android:layout_height="0dp"
  228.         app:layout_constraintBottom_toBottomOf="parent"
  229.         app:layout_constraintEnd_toStartOf="@+id/guideline10"
  230.         app:layout_constraintStart_toStartOf="@+id/guideline5"
  231.         app:layout_constraintTop_toTopOf="@+id/guideline8"
  232.         tools:hint="这里显示数据" />
  233. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码
示例图:

数据库:

把这三个文件导出检察数据库:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表