Android : SQLite 增删改查—简单应用

news2024/11/26 0:41:03

示例图:

学生实体类 Student.java

package com.example.mysqlite.dto;

public class Student {
    public Long id;
    public String name;
    public String sex;
    public int age;
    public String clazz;

    public String creatDate;

    //头像
    public byte[] logoHead;
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", clazz='" + clazz + '\'' +
                ", creatDate='" + creatDate + '\'' +
                '}';
    }
}

工具类 DBhelpUtil.java

package com.example.mysqlite.util;

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

import androidx.annotation.Nullable;

public class DBhelpUtil extends SQLiteOpenHelper {

    /**数据库名字*/
    public static final String DB_NAME = "studentDB";

    /**学生表字段信息*/
    public static final String TABLE_NAME = "tb_student";
    public static final String TB_NAME = "name";
    public static final String TB_SEX = "sex";
    public static final String TB_AGE = "age";
    public static final String TB_CLAZZ = "clazz";
    public static final String TB_CREATEDATE = "createDate";

    /**数据版本号 第一次运行要打开 */
//    public static final int DB_VERSION = 1;

    //模拟数据版本升级
    public static final int DB_VERSION = 2;



    /**
     *
     * @param context   上下文
     * @param name      数据库名字
     * @param factory   游标工厂 null
     * @param version   自定义的数据库版本
     */
    public DBhelpUtil(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    //数据库第一次创建时被调用
    @Override
    public void onCreate(SQLiteDatabase db) {
        //初始化 第一次 创建数据库
        StringBuilder sql = new StringBuilder();



        sql.append(" create table tb_student(");
        sql.append(" id integer primary key,  ");
        sql.append(" name varchar(20),");
        sql.append(" sex varchar(2),");
        sql.append(" age varchar(20),");
        sql.append(" clazz varchar(20),");
        sql.append(" createDate varchar(23) )");


//        Log.e("TAG","------"+sql.toString());

        //执行sql
        db.execSQL(sql.toString());
    }

    //版本号发生改变时调用
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //更新数据库 插入字段
        String sql = "alter table tb_student add logoHead varchar(200)";

        db.execSQL(sql);

    }
}

StudentDao.java

package com.example.mysqlite.dao;

import android.content.ContentValues;
import android.content.Context;
import android.database.AbstractWindowedCursor;
import android.database.Cursor;
import android.database.CursorWindow;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.widget.Toast;

import com.example.mysqlite.dto.Student;
import com.example.mysqlite.util.DBhelpUtil;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.SimpleFormatter;

public class StudentDao {
    private DBhelpUtil dBhelpUtil;


    /**相当于获得一个链接数据库的对象*/
    private SQLiteDatabase DB;
    private Context context;
    public StudentDao(Context context,DBhelpUtil dBhelpUtil){
        this.context =context;
        this.dBhelpUtil = dBhelpUtil;
    }
    //保存数据
    public Long save(Student student) {
        /** 获取一个写 操作数据的对象*/
        DB = dBhelpUtil.getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put(DBhelpUtil.TB_NAME,student.name);
        contentValues.put(DBhelpUtil.TB_SEX,student.sex);
        contentValues.put(DBhelpUtil.TB_AGE,student.age);
        contentValues.put(DBhelpUtil.TB_CLAZZ,student.clazz);

//        Log.e("TAG","--------------"+student.toString());
//        Toast.makeText(context,"sql 语句--"+student.toString(),Toast.LENGTH_LONG).show();
        //时间
        Date date = new Date();
        //格式化
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        contentValues.put(DBhelpUtil.TB_CREATEDATE, simpleDateFormat.format(date));


        /**insert()
         * String table: 表名
         * String nullColumnHack: 不允许插入空行,为了防止插入空行,可以在这里随便指定一列, 如果有空值插入 会用null表示,好像没作用~
         * ContentValues values 数据行数据
         * 返回值 成功插入行号的id  ,插入失败 -1
         */
        return DB.insert(DBhelpUtil.TABLE_NAME,"空值",contentValues);
        //INSERT INTO tb_student(id,age,sex,name,clazz,createDate) VALUES (?,?,?,?,?,?)

    }

