ButterKnife黄油刀

article/2025/10/21 17:46:21

ButterKnife黄油刀

1、强大的View绑定和Click事件处理功能,简化代码,提升开发效率

2、方便的处理Adapter里的ViewHolder绑定问题

3、运行时不会影响APP效率,使用配置方便

4、代码清晰,可读性强

怎么配置

在android Studio项目中配置使用ButterKnife

Step one:在Project的 build.gradle 中添加如下代码:

在这里插入图片描述

	implementation 'com.jakewharton:butterknife:10.2.3'// 添加此依赖annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'// 添加此规则

使用黄油刀实现案例

动画

配置文件

drawable

cxkzdh.xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="false"><itemandroid:drawable="@mipmap/cxk0"android:duration="80" /><itemandroid:drawable="@mipmap/cxk1"android:duration="80" /><itemandroid:drawable="@mipmap/cxk2"android:duration="80" />.....<itemandroid:drawable="@mipmap/cxk53"android:duration="80" /><itemandroid:drawable="@mipmap/cxk54"android:duration="80" /><itemandroid:drawable="@mipmap/cxk55"android:duration="80" />
</animation-list>
zhuan.xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:drawable="@mipmap/img_zhuan1"android:duration="80"/><itemandroid:drawable="@mipmap/img_zhuan2"android:duration="80"/><itemandroid:drawable="@mipmap/img_zhuan3"android:duration="80"/><itemandroid:drawable="@mipmap/img_zhuan4"android:duration="80"/><itemandroid:drawable="@mipmap/img_zhuan5"android:duration="80"/></animation-list>

anim

sfdj.xml
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_interpolator"android:fromXScale="0.2"android:toXScale="1.5"android:fromYScale="0.2"android:toYScale="1.5"android:pivotX="50%"android:pivotY="50%"android:duration="2000"/>
tnbj.xml
<?xml version="1.0" encoding="utf-8"?><alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="3000"/>
wybj.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromXDelta="0"android:toXDelta="0"android:fromYDelta="0"android:toYDelta="666"android:duration="3000"/>
xzbj.xml
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromDegrees="0"android:toDegrees="360"android:duration="1000"android:repeatCount="1"android:pivotX="50%"android:pivotY="50%"android:repeatMode="reverse"/>
zhbj.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/decelerate_interpolator"android:shareInterpolator="true"><scaleandroid:fromXScale="0.2"android:toXScale="1.5"android:fromYScale="0.2"android:toYScale="1.5"android:pivotX="50%"android:pivotY="50%"android:duration="3000"/><rotateandroid:fromDegrees="0"android:toDegrees="360"android:repeatCount="1"android:duration="1000"android:repeatMode="reverse"android:pivotX="50%"android:pivotY="50%"/></set>

java

