CrimeFragment的UI fragment进行管理

news2024/9/24 17:21:25
用户界面将由一个名为 CrimeFragment UI fragment 进行管理。 CrimeFragment
实例将通过一个名为 CrimeActivity activity 托管
CrimeActivity 视图由 FrameLayout 组件组成, FrameLayout 组件为 CrimeFragment 要显示
的视图安排了存放位置。
CrimeFragment 的视图由一个 LinearLayout 组件及一个 EditText 组件组成。
CrimeFragment 类中有一个存储 EditText 的成员变量( mTitleField )。 mTitleField 上设有监
听器,当 EditText 上的文字发生改变时,用来更新模型层的数据。
FragmentActivity Activity 的子类,具有新系统版本
Activity 类管理 fragment 的能力,即便是在较早版本的 Android 设备上也可对 fragment 进行管理。

 创建CrimeActivity

托管 UI fragment

为托管 UI fragment activity 必须做到:
        在布局中为fragment 的视图安排位置;
        管理fragment 实例的生命周期。

 

 定义容器视图

修改activity_crime.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fragmentContainer">
</FrameLayout>

创建 UI fragment

fragment 视图的布局文件( fragment_crime.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".CrimeFragment">

     <EditText
         android:id="@+id/crime_title"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:hint="请输入标题" />
</FrameLayout>

创建CrimeFragment


import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.Toast;

import yu.app.criminalintent.model.Crime;

/**
 *
 */
public class CrimeFragment extends Fragment {


    private Crime   mCrime;
    private EditText mTitleField;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         mCrime=new Crime();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View v=inflater.inflate(R.layout.fragment_crime, container, false);
        mTitleField = v.findViewById(R.id.crime_title);
        mTitleField.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence c, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence c, int start, int before, int count) {
                mCrime.setmTitle(c.toString());
                Toast.makeText(getContext(), c.toString(), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

        // Inflate the layout for this fragment
        return v;
    }
}
Fragment.onCreateView(...) 方法中的组件引用几乎等同于 Activity.onCreate(...)
方法的处理。唯一的区别是我们调用了当前 fragment 视图的 View.findViewById(int) 方法。以前使
用的 Activity.findViewById(int) 方法十分便利,能够在后台自动调用 View.findView
ById(int) 方法。而 Fragment 类没有对应的便利方法,因此我们必须自己完成调用。
fragment 中监听器方法的设置和 activity 中的处理完全一样。 创建实现 TextWatcher 监听器接口的匿名内部类。 TextWatcher 有三种方法,不过我们现在只需关注其中 onTextChanged(...) 方法。
onTextChanged(...) 方法中,调用 CharSequence (代表用户输入)的 toString() 方法。
该方法最后返回用来设置 Crime 标题的字符串。
CrimeFragment 类的代码实现部分完成了。但现在还不能运行应用查看用户界面和检验代
码。因为 fragment 无法将自己的视图显示在屏幕上。接下来我们首先要把 CrimeFragment 添加给
CrimeActivity。

添加 UI fragment FragmentManager

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;

import android.os.Bundle;

public class CrimeActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_crime);
        //获取碎片管理
        FragmentManager fm = getSupportFragmentManager();
        //获取碎片存放的容器
        Fragment f = fm.findFragmentById(R.id.fragmentContainer);
        if (f==null){
            //实例化碎片
            f=new CrimeFragment();
            //碎片管理开启事务添加实例化碎片到碎片存放容器中并提交事务
            fm.beginTransaction().add(R.id.fragmentContainer, f).commit();
        }

    }
}
fragment 事务被用来添加、移除、附加、分离或替换 fragment 队列中的 fragment 。这是使用
fragment 在运行时组装和重新组装用户界面的核心方式。 FragmentManager 管理着 fragment 事务
的回退栈。
FragmentManager.beginTransaction() 方法创建并返回 FragmentTransaction 实例。
FragmentTransaction 类使用了一个 fluent interface 接口方法,通过该方法配置 FragmentTran
saction 返回 FragmentTransaction 类对象,而不是 void ,由此可得到一个 FragmentTransa
ction队列。
add(...) 方法是整个事务的核心部分,并含有两个参数,即容器视图资源 ID 和新创建的
CrimeFragment 。容器视图资源 ID 我们应该很熟悉了,它是定义在 activity_crime.xml 中的
FrameLayout 组件的资源 ID 。容器视图资源 ID 主要有两点作用:
  告知 FragmentManager fragment 视图应该出现在 activity 视图的什么地方;
  FragmentManager 队列中 fragment 的唯一标识符。