    /**查询数据*/
    public List<Student> select(Long id) {
        /** 获取一个读 操作数据的对象*/
        DB =dBhelpUtil.getReadableDatabase();

        /**query() 查询数据
         *String table, 表名
         * String[] columns, 要查询要显示的列
         * String selection,   查询条件
         * String[] selectionArgs, 参数值
         * String groupBy, 分组
         * String having, 分组后的条件
         * String orderBy 排序
         * 返回游标 Cursor
          */
        String[] columns = new String[]{
                "id",
                DBhelpUtil.TB_NAME,
                DBhelpUtil.TB_SEX,
                DBhelpUtil.TB_AGE,
                DBhelpUtil.TB_CLAZZ,
                DBhelpUtil.TB_CREATEDATE
        };
        Cursor cursor = null;
        if(id == null){
            //全查
             cursor = DB.query(DBhelpUtil.TABLE_NAME,columns,null,null,null,null,"id desc");
        }else {
            //根据id 查询
            cursor = DB.query(DBhelpUtil.TABLE_NAME,columns,"id=?",new String[]{String.valueOf(id)},null,null,null);

        }

        List<Student> studentList = new ArrayList<>();
        if(cursor != null){
            //遍历游标
            while(cursor.moveToNext()){
                Student student = new Student();
                // 根据游标找到列  在获取数据
                student.id = cursor.getLong(cursor.getColumnIndexOrThrow("id"));
                student.name = cursor.getString(cursor.getColumnIndexOrThrow(DBhelpUtil.TB_NAME));
                student.sex = cursor.getString(cursor.getColumnIndexOrThrow(DBhelpUtil.TB_SEX));
                student.age = cursor.getInt(cursor.getColumnIndexOrThrow(DBhelpUtil.TB_AGE));
                student.clazz = cursor.getString(cursor.getColumnIndexOrThrow(DBhelpUtil.TB_CLAZZ));
                student.creatDate = cursor.getString(cursor.getColumnIndexOrThrow(DBhelpUtil.TB_CREATEDATE));

                //添加到集合
                studentList.add(student);
            }
        }

        cursor.close();

        return studentList;
    }
    /**删除数据*/
    public int delete(Long id) {
        // 获取操作数据库对象
        DB = dBhelpUtil.getWritableDatabase();

        /**
         * String table,  表名
         * String whereClause, 条件
         * String[] whereArgs 参数
         * 返回影响行数,失败 0
         */
        //全部删除
        if(id == null){
            return DB.delete(DBhelpUtil.TABLE_NAME,null,null);
        }
        // 条件查询
       return DB.delete(DBhelpUtil.TABLE_NAME,"id = ?",new String[]{id+""});
    }

    /**保存位图*/
    public void saveBitmap(Student student) {
        /** 获取一个写 操作数据的对象*/
        DB = dBhelpUtil.getWritableDatabase();
        //开启事务
        DB.beginTransaction();


         //时间
        Date date = new Date();
        //格式化
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        //执行sql语句 方式
        String sql = "INSERT INTO tb_student(age,sex,name,clazz,createDate,logoHead) VALUES (?,?,?,?,?,?)";
        /**
         * sql 语句
         * 要插入的数据
         */
        DB.execSQL(sql,new Object[]{student.age,student.sex,student.name,student.clazz,simpleDateFormat.format(date),student.logoHead});

        //设置事务成功
        DB.setTransactionSuccessful();
        //添加事务
        DB.endTransaction();


    }