MainACtivity
package com.example.myapplication;import androidx.annotation.BinderThread;
import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;public class MainActivity extends AppCompatActivity {@BindView(R.id.bt_main2)Button main2;@BindView(R.id.bt_main3)Button main3;@BindView(R.id.bt_main4)Button main4;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(MainActivity.this);}//跳转到帧动画@OnClick(R.id.bt_main2)public void setMain2 (){Intent intent = new Intent(MainActivity.this,MainActivity2.class);startActivity(intent);}//跳转到补间动画@OnClick(R.id.bt_main3)public void setMain3 (){Intent intent = new Intent(MainActivity.this,MainActivity3.class);startActivity(intent);}//跳转到属性动画@OnClick(R.id.bt_main4)public void setMain4 (){Intent intent = new Intent(MainActivity.this,MainActivity4.class);startActivity(intent);}
}
MainACtivity2
package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.animation.Animation;
import android.widget.Button;
import android.widget.ImageView;import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;public class MainActivity2 extends AppCompatActivity {@BindView(R.id.bt_ks)Button ksbf;@BindView(R.id.bt_zt)Button ztbf;@BindView(R.id.iv_zdh)ImageView zdh;public AnimationDrawable anim;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);ButterKnife.bind(MainActivity2.this);anim= (AnimationDrawable) zdh.getBackground();}@OnClick(R.id.bt_zt)//暂停public void stop(){anim.stop();}@OnClick(R.id.bt_ks)//播放public void start(){anim.start();}
}
MainACtivity3
package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageView;import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;public class MainActivity3 extends AppCompatActivity {@BindView(R.id.tb_tmjb)Button tmjb;@BindView(R.id.tb_sfjb)Button sfjb;@BindView(R.id.tb_wyjb)Button wyjb;@BindView(R.id.tb_xzjb)Button xzjb;@BindView(R.id.tb_zhjb)Button zhjb;@BindView(R.id.iv_ngm)ImageView ngm;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main3);ButterKnife.bind(MainActivity3.this);}//透明渐变@OnClick(R.id.tb_tmjb)public void ann1() {Animation animation = AnimationUtils.loadAnimation(MainActivity3.this, R.anim.tmbj);ngm.startAnimation(animation);}//缩放渐变@OnClick(R.id.tb_sfjb)public void ann2(){Animation animation = AnimationUtils.loadAnimation(MainActivity3.this, R.anim.sfbj);ngm.startAnimation(animation);}//移动渐变@OnClick(R.id.tb_wyjb)public void ann3(){Animation animation = AnimationUtils.loadAnimation(MainActivity3.this, R.anim.wybj);ngm.startAnimation(animation);}//旋转渐变@OnClick(R.id.tb_xzjb)public void ann4(){Animation animation = AnimationUtils.loadAnimation(MainActivity3.this, R.anim.xzbj);ngm.startAnimation(animation);}//旋转和缩放组合渐变@OnClick(R.id.tb_zhjb)public void ann5(){Animation animation = AnimationUtils.loadAnimation(MainActivity3.this, R.anim.zhbj);ngm.startAnimation(animation);}}
MainACtivity4
package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.LinearInterpolator;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;public class MainActivity4 extends AppCompatActivity {public AnimationDrawable anmd;@BindView(R.id.bt_tm)Button bt_tm;@BindView(R.id.bt_sf)Button bt_sf;@BindView(R.id.bt_yd)Button bt_yd;@BindView(R.id.bt_xz)Button bt_xz;@BindView(R.id.iv_zdh)ImageView iv_zdh;@BindView(R.id.li_root)LinearLayout li_root;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main4);ButterKnife.bind(MainActivity4.this);}//设置透明旋转@OnClick(R.id.bt_tm)public void settm() {//设置旋转角度ValueAnimator rValue = ValueAnimator.ofInt(0, 360);//设置时间rValue.setDuration(2000l);rValue.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator) {int rotavalue = (int) valueAnimator.getAnimatedValue();iv_zdh.setRotation(rotavalue);float fractionValue = valueAnimator.getAnimatedFraction();iv_zdh.setAlpha(fractionValue);}});//对UI页面的属性进行修改rValue.setInterpolator(new DecelerateInterpolator());rValue.start();}//设置缩放@OnClick(R.id.bt_sf)public void setsf() {final float scale = 0.5f;AnimatorSet scalesSet = new AnimatorSet();//设置缩小区间ValueAnimator valueAnimatorSmall = ValueAnimator.ofFloat(1.f, scale);//设置显示时间valueAnimatorSmall.setDuration(1000);//设置放大区间ValueAnimator valueAnimatorLarge = ValueAnimator.ofFloat(scale, 2.0f);//设置时间valueAnimatorLarge.setDuration(1000);//对缩小时的 X Y 的大小设置valueAnimatorSmall.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator) {float small = (float) valueAnimator.getAnimatedValue();iv_zdh.setScaleX(small);iv_zdh.setScaleY(small);}});//对放大时的 X Y 的大小设置valueAnimatorLarge.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator) {float large = (float) valueAnimator.getAnimatedValue();iv_zdh.setScaleX(large);iv_zdh.setScaleY(large);}});scalesSet.play(valueAnimatorLarge).after(valueAnimatorSmall);scalesSet.start();}//设置移动@OnClick(R.id.bt_yd)public void setyd() {//获取总布局的款和高//定义属性动画的方法//按轨迹 方程来运动int width = li_root.getWidth();int heighr = li_root.getHeight();//创建运动区间ValueAnimator valueAnimator = ValueAnimator.ofInt(0, heighr);//执行时间valueAnimator.setDuration(3000L);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animator) {//int y = (int) animator.getAnimatedValue();int x = width / 2;moveView(iv_zdh, x, y);}});valueAnimator.setInterpolator(new LinearInterpolator());valueAnimator.start();}//设置旋转@OnClick(R.id.bt_xz)public void setxz() {anmd= (AnimationDrawable) iv_zdh.getBackground();anmd.start();//得到页面的宽高int width = li_root.getWidth();int height = li_root.getHeight();//半径final int R = width / 4;//设置区间ValueAnimator tValue = ValueAnimator.ofFloat(0, (float) (2.0f * Math.PI));//设置显示时间tValue.setDuration(1000);tValue.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator) {//圆的参数方程 x = R * cos(t)float t = (float) valueAnimator.getAnimatedValue();int x = (int) (R * Math.sin(t) + width / 2);int y = (int) (R * Math.cos(t) + height / 2);moveView(iv_zdh, x, y);}});tValue.setInterpolator(new DecelerateInterpolator());tValue.start();}//定义一个修改ImageView 位置的方法private void moveView(View view, int rawX, int rawY) {int left = rawX - iv_zdh.getWidth() / 2;int top = rawY - iv_zdh.getHeight();int width = left + view.getWidth();int height = top + view.getHeight();view.layout(left, top, width, height);}
}