升级Crime类


import java.util.Date;
import java.util.UUID;

public class Crime {
    private UUID mID;
    private String mTitle;

    private Date mDate;
    private boolean mSolved;

    public Crime(){
        //生成唯一标识符
        mID=UUID.randomUUID();
        mDate=new Date();
    }

    public UUID getmID() {
        return mID;
    }

    public String getmTitle() {
        return mTitle;
    }

    public void setmTitle(String mTitle) {
        this.mTitle = mTitle;
    }

    public Date getmDate() {
        return mDate;
    }

    public void setmDate(Date mDate) {
        this.mDate = mDate;
    }

    public boolean ismSolved() {
        return mSolved;
    }

    public void setmSolved(boolean mSolved) {
        this.mSolved = mSolved;
    }
}

更新fragment_crime.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".CrimeFragment">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

         <TextView
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:text="@string/mCrime_title"
             style="?android:listSeparatorTextViewStyle"/>

         <EditText
             android:id="@+id/crime_title"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginLeft="16dp"
             android:layout_marginRight="16dp"
             android:hint="@string/crime_title" />

         <TextView
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:text="@string/crime_detail"
             style="?android:listSeparatorTextViewStyle"/>

         <Button
             android:id="@+id/crime_date"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginLeft="16dp"
             android:layout_marginRight="16dp"
             />

         <CheckBox
             android:id="@+id/crime_solved"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginLeft="16dp"
             android:layout_marginRight="16dp"
             android:text="@string/isSolved"/>

    </LinearLayout>



</FrameLayout>

更新CrimeFragment

 

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Toast;

import java.text.DateFormat;
import java.text.SimpleDateFormat;

import yu.app.criminalintent.model.Crime;

/**
 *
 */
public class CrimeFragment extends Fragment {


    private Crime   mCrime;
    private EditText mTitleField;
    private Button mDateBtn;
    private CheckBox mSolvedCbox;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         mCrime=new Crime();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View v=inflater.inflate(R.layout.fragment_crime, container, false);
        mTitleField = v.findViewById(R.id.crime_title);
        mTitleField.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence c, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence c, int start, int before, int count) {
                mCrime.setmTitle(c.toString());
                Toast.makeText(getContext(), c.toString(), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd E a HH:mm:ss");
        mDateBtn = v.findViewById(R.id.crime_date);
        mDateBtn.setText(dateFormat.format(mCrime.getmDate()));
        mDateBtn.setEnabled(false);

        mSolvedCbox = v.findViewById(R.id.crime_solved);
        mSolvedCbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                mCrime.setmSolved(b);
                Toast.makeText(getContext(), String.valueOf(mCrime.ismSolved()) , Toast.LENGTH_SHORT).show();
            }
        });

        // Inflate the layout for this fragment
        return v;
    }
}

使用ListFragment显示列表

应用的模型层将新增一个 CrimeLab 对象,该对象是一个数据集中存储池,用来存储 Crime 对象。
显示 crime 列表需在应用的控制层新增一个 activity 和一个 fragment ,即 CrimeListActivity
CrimeListFragment
CrimeListFragment ListFragment 的子类, ListFragment Fragment 的子类。
Fragment 内置列表显示支持功能。控制层对象间、控制层对象与 CrimeLab 对象间彼此交互,进
行模型层数据的存取。
ArrayList<E> 是一个支持存放指定数据类型对象的 Java 有序数组类,具有获取、新增及删除
数组中元素的方法。