    //查询位图
    public Student selectBitmapById(Long id) {
        /** 获取一个读 操作数据的对象*/
        DB =dBhelpUtil.getReadableDatabase();
        Cursor cursor = null;


        /** 根据id 查询 返回一个游标对象
         * String sql,
         * String[] selectionArgs,
         * select * from tb_student where id = ?
         */
        cursor = DB.rawQuery("select * from "+ DBhelpUtil.TABLE_NAME+" where id =?",new String[]{id+""});
        // 解决报错;android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos=0, totalRows=1
        CursorWindow cw = new CursorWindow("test", 5000000); // 设置CursorWindow的大小为5000000
        AbstractWindowedCursor ac = (AbstractWindowedCursor) cursor;
        ac.setWindow(cw);

        Student student = null;
        if(cursor != null){
            if(cursor.moveToNext()){
                student = new Student();
                // 根据游标找到列  在获取数据
                student.id = cursor.getLong(cursor.getColumnIndexOrThrow("id"));
                student.name = cursor.getString(cursor.getColumnIndexOrThrow(DBhelpUtil.TB_NAME));
                student.sex = cursor.getString(cursor.getColumnIndexOrThrow(DBhelpUtil.TB_SEX));
                student.age = cursor.getInt(cursor.getColumnIndexOrThrow(DBhelpUtil.TB_AGE));
                student.clazz = cursor.getString(cursor.getColumnIndexOrThrow(DBhelpUtil.TB_CLAZZ));
                student.creatDate = cursor.getString(cursor.getColumnIndexOrThrow(DBhelpUtil.TB_CREATEDATE));
                //图片
                student.logoHead =cursor.getBlob(cursor.getColumnIndexOrThrow("logoHead")) ;
            }
        }
        cursor.close();

        return student;
    }


    //按条件修改
    public int updateById(Student student,Long id){
        // 获取写操作数据库对象
        DB = dBhelpUtil.getWritableDatabase();
        //开启事务
        DB.beginTransaction();
        /**
         * String table,
         * ContentValues values, 数据行数据
         * String whereClause, 条件
         * String[] whereArgs   参数
         * 返回影响行数
         */
        //数据行数据
        ContentValues contentValues = new ContentValues();
        contentValues.put(DBhelpUtil.TB_NAME,student.name);
        contentValues.put(DBhelpUtil.TB_SEX,student.sex);
        contentValues.put(DBhelpUtil.TB_AGE,student.age);
        contentValues.put(DBhelpUtil.TB_CLAZZ,student.clazz);

        //时间
        Date date = new Date();
        //格式化
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        contentValues.put(DBhelpUtil.TB_CREATEDATE, simpleDateFormat.format(date));

        int result = DB.update(DBhelpUtil.TABLE_NAME,contentValues,"id = ?", new String[]{id+""});
        //完成事务
        DB.setTransactionSuccessful();
        //结束事务
        DB.endTransaction();

       return result;
    }
}

MainActivity.java

package com.example.mysqlite;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Looper;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.mysqlite.activity.BaseActivity;
import com.example.mysqlite.dao.StudentDao;
import com.example.mysqlite.dto.Student;
import com.example.mysqlite.util.DBhelpUtil;