xml

activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"tools:context=".MainActivity"><Buttonandroid:id="@+id/bt_main2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="MainActivity2"/><Buttonandroid:id="@+id/bt_main3"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="MainActivity3"/><Buttonandroid:id="@+id/bt_main4"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="MainActivity4"/>
</LinearLayout>
activity_main2
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:gravity="center"android:layout_margin="30dp"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity2"><ImageViewandroid:id="@+id/iv_zdh"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/cxkzdh"/><Buttonandroid:id="@+id/bt_ks"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="开始"/><Buttonandroid:id="@+id/bt_zt"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="暂停"/></LinearLayout>
activity_main3
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"tools:context=".MainActivity3"><Buttonandroid:id="@+id/tb_tmjb"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="透明渐变"/><Buttonandroid:id="@+id/tb_sfjb"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="缩放渐变"/><Buttonandroid:id="@+id/tb_wyjb"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="位移渐变"/><Buttonandroid:id="@+id/tb_xzjb"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="旋转渐变"/><Buttonandroid:id="@+id/tb_zhjb"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="渐变结合"/><ImageViewandroid:id="@+id/iv_ngm"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@mipmap/ngm"/>
</LinearLayout>
activity_main4
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/li_root"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity4"><Buttonandroid:id="@+id/bt_tm"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="透明"/><Buttonandroid:id="@+id/bt_sf"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="缩放"/><Buttonandroid:id="@+id/bt_yd"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="移动"/><Buttonandroid:id="@+id/bt_xz"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="旋转"/><ImageViewandroid:id="@+id/iv_zdh"android:layout_width="35dp"android:layout_height="35dp"android:background="@drawable/zhuan"/>
</LinearLayout>
  android:layout_height="wrap_content"android:text="缩放"/><Buttonandroid:id="@+id/bt_yd"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="移动"/><Buttonandroid:id="@+id/bt_xz"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="旋转"/><ImageViewandroid:id="@+id/iv_zdh"android:layout_width="35dp"android:layout_height="35dp"android:background="@drawable/zhuan"/>