创建CrimeLab


import android.content.Context;

import java.util.ArrayList;
import java.util.UUID;

public class CrimeLab {
    private ArrayList<Crime> mCrimes;

    private static CrimeLab crimeLab;
    private Context appContext;

    private CrimeLab(Context appContext){
        this.appContext=appContext;
        this.mCrimes=new ArrayList<>();

        //测试 先往数组列表中批量存入100个Crime对象
        for (int i=1;i<=100;i++){
            Crime c=new Crime();
            c.setmTitle("Crime标题#"+i);
            c.setmSolved(i%2==0);
            mCrimes.add(c);
        }

    }

    public static CrimeLab get(Context c){
        if (crimeLab==null){
            crimeLab = new CrimeLab(c.getApplicationContext());
        }
        return  crimeLab;
    }


    public ArrayList<Crime> getmCrimes() {
        return mCrimes;
    }

    public  Crime getCrime(UUID id){
        for (Crime c : mCrimes){
            if (c.getmID().equals(id)){
                return c;
            }
        }
        return null;
    }
}

创建CrimeListActivity


import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.fragment.app.Fragment;

import yu.app.criminalintent.base.SingleFragmentActivity;
import yu.app.criminalintent.fragment.CrimeListFragment;

public class CrimeListActivity extends SingleFragmentActivity {

    @Override
    protected Fragment createFragment() {
        return new CrimeListFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_crime_list_list, container, false);

        return view;
    }
}

创建CrimeListFragment

 

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.ListFragment;

import java.util.ArrayList;

import yu.app.criminalintent.R;
import yu.app.criminalintent.base.SingleFragmentActivity;
import yu.app.criminalintent.model.Crime;
import yu.app.criminalintent.model.CrimeLab;

/**
 * A fragment representing a list of Items.
 */
public class CrimeListFragment extends ListFragment {

    private static final String TAG = "CrimeListFragment";
    private ArrayList<Crime> mCrimes;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mCrimes = CrimeLab.get(getActivity()).getmCrimes();

        ArrayAdapter<Crime> adapter = new ArrayAdapter<Crime>(getActivity(), android.R.layout.simple_expandable_list_item_1, mCrimes);
        setListAdapter(adapter);
    }

    @Override
    public void onListItemClick(@NonNull ListView l, @NonNull View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Crime c = (Crime) getListAdapter().getItem(position);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("提示信息");
        builder.setMessage(c.toString());
        builder.setPositiveButton("确定",new DialogInterface.OnClickListener(){

            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                    //
            }
        });

        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {

                //
            }
        });

        AlertDialog alertDialog=builder.create();
        alertDialog.show();

    }
}

修改AndroidMainfest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.YuApp">
        <activity
            android:name=".CrimeListActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
    </application>

</manifest>

fragment_crime_list_list.xml布局文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView 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:id="@+id/list"
    android:name="yu.app.criminalintent.fragment.CrimeListFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    app:layoutManager="LinearLayoutManager"
    tools:context=".fragment.CrimeListFragment"
    tools:listitem="@layout/fragment_crime_list" />

创建SingleFragmentActivity

 

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;

import yu.app.criminalintent.R;

/**
 * 通用fragment的抽象类
 */
public abstract class SingleFragmentActivity extends FragmentActivity {
    //该抽象方法可实例化新的fragment,SingleFragmentActivity的子类会实现该方法返回一个由activity托管的fragment实例
    protected  abstract  Fragment createFragment();

    @Override
    protected void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_crime);
        FragmentManager fm=getSupportFragmentManager();
        Fragment f = fm.findFragmentById(R.id.fragmentContainer);
        if (f==null){
            f=createFragment();
            fm.beginTransaction().add(R.id.fragmentContainer, f).commit();
        }
    }

    public abstract View onCreateView(LayoutInflater inflater, ViewGroup container,
                                      Bundle savedInstanceState);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Thinkphp QVD-2022-46174 多语言rce