import java.io.ByteArrayOutputStream;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private Context mContext;

    private EditText etName,etSex,etAge,etClass;
    private EditText etSelectID,etDeleteID;
    private Button btnSave,btnSelect,btnDelete,btnSaveBitmap,btnSelectBitmap,btnUpdate;
    private TextView textView;
    private ImageView imageView;

    private DBhelpUtil dBhelpUtil;
    private StudentDao studentDao;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;

        etName = findViewById(R.id.et_name);
        etSex = findViewById(R.id.et_sex);
        etAge = findViewById(R.id.et_age);
        etClass = findViewById(R.id.et_class);

        etSelectID =findViewById(R.id.et_select_id);
        etDeleteID = findViewById(R.id.et_delete_id);

        textView =findViewById(R.id.tv_data);
        imageView = findViewById(R.id.iv_image);

        //按钮
        btnSave = findViewById(R.id.tbn_save);
        btnSelect = findViewById(R.id.tbn_select);
        btnDelete = findViewById(R.id.tbn_delete);
        btnSaveBitmap = findViewById(R.id.btn_save_bitmap);
        btnSelectBitmap = findViewById(R.id.tbn_select_bitmap);
        btnUpdate = findViewById(R.id.btn_update);



        /**
         *
         * @param context   上下文
         * @param name      数据库名字
         * @param factory   游标工厂 null
         * @param version   自定义的数据库版本
         */
        dBhelpUtil = new DBhelpUtil(mContext,DBhelpUtil.DB_NAME,null,DBhelpUtil.DB_VERSION);
        studentDao = new StudentDao(MainActivity.this,dBhelpUtil);
        //保存数据事件
        btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //保存数据方法
                setDataSave();
            }
        });


        // 查询事件
        btnSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               //查询数据
                selectDataByID();
            }
        });

        //修改事件
        btnUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                updateData();
            }
        });

        //删除事件
        btnDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                deleteDataById();
            }
        });

        //跟新数据库版本后 增加了字段插入图片
        btnSaveBitmap.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    // 获取文本信息
                    Student student = new Student();
                    student.name = etName.getText().toString();
                    student.sex = etSex.getText().toString();
                    student.age = Integer.valueOf(etAge.getText().toString());
                    student.clazz = etClass.getText().toString();

                    //图片
                    // 获取图片位图
                    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.logo);
                    //字节数组输出流
                    ByteArrayOutputStream out = new ByteArrayOutputStream();
                    /** 把位图 转换 成字节数组输出流
                     *CompressFormat format,  格式
                     * int quality, 质量 0 - 100
                     * OutputStream stream 输出流
                     */
                    bitmap.compress(Bitmap.CompressFormat.JPEG,100,out);

                    student.logoHead = out.toByteArray();

                    studentDao.saveBitmap(student);
                    showToast("保存数据成功!");
                }catch (Exception e){
                    showToast("保存数据失败"+e.getMessage());
                }

            }
        });

        //查询展示图片
        btnSelectBitmap.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                selectBitmapMethod();
            }
        });

    }




    /**保存数据*/
    public void setDataSave(){
        try {

            Student student = new Student();
            student.name = etName.getText().toString();
            student.sex = etSex.getText().toString();
            student.age = Integer.valueOf(etAge.getText().toString());
            student.clazz = etClass.getText().toString();

            Long result = studentDao.save(student);

            if(result != -1){
//                       Toast.makeText(getApplication(),"保存数据成功!返回插入行号是["+result+"]",Toast.LENGTH_SHORT).show();
                showToast("保存数据成功!返回插入行号是["+result+"]");
            }else{
                showToast("保存数据失败result["+result+"]");
            }

        }catch ( Exception e){
            e.printStackTrace();
        }
    }

    /**查询数据*/
    public void selectDataByID(){
        Long id = etSelectID.getText().toString().equals("") || etSelectID.getText().toString().equals(null) ? null:Long.valueOf(etSelectID.getText().toString());
        List<Student> data = studentDao.select(id);

        if(data.equals(null) || data.size() == 0){
            textView.setText("没有查到数据!");
        }else {
            textView.setText(data.toString());
        }

    }

    /**删除数据*/
    public  void deleteDataById(){
        Long id = etDeleteID.getText().toString().equals("") || etDeleteID.getText().toString().equals(null) ? null : Long.valueOf(etDeleteID.getText().toString());
        int result = studentDao.delete(id);
        if(result != 0){
            showToast("删除数据成功!删除了["+result+"]条记录!");
        }else{
            showToast("删除数据失败result["+result+"]");
        }


    }

    /**查询展示图片*/
    public void selectBitmapMethod(){
        try {
            Long id = etSelectID.getText().toString().equals("") || etSelectID.getText().toString().equals(null) ? 1:Long.valueOf(etSelectID.getText().toString());
            Student data = studentDao.selectBitmapById(id);
            if(data != null){
                // 把数据显示到页面
                etName.setText(data.name);
                etSex.setText(data.sex);
                etAge.setText(data.age+"");
                etClass.setText(data.clazz);
                //有数据再转
                if(data.logoHead != null){
                    textView.setText(" ");
                    // 把字节数组 转成位图
                    Bitmap bitmap = BitmapFactory.decodeByteArray(data.logoHead,0,data.logoHead.length);
                    imageView.setImageBitmap(bitmap);
                }else{
                    textView.setText("没有图片数据!");
                }

            }else{
                textView.setText("没有查到数据!");
            }



        }catch (Exception e){
            e.printStackTrace();
            showToast("查询失败"+e.getMessage());
        }

    }

    /**更新**/
    public void updateData(){
        Long id = etDeleteID.getText().toString().equals("") || etDeleteID.getText().toString().equals(null) ? 1 : Long.valueOf(etDeleteID.getText().toString());

        Student student = new Student();
        student.name = etName.getText().toString();
        student.sex = etSex.getText().toString();
        student.age = Integer.valueOf(etAge.getText().toString());
        student.clazz = etClass.getText().toString();

        int result = studentDao.updateById(student,id);
        if(result != 0){
            showToast("修改数据成功!修改了["+result+"]条记录!");
        }else{
            textView.setText("没有【"+ id +"】这条记录!");
            showToast("修改数据失败result["+result+"]");
        }

    }

    public void showToast(String msg) {
        Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();
    }

    //异步弹框
    public void showToastSync(String msg) {
        Looper.prepare();
        Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();
        Looper.loop();
    }
}