```

http://chatgpt.dhexx.cn/article/FN0khmsr.shtml

相关文章

Android版黄油刀简介

Butter Knife? 黄油刀是一个非常好的Android视图注入库。 黄油刀有助于减少许多样板代码&#xff08;例如&#xff0c;重复的findViewById调用&#xff09;。 如果您处理的活动具有大量的视图&#xff0c;那么您就会知道&#xff0c;将代码与“ findViewById”集群在一起时&a…

Android(ButterKnife)黄油刀使用详解

一、什么是ButterKnife黄油刀&#xff1f; 1.1ButterKnife中文又名黄油刀&#xff0c;是一款Android视图的字段和方法绑定快速注解框架。 1.2使用方法&#xff1a; 1.打开budild.gradle 文件 2.在dependencies 中添加 implementation com.jakewharton:butterknife:10.2.3// …

Android Butterknife(黄油刀) 使用方法总结

转载请标明出处&#xff1a;http://blog.csdn.net/donkor_/article/details/77879630 前言&#xff1a; ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象&#xff0c;有了ButterKnife可以很轻松的省去这些步骤。是大神JakeWha…

ArrayList$SubList.add导致的java.lang.StackOverflowError : null :慎用subList

项目场景&#xff1a; 上线后遇到的1个StackOverflowError问题&#xff0c;这里做个分析。通过日志文件可以看到&#xff1a; java.lang.StackOverflowError: nullat java.util.ArrayList$SubList.add(ArrayList.java:1047)at java.util.ArrayList$SubList.add(ArrayList.jav…

ArrayList和SubList的坑面试题

&#x1f468;&#x1f3fb;‍&#x1f393;博主介绍&#xff1a;大家好&#xff0c;我是芝士味的椒盐&#xff0c;一名在校大学生&#xff0c;热爱分享知识&#xff0c;很高兴在这里认识大家&#x1f31f; &#x1f308;擅长领域&#xff1a;Java、大数据、运维、电子 &#x…

NetSuite Sublist解释

今朝汇编一下Sublist主题的知识点以备忘。 2个数据源类型 Related Record - 以Saved Search建立的关联记录&#xff1b;Child Record - 父子表&#xff1b; 1. Related Record Saved Search关键点 这种形式的Sublist是利用Saved Search作为Sublist的数据源&#xff0c;将某…

各位,请慎用 subList!原来这么多坑!!

点击关注公众号&#xff0c;Java干货及时送达 1. 使用Arrays.asList的注意事项 1.1 可能会踩的坑 先来看下Arrays.asList的使用&#xff1a; List<Integer> statusList Arrays.asList(1, 2); System.out.println(statusList); System.out.println(statusList.contains(1…

Java中List的subList()方法及使用注意事项

List<Object> list new Arraylist<>();List<Object> subList list.subList(0, 5);其中subList(0, 5)取得的是下标为0到4的元素,不包含下标为5的元素. java.util.List中的subList方法返回列表中指定的 fromIndex&#xff08;包括 &#xff09;和 toIndex&a…

Java 中 List.subList() 方法的使用陷阱

转载请注明本文出自 clevergump 的博客&#xff1a;http://blog.csdn.net/clevergump/article/details/51105235, 谢谢! 前言 本文原先发表在我的 iteye博客: http://clevergump.iteye.com/admin/blogs/2211979, 但由于在 iteye发表的这篇文章的某些渲染曾经出现过一些问题, 我…

【Java】List的subList方法

Java的容器类ArrayList很常用&#xff0c;旗下存在一个subList方法&#xff0c;是值得注意的。 subList方法仅能够取出此ArrayList的引用&#xff0c;即使其看起来&#xff0c;好像是取出一个ArrayList的子ArrayList。 其实不然&#xff0c;subList方法的返回值&#xff0c;只是…

Java中的subList方法

Java中的subList方法 今天看到了java中List中有个subList的方法&#xff0c;感觉很熟悉有没有&#xff1f;没错&#xff0c;在Stirng类中&#xff0c;也有个类似的方法&#xff1a;subString。 Stirng中的subString方法&#xff0c;官方解释是&#xff1a;返回字符串的子字符串…

Java中List集合的subList方法

目录 一、说明 二、测试 1、直接输出 2、向subList中添加元素再输出 3、 从subList中删除元素再输出 4、向list中添加元素再输出 5、从list中删除一个元素后再输出 ​ 6、向list中添加元素&#xff0c;输出list&#xff0c;然后将subList传入ArrayList生成新集合在输出…

你真的会用ArrayList的subList方法吗?

导语 在日常的开发中通常会遇到截取List的情况&#xff0c;而大多数会选择使用subList方法进行截取&#xff0c;但是好多人对这个方法的理解都只是停留在使用层面上&#xff1f;这篇文章会非常详细达到源码级别的讲解sublList方法&#xff0c;需要的朋友赶紧收藏起来吧。 关于…

Java SubList 类 Java subList方法 Java ArrayList$SubList 方法特点 SubList 用法

Java SubList 类 Java subList方法 Java ArrayList$SubList 方法特点 SubList 用法 一、概述 在java集合中&#xff0c;常用ArrayList类中&#xff0c;若需要对 list进行截取&#xff0c;可以使用subList方法&#xff0c;进行生成 SubList的内部类&#xff0c;那么 ArrayList 和…

使用ArrayList中的subList方法

集合是Java开发日常开发中经常会使用到的。在之前的一些文章中&#xff0c;我们介绍过一些关于使用集合类应该注意的事项&#xff0c;如《为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作》、《为什么阿里巴巴建议集合初始化时&#xff0c;指定集合容量大小》等…

sublist详解

接口中定义 List<E> subList(int fromIndex, int toIndex);1&#xff0c;该方法返回的是父list的一个视图&#xff0c;从fromIndex&#xff08;包含&#xff09;&#xff0c;到toIndex&#xff08;不包含&#xff09;。fromIndextoIndex 表示子list为空 2&#xff0c;父…

数据建模应用

数据建模应用 一、为什么要数据建模二、数据建模种类1、关系建模&#xff08;3NF&#xff09;2、维度建模 三、3NF数据建模1、范式介绍2、3NF建模实战 四、维度建模1、维度和指标的概念2、星型模型3、雪花模型4、星型与雪花模型对比5、维度建模测试案例 五、3NF建模与维度建模的…

分享大数据建模工具-大数据挖掘建模平台

大数据挖掘建模平台 是面向企业级用户的大数据挖掘建模平台。平台采用可视化操作方式&#xff0c;通过丰富内置算法&#xff0c;帮助用户快速、一站式地进行数据分析及挖掘建模&#xff0c;可应用于处理海量数据、高复杂性的数据挖掘任务&#xff0c;为其提供准确、高精度的计算…

大数据之数据模型

一、星型摸型 事实表是记录一个事实的&#xff0c;可以理解为订单表&#xff0c; 纬度表是提供更丰富信息的表&#xff0c;可以理解为商品明细表、订单明细表&#xff1b; 它是由一个事实表和一组维表组成&#xff0c;每个维表都有一个维作为主键&#xff0c;所有这些维的主键…

数据建模概述

数据建模&#xff08;data modeling&#xff0c;其实应该就是创建一个函数&#xff09;指的是对现实世界各类数据的抽象组织&#xff0c;确定数据库需管辖的范围、数据的组织形式等直至转化成现实的数据库。 将经过系统分析后抽象出来的概念模型转化为物理模型后&#xff0c;在…