文章目录漏洞介绍vulhub漏洞搭建漏洞利用利用一&#xff1a;写入文件利用二&#xff1a;文件包含漏洞分析参考文章漏洞介绍 Thinkphp&#xff0c;v6.0.1~v6.0.13&#xff0c;v5.0.x&#xff0c;v5.1.x 如果 Thinkphp 程序开启了多语言功能&#xff0c;那就可以通过 get、head…

[从零开始]用python制作识图翻译器·三

AlsoEasy-RecognitionTranslator具体实现开发环境准备和验证下载conda创建开发环境文字识别模块在线模块离线模块机器翻译模块在线模块离线模块GUIGUI-定位模块GUI-截图模块具体实现 开发环境准备和验证 前期测试项目文件已上传到我的仓库。 下载conda conda是python的版本管…

Day863.协程 -Java 并发编程实战

协程 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于协程的内容。 Java 语言里解决并发问题靠的是多线程&#xff0c;但线程是个重量级的对象&#xff0c;不能频繁创建、销毁&#xff0c;而且线程切换的成本也很高&#xff0c;为了解决这些问题&#xff0c;Java SD…

C++设计模式(4)——策略模式

策略模式 亦称&#xff1a; Strategy 意图 策略模式是一种行为设计模式&#xff0c; 它能让你定义一系列算法&#xff0c; 并将每种算法分别放入独立的类中&#xff0c; 以使算法的对象能够相互替换。 问题 一天&#xff0c; 你打算为游客们创建一款导游程序。 该程序的核心…

什么是CNCF云原生

一、CNCF简介 CNCF&#xff1a;全称Cloud Native Computing Foundation&#xff08;云原生计算基金会&#xff09;&#xff0c;成立于2015年12月11日&#xff0c;是一个开源软件基金会&#xff0c;它致力于云原生&#xff08;Cloud Native&#xff09;技术的普及和可持续发展。…

golang 错误处理channel+error真的香

官方推荐golang中错误处理当做值处理&#xff0c; 既然是值那就可以在channel中传输&#xff0c;本文带你看看golang中channelerror来做异步错误处理有多香&#xff0c;看完本文还会觉得golang的错误处理相比java try catch一点优势都没有吗&#xff1f; 场景 如下&#xff0…

LeetCode刷题笔记 - JavaScript(二)

文章目录1.剑指 Offer 60. n个骰子的点数2.面试题67. 把字符串转换成整数3.面试题59 - II. 队列的最大值剑指 Offer 60. n个骰子的点数 面试题67. 把字符串转换成整数 面试题59 - II. 队列的最大值 1.剑指 Offer 60. n个骰子的点数 把n个骰子扔在地上&#xff0c;所有骰子朝上一…

Java运行机制

java的运行机制 Java程序的运行机制分为编写、编译和运行三个步骤。 1.编写 编写是指在Java开发环境中进行程序代码的编辑&#xff0c;最终生成后缀名为“.java”的Java源文件。 2.编译 编译是指使用Java编译器对源文件进行错误排查的过程&#xff0c;编译后将生成后缀名为…

一篇文章带你熟悉Ajax

文章目录一、AJAX 简介二、创建 AJAX 的基本步骤1. 创建 XMLHttpRequest 对象2.向服务器发送请求3.服务器响应状态一、AJAX 简介 ☀️AJAX 的英文全称为 Asynchronous JavaScript And XML&#xff0c;Asynchronous 是异步的意思。何为异步呢&#xff1f;在这里异步是指通过 AJA…

IT运维服务体系的总体架构是什么?

大家好&#xff0c;我是技福的小咖老师。 今天我们来简单介绍一下IT运维服务体系的总体架构。 运维服务体系由运维服务制度、运维服务流程、运维服务组织、运维服务队伍、运维技术服务平台以及运行维护对象六部分组成&#xff0c;涉及制度、人、技术、对象四类因素。制度是规…