布局 activity_main.xml

<?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">
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="SQLite 简单应用:"
    android:textSize="24sp"
    />
    <LinearLayout
        android:layout_marginLeft="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="24sp"
            android:text="姓名:"
            />

        <EditText
            android:id="@+id/et_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="24sp"
            />
    </LinearLayout>

    <LinearLayout
        android:layout_marginLeft="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="24sp"
            android:text="性别:"
            />

        <EditText
            android:id="@+id/et_sex"
            android:inputType="text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="24sp"
            />
    </LinearLayout>

    <LinearLayout
        android:layout_marginLeft="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="24sp"
            android:text="年龄:"
            />

        <EditText
            android:id="@+id/et_age"
            android:inputType="number"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="24sp"
            />
    </LinearLayout>

    <LinearLayout
        android:layout_marginLeft="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="24sp"
            android:text="班级:"
            />

        <EditText
            android:id="@+id/et_class"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="24sp"
            />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <Button
            android:id="@+id/tbn_save"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="保存数据"
            android:textSize="14sp"/>

        <Button
            android:id="@+id/btn_save_bitmap"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="更新数据库版本后保存图片"
            android:textSize="12sp"/>
    </LinearLayout>



    <!-- 查询-->
    <LinearLayout
        android:layout_marginLeft="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <EditText
            android:inputType="number"
            android:id="@+id/et_select_id"
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:textSize="24sp"
            />

        <Button
            android:id="@+id/tbn_select"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="查询数据"
            android:textSize="12sp"/>
        <Button
            android:id="@+id/tbn_select_bitmap"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="根据id查询图片"
            android:textSize="12sp"/>


    </LinearLayout>

    <!-- 删除-->
    <LinearLayout
        android:layout_marginLeft="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <EditText
            android:inputType="number"
            android:id="@+id/et_delete_id"
            android:layout_width="80dp"
            android:layout_height="wrap_content"
            android:textSize="24sp"
            />

        <Button
            android:id="@+id/tbn_delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="删除数据"
            android:textSize="14sp"/>
        <Button
            android:id="@+id/btn_update"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="根据id修改"
            android:textSize="12sp"/>


    </LinearLayout>

    <ScrollView
        android:background="#ccc"
        android:layout_width="match_parent"
        android:layout_height="120dp">

        <!-- 显示查询结果-->
        <TextView
            android:layout_marginLeft="10dp"
            android:textColor="#ff00ff00"
            android:textSize="22sp"
            android:id="@+id/tv_data"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </ScrollView>


    <ImageView
        android:id="@+id/iv_image"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