每日一题-力扣(leetcode)2368. 受限条件下可到达节点的数目

题目描述 现有一棵由 n 个节点组成的无向树&#xff0c;节点编号从 0 到 n - 1 &#xff0c;共有 n - 1 条边。 给你一个二维整数数组 edges &#xff0c;长度为 n - 1 &#xff0c;其中 edges[i] [ai, bi] 表示树中节点 ai 和 bi 之间存在一条边。另给你一个整数数组 restr…

激光雷达对植被冠层结构和SIF同时探测展望

前言陆表植被在全球碳循环中起着不可替代的作用。但现阶段&#xff0c;人们对气候变化与植被生态理化功能的关系的研究还不够完善。为了提高气候预测以及缓解气候恶化的速率&#xff0c;对植被参数比如&#xff1a;叶面积指数&#xff08;leaf&#xff09;、植被冠层结构&#…

JavaScript JSON序列化和反序列化

文章目录JavaScript JSON序列化和反序列化概述JSON序列化JSON.stringify()仅一个参数使用使用2个参数使用3个参数其他自定义toJson序列化顺序反序列化JSON.parse()仅一个参数使用使用2个参数eval()JavaScript JSON序列化和反序列化 概述 JSON数据在网络传输时存在两种类型&am…

【虹科云展厅】虹科赋能汽车智能化云展厅专题回顾

虹科赋能汽车智能化云展厅 聚焦前沿技术&#xff0c;【虹科赋能汽车智能化云展厅】正式上线&#xff0c;本次云展厅围绕“汽车以太网/TSN、汽车总线、智能网联、电子测试与验证、自动驾驶”等核心话题&#xff0c;为您带来如临展会现场般的讲演与介绍&#xff0c;更有技术工程…

PromQL之选择器和运算符

平台统一监控的介绍和调研直观感受PromQL及其数据类型PromQL之选择器和运算符 PromQL 匹配器 相等匹配器&#xff08;&#xff09; 选择与提供的字符串完全相同的数据 例&#xff1a;筛选出id“G1 Eden Space” 的数据 jvm_memory_used_bytes{id"G1 Eden Space"}…

Elasticsearch高级查询—— 匹配查询文档

目录一、初始化文档数据二、匹配查询文档示例2.1、概述2.2、示例一、初始化文档数据 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 &#xff1a;http://localhost:9200/user/_doc/1&#xff0c;请求体内容为&#xff1a; {"name":"张三","age&…

知识图谱与神经网络,神经调节知识网络图

1、图立方和知识图谱的区别和联系与区别 图网络&#xff0c;即Natural Graph&#xff0c;是基于世界各实体之间的自然关系表示而得到的图&#xff0c;他们的节点一般是某个特定网络中的实体&#xff08;人、物理机、分子&#xff09;。例如&#xff1a;社交网络、通信网络、蛋…

阿里云-ODPS SQL-日常开发日期、字符、数学运算、聚合函数函数使用技巧

文章目录1、背景2、 数据处理2.1、OLTP与OLAP概念2.2、OLTP与OLAP区别3、日常开发常用函数3.1、日期函数3.2、数学运算函数3.3、字符串处理函数3.4、聚合函数1、背景 数据仓库&#xff0c;是一个面向主题的、集成的、随时间变化的、信息本身相对稳定的数据集合。 数据仓库从Or…

2-Node.js 内置模块

Node.js 内置模块 简介 之前说过&#xff0c;Node.js 中重要的两句话是 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型&#xff0c;使其轻量又高效。 上面两句话&#xff0c;可以使用下面的图片来具体认识。…

【机器学习 - 5】:多元线性回归

文章目录多元线性回归多元线性回归公式推导举例&#xff1a;波士顿房价取特征值RM为例取所有特证为例多元线性回归 多元线性回归方程&#xff1a;特征值为两个或两个以上。 以下是多元线性回归的模型&#xff0c;我们需要求出theta&#xff0c;使得真实值和预测值的差值最小。 …