</LinearLayout>

源码地址:GitCode - 开发者的代码家园

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

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

相关文章

JSP迭代标签之 forEach循环标签 基本使用讲解

好 之前我们讲完了 我们的条件动作标签 那么 我们来继续说 迭代标签 所谓迭代就是 将某个主体循环多次 也可以循环 集合 对象 map 这个标签叫 forEach items 就是 我们要循环的数据 注意 这里 操作的也是域对象中的值 begin 开始说 例如 i 0;i<x;i begin 就是开始数 当前…

COMSOL Multiphysics-软件功能详细介绍 COMSOL怎么创建3D模型

Comsol Multiphysics 是一款功能强大的多物理场建模和仿真软件&#xff0c;适用于 Mac 平台。它被广泛应用于工程、科学和研究领域&#xff0c;可以模拟和分析各种物理现象和工程问题。 使用 Comsol Multiphysics&#xff0c;用户可以建立复杂的物理模型&#xff0c;包括热传导…

如何控制Spring工厂创建对象的次数?详解Spring对象的声明周期!

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

elementui的table合并列,三个一组

<el-table :span-method"objectSpanMethod" :cell-style"iCellStyle" :data"tableData" height"63vh" border style"width: 100%; margin-top: 6px"><el-table-column type"index" label"序号"…

RK3568平台开发系列讲解(Linux系统篇)通过OF函数获取设备树中断信息实验

** 🚀返回专栏总目录 文章目录 一、获取中断资源API详解二、设备树三、驱动程序沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍通过OF函数获取设备树中断信息 。 一、获取中断资源API详解 ① irq_of_parse_and_map 函数 该函数的主要功能是解析设备节点…

Rust UI开发(四):iced中如何添加菜单栏(串口调试助手)

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 这是一个系列博文&#xff0c;本文是第四篇&#xff0c;前三篇链接&#xff1a; 1、Rust UI开发&#xff08;一&#xff09;&#xff1a;使用iced构建UI时…

Doris_Doris导入常见问题

Doris数据导入错误 &#xff1a;the length of input is too larger than schema 可能原因&#xff1a;varchar长度设置过短 Doris表字段乱序 导入palo表中的csv本身无schema信息&#xff0c;csv与palo表字段顺序必须一致&#xff0c;否则会错乱 Doris数据文件中字段比表字段…

linux文件管理命令_切换创建复制移动删除查看修改

1.3 文件管理命令 1.3.1 cd&#xff1a;切换目录&#xff08;change directory&#xff09; cd 绝对路径/相对路径 # 根目录 [rootlocalhost ~]# cd / # 家目录 [rootlocalhost /]# cd [rootlocalhost /]# cd ~ # 父级目录 [rootlocalhost /]# cd .. # 返回上一次目录 [roo…

【vue】v-model在表单元素上的应用

表单元素&#xff1a; https://blog.csdn.net/m0_67930426/article/details/134655644 使用模板 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head><body>&l…

订单管理系统怎么用?有哪些好用的订单管理系统?

订单管理系统怎么用&#xff1f;有哪些好用的订单管理系统&#xff1f;阅读本文你将了解&#xff1a;1、订单管理系统的核心功能&#xff1b;2、订单管理系统的拓展功能&#xff1b;3、订单管理系统推荐。 订单管理系统在当今商业环境中扮演着至关重要的角色。它是企业内部运营…

Flink-执行拓扑图与作业调度

算子与作业提交 一、Flink执行模式1.流执行模式2.批执行模式 二、Flink拓扑图1.基本概念2.拓扑图生成过程 三、拓扑生成和优化1.应用程序2.逻辑视图3.算子链4.Task Slots 四、作业调度1.调度2.拓扑图数据结构3.Job状态转化4.Task状态转化 总结参考链接 一、Flink执行模式 Flin…

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《基于深度强化学习的城市配电网多级动态重构优化运行方法》

这个标题涉及到城市配电网&#xff08;Urban Power Distribution Network&#xff09;的优化运行方法&#xff0c;其中使用了深度强化学习&#xff08;Deep Reinforcement Learning&#xff09;技术&#xff0c;并且特别强调了多级动态重构。 解读每个关键部分&#xff1a; 基…

Docker 概述与安装

文章目录 1. Docker简介2. 传统虚拟机和容器3. Docker运行速度快的原因4. Docker软件4.1 Docker镜像4.2 Docker容器4.3 Docker仓库 5. Docker架构6. CentOS安装Docker6.1 卸载旧版本6.2 配置yum资源库6.3 安装Docker引擎6.4 启动docker引擎6.5 设置开机自启 7. 卸载Docker8. 运…

【C++初阶】五、类和对象(日期类的完善、流运算符重载函数、const成员、“”取地址运算符重载)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【C初阶】四、类和对象 &#xff08;构造函数、析构函数、拷贝构造函数、赋值运算符重载函数&#xff09;-CSDN博客 一 . 日期类的完善 此次日期类的成员函数&#xff0c;采用声明…

Flink Flink中的合流

一、Flink中的基本合流操作 在实际应用中&#xff0c;我们经常会遇到来源不同的多条流&#xff0c;需要将它们的数据进行联合处理。所以 Flink 中合流的操作会更加普遍&#xff0c;对应的 API 也更加丰富。 二、联合&#xff08;Union&#xff09; 最简单的合流操作&#xf…

EZDML基本介绍

一、表结构设计器(EZDML) 这是一个数据库建表的小软件&#xff0c;可快速的进行数据库表结构设计&#xff0c;建立数据模型。类似大家常用的数据库建模工具如PowerDesigner、ERWIN、ER-Studio和Rational-Rose等的超级精简版。 官方下载地址&#xff1a;http://www.ezdml.com/d…

解析javascript数组方法 find 和 filter 有何区别

首先用一个案例可以很直观的看到 find 和 filter 的区别&#xff1b; 相同点&#xff1a; 两者分别可以接受三个参数&#xff1a;当前元素、当前索引、整个数组&#xff1b;两者都可以用来查找数组中符合条件的元素&#xff1b; 不同点&#xff1a; find&#xff1a; 用于查…

docker镜像管理命令

镜像管理命令 docker build : 命令用于使用 Dockerfile 创建镜像 docker build [OPTIONS] PATH | URL | - OPTIONS说明&#xff1a; --add-host :向hosts文件中添加自定义 host:ip 映射 --build-arg[] :设置镜像创建时的变量&#xff1b; --cache-from :指定镜像用作当前构建…

华为ospf和isis双点双向路由重分布的次优路径和环路终极解决方案

r5上直接导入直连路由 r3和r2进行双点双向路由重分布 查看R3去往R5产生了次优路径&#xff1a; 因为是R2先互相引入的isis和ospf&#xff0c;所以R3会产生次优路径&#xff0c;如果是R3先相互引入ospf和isis&#xff0c;那就是R2去R5会产生次优路径&#xff0c;而R3本身不会。…

华为设备使用python实现文件自动保存下载

实验目的&#xff1a; 公司有一台CE12800的设备&#xff0c;管理地址为172.16.1.2&#xff0c;现在需要编写自动化脚本&#xff0c;STELNET实现设备的自动保存配置文件&#xff0c;使用SFTP实现设备的文件下载。 实验拓扑&#xff1a; 实验步骤&#xff1a; 步骤1&#xff1…