数据库SQLite

1.简单创建一个数据库和删除一个数据库 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_database_create"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="创建数据库"android:textColor="@color/black"android:textSize="17sp" /><Buttonandroid:id="@+id/btn_database_delete"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="删除数据库"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout><TextViewandroid:id="@+id/tv_database"android:layout_width="match_parent"android:layout_height="wrap_content"android:paddingLeft="5dp"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout>
package com.tiger.chapter06;import androidx.appcompat.app.AppCompatActivity;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;public class DatabaseActivity extends AppCompatActivity implements View.OnClickListener {private String mDatabaseName;private TextView tv_database;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_database);findViewById(R.id.btn_database_create).setOnClickListener(this);findViewById(R.id.btn_database_delete).setOnClickListener(this);tv_database = findViewById(R.id.tv_database);//生成一个测试数据库的完整路径mDatabaseName = getFilesDir() + "/test.db";}@Overridepublic void onClick(View v) {if (R.id.btn_database_create == v.getId()) {//创建或打开数据库。数据库如果不存在就创建它,如果存在就打开它//上下文就是可以获取 公共的东西 的对象 ,达成共识的/*** 1. 数据库创建路径* 2. 设置为私有的 外界应用访问不了* 3. 游标工厂 做数据库查询的*/SQLiteDatabase db = openOrCreateDatabase(mDatabaseName, Context.MODE_PRIVATE, null);String desc = String.format("数据库%s创建%s", db.getPath(), (db != null) ? "成功" : "失败");tv_database.setText(desc);} else {//删除数据库//把路径传进去boolean b = deleteDatabase(mDatabaseName);String desc = String.format("数据库%s删除%s",mDatabaseName, b  ? "成功" : "失败");tv_database.setText(desc);}}
}

2.SQLiteOpenHelper

 

1.封装类 

package com.tiger.chapter06.database;import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;import androidx.annotation.Nullable;import com.tiger.chapter06.entity.User;import java.util.ArrayList;
import java.util.List;public class UserDBHelper extends SQLiteOpenHelper {private static final String DB_NAME = "user.db";private static final int DB_VERSION = 1;private static final String TABLE_NAME = "user_info";private static UserDBHelper mHelper = null;private SQLiteDatabase mRDB = null;private SQLiteDatabase mWDB = null;private UserDBHelper(@Nullable Context context) {super(context, DB_NAME, null, DB_VERSION);}//利用单例模式获取数据库帮助其的唯一实例  没有那么大的并发量 所以不用加锁public static UserDBHelper getInstance(Context context) {if (mHelper == null) {mHelper = new UserDBHelper(context);}return mHelper;}//打开数据库的读连接public SQLiteDatabase openReadLink() {if (mRDB == null || !mRDB.isOpen()) {mRDB = mHelper.getReadableDatabase();}return mRDB;}//打开数据库的写连接public SQLiteDatabase openWriteLink() {if (mWDB == null || !mWDB.isOpen()) {mWDB = mHelper.getWritableDatabase();}return mWDB;}//关闭数据库连接public void closeLink() {if (mRDB != null && mRDB.isOpen()) {mRDB.close();mRDB = null;}if (mWDB != null && mWDB.isOpen()) {mWDB.close();mWDB = null;}}//创建数据库,执行建表语句@Overridepublic void onCreate(SQLiteDatabase db) {String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" +"_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +" name VARCHAR NOT NULL," +" age INTEGER NOT NULL," +" height LONG NOT NULL," +" weight FLOAT NOT NULL," +" married INTEGER NOT NULL);";db.execSQL(sql);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}public long insert(User user) {ContentValues values = new ContentValues();values.put("name", user.name);values.put("age", user.age);values.put("height", user.height);values.put("weight", user.weight);values.put("married", user.married);// 执行插入记录动作,该语句返回插入记录的行号// 如果第三个参数values 为Null或者元素个数为0, 由于insert()方法要求必须添加一条除了主键之外其它字段为Null值的记录,// 为了满足SQL语法的需要, insert语句必须给定一个字段名 ,如:insert into person(name) values(NULL),// 倘若不给定字段名 , insert语句就成了这样: insert into person() values(),显然这不满足标准SQL的语法。// 如果第三个参数values 不为Null并且元素的个数大于0 ,可以把第二个参数设置为null 。long result = mWDB.insert(TABLE_NAME, null, values);return result;}public long deleteByName(String name) {//删除所有
//        mWDB.delete(TABLE_NAME,"1=1",null);//返回影响的行数return mWDB.delete(TABLE_NAME, "name=?", new String[]{name});}public long update(User user) {ContentValues values = new ContentValues();values.put("name", user.name);values.put("age", user.age);values.put("height", user.height);values.put("weight", user.weight);values.put("married", user.married);//返回被影响的行数long result = mWDB.update(TABLE_NAME, values, "name=?", new String[]{user.name});return result;}public List<User> queryAll() {List<User> list = new ArrayList<>();
//执行记录查询 ,该语句返回结果集游标Cursor cursor = mRDB.query(TABLE_NAME, null, null, null, null, null, null, null);
//循环取出游标指向的每条记录while (cursor.moveToNext()){User user = new User();user.id = cursor.getInt(0);user.name = cursor.getString(1);user.age = cursor.getInt(2);user.height = cursor.getLong(3);user.weight = cursor.getFloat(4);//SQLite没有布尔型,用0表示false,用1表示trueuser.married = (cursor.getInt(5) == 0) ? false : true;list.add(user);}return list;}public List<User> queryByName(String name) {List<User> list = new ArrayList<>();
//执行记录查询 ,该语句返回结果集游标Cursor cursor = mRDB.query(TABLE_NAME, null, "name=?", new String[]{name}, null, null, null, null);
//循环取出游标指向的每条记录while (cursor.moveToNext()){User user = new User();user.id = cursor.getInt(0);user.name = cursor.getString(1);user.age = cursor.getInt(2);user.height = cursor.getLong(3);user.weight = cursor.getFloat(4);//SQLite没有布尔型,用0表示false,用1表示trueuser.married = (cursor.getInt(5) == 0) ? false : true;list.add(user);}return list;}}

2.User实体类

package com.tiger.chapter06.entity;public class User {public int id; // 序号public String name; // 姓名public int age; // 年龄public long height; // 身高public float weight; // 体重public boolean married; // 婚否public User(){}public User(String name, int age, long height, float weight, boolean married) {this.name = name;this.age = age;this.height = height;this.weight = weight;this.married = married;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +", height=" + height +", weight=" + weight +", married=" + married +'}';}}

3.Activity

package com.tiger.chapter06;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;import com.tiger.chapter06.database.UserDBHelper;
import com.tiger.chapter06.entity.User;
import com.tiger.chapter06.utils.ToastUtlis;import java.util.List;public class SQLiteHelperActivity extends AppCompatActivity implements View.OnClickListener {private EditText et_name;private EditText et_age;private EditText et_height;private EditText et_weight;private CheckBox ck_married;private UserDBHelper mHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sqlite_helper);et_name = findViewById(R.id.et_name);et_age = findViewById(R.id.et_age);et_height = findViewById(R.id.et_height);et_weight = findViewById(R.id.et_weight);ck_married = findViewById(R.id.ck_married);findViewById(R.id.btn_save).setOnClickListener(this);findViewById(R.id.btn_delete).setOnClickListener(this);findViewById(R.id.btn_update).setOnClickListener(this);findViewById(R.id.btn_query).setOnClickListener(this);}@Overrideprotected void onStart() {super.onStart();mHelper = UserDBHelper.getInstance(this);//打开数据库帮助器的读写连接mHelper.openReadLink();mHelper.openWriteLink();}@Overrideprotected void onStop() {super.onStop();mHelper.closeLink();}@Overridepublic void onClick(View v) {String name = et_name.getText().toString();String age = et_age.getText().toString();String height = et_height.getText().toString();String weight = et_weight.getText().toString();User user = null;if (v.getId() == R.id.btn_save){// 以下声明一个用户信息对象,并填写它的各字段值user = new User(name,Integer.parseInt(age),Long.parseLong(height),Float.parseFloat(weight),ck_married.isChecked());if (mHelper.insert(user) > 0) {ToastUtlis.show(this, "添加成功");}}else if (v.getId() == R.id.btn_delete){if (mHelper.deleteByName(name) > 0) {ToastUtlis.show(this, "删除成功");}}else if (v.getId() == R.id.btn_update){user = new User(name,Integer.parseInt(age),Long.parseLong(height),Float.parseFloat(weight),ck_married.isChecked());if (mHelper.update(user) > 0) {ToastUtlis.show(this, "修改成功");}}else if (v.getId() == R.id.btn_query){List<User> list = mHelper.queryByName(name);list.stream().forEach(u->{Log.d("JMJ",u.toString());});}}
}

4.布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="5dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_name"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="姓名:"android:textColor="@color/black"android:textSize="17sp" /><EditTextandroid:id="@+id/et_name"android:layout_width="0dp"android:layout_height="match_parent"android:layout_marginTop="3dp"android:layout_marginBottom="3dp"android:layout_weight="1"android:background="@drawable/edit_select"android:hint="请输入姓名"android:inputType="text"android:maxLength="12"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_age"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="年龄:"android:textColor="@color/black"android:textSize="17sp" /><EditTextandroid:id="@+id/et_age"android:layout_width="0dp"android:layout_height="match_parent"android:layout_marginTop="3dp"android:layout_marginBottom="3dp"android:layout_weight="1"android:background="@drawable/edit_select"android:hint="请输入年龄"android:inputType="number"android:maxLength="2"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_height"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="身高:"android:textColor="@color/black"android:textSize="17sp" /><EditTextandroid:id="@+id/et_height"android:layout_width="0dp"android:layout_height="match_parent"android:layout_marginTop="3dp"android:layout_marginBottom="3dp"android:layout_weight="1"android:background="@drawable/edit_select"android:hint="请输入身高"android:inputType="numberDecimal"android:maxLength="5"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_weight"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="体重:"android:textColor="@color/black"android:textSize="17sp" /><EditTextandroid:id="@+id/et_weight"android:layout_width="0dp"android:layout_height="match_parent"android:layout_marginTop="3dp"android:layout_marginBottom="3dp"android:layout_weight="1"android:background="@drawable/edit_select"android:hint="请输入体重"android:inputType="numberDecimal"android:maxLength="5"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout><CheckBoxandroid:id="@+id/ck_married"android:layout_width="wrap_content"android:layout_height="wrap_content"android:checked="false"android:gravity="center"android:text="已婚"android:textColor="@color/black"android:textSize="17sp" /><Buttonandroid:id="@+id/btn_save"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="添加"android:textColor="@color/black"android:textSize="17sp" /><Buttonandroid:id="@+id/btn_delete"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="删除"android:textColor="@color/black"android:textSize="17sp" /><Buttonandroid:id="@+id/btn_update"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="修改"android:textColor="@color/black"android:textSize="17sp" /><Buttonandroid:id="@+id/btn_query"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="查询"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout>

3.事务管理

    public long insert(User user) {ContentValues values = new ContentValues();values.put("name", user.name);values.put("age", user.age);values.put("height", user.height);values.put("weight", user.weight);values.put("married", user.married);// 执行插入记录动作,该语句返回插入记录的行号// 如果第三个参数values 为Null或者元素个数为0, 由于insert()方法要求必须添加一条除了主键之外其它字段为Null值的记录,// 为了满足SQL语法的需要, insert语句必须给定一个字段名 ,如:insert into person(name) values(NULL),// 倘若不给定字段名 , insert语句就成了这样: insert into person() values(),显然这不满足标准SQL的语法。// 如果第三个参数values 不为Null并且元素的个数大于0 ,可以把第二个参数设置为null 。
//        long result = mWDB.insert(TABLE_NAME, null, values);try {mWDB.beginTransaction();mWDB.insert(TABLE_NAME,null,values);
//           int i =1/0;mWDB.insert(TABLE_NAME,null,values);mWDB.setTransactionSuccessful();//成功就提交}catch (Exception e){e.printStackTrace();}finally {mWDB.endTransaction();//关闭事务 如果没有提交的话就回滚}return 1;}

 4. 数据库版本升级

package com.tiger.chapter06.database;import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;import androidx.annotation.Nullable;import com.tiger.chapter06.entity.User;import java.util.ArrayList;
import java.util.List;public class UserDBHelper extends SQLiteOpenHelper {private static final String DB_NAME = "user.db";private static final int DB_VERSION = 2;private static final String TABLE_NAME = "user_info";private static UserDBHelper mHelper = null;private SQLiteDatabase mRDB = null;private SQLiteDatabase mWDB = null;private UserDBHelper(@Nullable Context context) {super(context, DB_NAME, null, DB_VERSION);}//利用单例模式获取数据库帮助其的唯一实例  没有那么大的并发量 所以不用加锁public static UserDBHelper getInstance(Context context) {if (mHelper == null) {mHelper = new UserDBHelper(context);}return mHelper;}//打开数据库的读连接public SQLiteDatabase openReadLink() {if (mRDB == null || !mRDB.isOpen()) {mRDB = mHelper.getReadableDatabase();}return mRDB;}//打开数据库的写连接public SQLiteDatabase openWriteLink() {if (mWDB == null || !mWDB.isOpen()) {mWDB = mHelper.getWritableDatabase();}return mWDB;}//关闭数据库连接public void closeLink() {if (mRDB != null && mRDB.isOpen()) {mRDB.close();mRDB = null;}if (mWDB != null && mWDB.isOpen()) {mWDB.close();mWDB = null;}}//创建数据库,执行建表语句@Overridepublic void onCreate(SQLiteDatabase db) {String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" +"_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +" name VARCHAR NOT NULL," +" age INTEGER NOT NULL," +" height LONG NOT NULL," +" weight FLOAT NOT NULL," +" married INTEGER NOT NULL);";db.execSQL(sql);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//版本发送改变的时候会执行里面的方法Log.d("jmj",oldVersion+"");Log.d("jmj",newVersion+"");String sql = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN phone VARCHAR;";db.execSQL(sql);sql = "ALTER TABLE " + TABLE_NAME + " ADD COLUMN password VARCHAR;";db.execSQL(sql);}public long insert(User user) {ContentValues values = new ContentValues();values.put("name", user.name);values.put("age", user.age);values.put("height", user.height);values.put("weight", user.weight);values.put("married", user.married);// 执行插入记录动作,该语句返回插入记录的行号// 如果第三个参数values 为Null或者元素个数为0, 由于insert()方法要求必须添加一条除了主键之外其它字段为Null值的记录,// 为了满足SQL语法的需要, insert语句必须给定一个字段名 ,如:insert into person(name) values(NULL),// 倘若不给定字段名 , insert语句就成了这样: insert into person() values(),显然这不满足标准SQL的语法。// 如果第三个参数values 不为Null并且元素的个数大于0 ,可以把第二个参数设置为null 。
//        long result = mWDB.insert(TABLE_NAME, null, values);try {mWDB.beginTransaction();mWDB.insert(TABLE_NAME,null,values);
//           int i =1/0;mWDB.insert(TABLE_NAME,null,values);mWDB.setTransactionSuccessful();//成功就提交}catch (Exception e){e.printStackTrace();}finally {mWDB.endTransaction();//关闭事务 如果没有提交的话就回滚}return 1;}public long deleteByName(String name) {//删除所有
//        mWDB.delete(TABLE_NAME,"1=1",null);//返回影响的行数return mWDB.delete(TABLE_NAME, "name=?", new String[]{name});}public long update(User user) {ContentValues values = new ContentValues();values.put("name", user.name);values.put("age", user.age);values.put("height", user.height);values.put("weight", user.weight);values.put("married", user.married);//返回被影响的行数long result = mWDB.update(TABLE_NAME, values, "name=?", new String[]{user.name});return result;}public List<User> queryAll() {List<User> list = new ArrayList<>();
//执行记录查询 ,该语句返回结果集游标Cursor cursor = mRDB.query(TABLE_NAME, null, null, null, null, null, null, null);
//循环取出游标指向的每条记录while (cursor.moveToNext()){User user = new User();user.id = cursor.getInt(0);user.name = cursor.getString(1);user.age = cursor.getInt(2);user.height = cursor.getLong(3);user.weight = cursor.getFloat(4);//SQLite没有布尔型,用0表示false,用1表示trueuser.married = (cursor.getInt(5) == 0) ? false : true;list.add(user);}return list;}public List<User> queryByName(String name) {List<User> list = new ArrayList<>();
//执行记录查询 ,该语句返回结果集游标Cursor cursor = mRDB.query(TABLE_NAME, null, "name=?", new String[]{name}, null, null, null, null);
//循环取出游标指向的每条记录while (cursor.moveToNext()){User user = new User();user.id = cursor.getInt(0);user.name = cursor.getString(1);user.age = cursor.getInt(2);user.height = cursor.getLong(3);user.weight = cursor.getFloat(4);//SQLite没有布尔型,用0表示false,用1表示trueuser.married = (cursor.getInt(5) == 0) ? false : true;list.add(user);}return list;}}

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

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

相关文章

wordpress外贸独立站

WordPress外贸电商主题 简洁实用的wordpress外贸电商主题&#xff0c;适合做外贸跨境的电商公司官网使用。 https://www.jianzhanpress.com/?p5025 华强北面3C数码WordPress外贸模板 电脑周边、3C数码产品行业的官方网站使用&#xff0c;用WordPress外贸模板快速搭建外贸网…

Windows Media Player (Win10)

Windows Media Player &#xff08;Win10&#xff09;服务器运行失败 先关闭掉【Windows Media Player】组件&#xff0c;但是要重启计算机 重启计算机后&#xff0c;再开启【Windows Media Player】组件√起来 可以使用了&#xff01;&#xff01;&#xff01;

前缀和和差分以及练习题目

蓝桥杯备赛系列 倒计时50天&#xff01; 前缀和和差分 知识点 前缀和数组&#xff1a; 假设原数组用a[i]表示&#xff0c;前缀和数组用sum[i]表示&#xff0c;那么sum[i]表示的是原数组前i项之和&#xff0c;注意一般用前缀和数组时&#xff0c;原数组a[i]的有效下标是从1开…

最强照片AI无损放大工具

使用人工智能的能力来放大图像&#xff0c;同时为惊人的结果添加自然的细节。 使用深度学习技术&#xff0c;A.I.GigaPixEL可以放大图像并填满其他调整大小的产品所遗漏的细节。 下载地址&#xff1a;最强照片AI无损放大工具.zip

太阳能供电井盖-物联网智能井盖监测系统-旭华智能

在这个日新月异的科技时代&#xff0c;城市的每一个角落都在悄然发生变化。而在这场城市升级的浪潮中&#xff0c;智能井盖以其前瞻性的科技应用和卓越的安全性能&#xff0c;正悄然崭露头角&#xff0c;变身马路上的智能“眼睛”&#xff0c;守护城市安全。 传统的井盖监测系统…

展示模型展台的高度一般为多少---模大狮模型网

展示模型展台的高度一般取决于多个因素&#xff0c;包括展示物品的大小、展台的设计风格、展览场地的限制等。一般来说&#xff0c;展示模型展台的高度可以根据以下几点考虑&#xff1a; 展示物品的大小&#xff1a;如果展示物品比较大或需要竖立展示&#xff0c;展台的高度可能…

【学位论文】上海交通大学 研究生学位论文 本地保存

上海交大研究生学位论文网&#xff1a;http://thesis.lib.sjtu.edu.cn/ &#xff08;只能校内访问或SJTU VPN访问&#xff09; 如果希望下载论文&#xff0c;需要参考&#xff1a;https://github.com/olixu/SJTU_Thesis_Crawler 安装过程 安装过程的几个坑&#xff1a; &a…

【Redis】RedisTemplate和StringRedisTemplate的区别

两者的关系是 StringRedisTemplate 继承 RedisTemplate 。 两者的数据是不共通的&#xff1a;也就是说 StringRedisTemplate 只能管理 StringRedisTemplate 里面的数据&#xff0c;RedisTemplate 只能管理 RedisTemplate 中的数据。 RedisTemplate 看这个类的名字后缀是 Temp…

Cesium实战三:飞行航线动画

飞行航线追踪 可视化从旧金山到哥本哈根的真实航班。 1、获取点位数据&#xff1a;构建飞行跟踪器 – Cesium (cesium.com) 2、在地图上添加飞行点位&#xff1a;循环遍历点位数据&#xff0c;利用Entity直接添加点至地图上。 //添加飞行点位 const addFlightPoint () >…

彻底搞懂CPU特权级

程序员在用户程序开发过程中,会遇到两个基本概念即用户态和内核态&#xff0c;我们所说的模式切换&#xff0c;就是用户态和内核态之间的切换。 用户态和内核态其实是CPU的特权级&#xff0c;所以模式的切换就是CPU特权级的切换&#xff0c;模式等同于特权级&#xff0c;不同的…

Cesium 问题:[Violation]‘requestAnimationFrame‘ handler took 58ms

文章目录 问题分析解决问题 Cesium 在引入页面后,控制台弹出提示信息: [Violation]requestAnimationFrame handler took 58ms分析 这个警告信息表明使用 requestAnimationFrame 方法时,其处理函数执行所需的时间超过了一定阈值,从而触发了警告。requestAnimationFrame 方…

Java+SpringBoot:制造企业质量管理的双引擎

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

mysql高可用架构设计

一、主从架构 主从架构一般如下所示 这里从节点一般设置成只读&#xff08;readonly&#xff09;模式。这样做&#xff0c;有以下几个考虑&#xff1a; 有时候一些运营类的查询语句会被放到备库上去查&#xff0c;设置为只读可以防止误操作&#xff1b; 防止切换逻辑有 bug&a…

Linux——进程池

Linux——进程池 池化技术进程池信道模拟任务进程退出一个bug 今天我们来学习一下管道的应用——进程池。如果有没看过上一篇管道的小伙伴可以点击这里&#xff1a; https://blog.csdn.net/qq_67693066/article/details/136371517 池化技术 我们首先要了解一下池化技术&#x…

StarRocks实战——特来电StarRocks应用实践

目录 一、为何引入StarRocks 二、主要应用场景 三、封装或扩展 四、集群监控预警 五、总结规划展望 5.1 使用经验分享 5.2 下一步计划 5.2.1 StarRocks集群自动安装 5.2.2 StarRocks集群高可用架构 原文大佬的这篇StarRocks应用实践有借鉴意义&#xff0c;这里摘抄下来…

Socket网络编程(三)——TCP快速入门

目录 概述TCP连接可靠性1. 三次握手过程2. 四次挥手过程3. 为什么挥手需要四次&#xff1f; 传输可靠性TCP核心APITCP传输初始化配置&建立连接客户端创建Socket建立连接服务端创建ServerSocket监听连接ServerSocket 和 Socket的关系 Socket基本数据类型传输客户端数据传输服…

AI芯片行业深度:发展现状、竞争格局、市场空间及相关公司深度梳理

从广义上讲只要能够运行人工智能算法的芯片都叫作AI芯片&#xff0c;但通常意义上的AI芯片指的是针对人工智能算法做了特殊加速设计的芯片。AI芯片也被称为AI加速器或计算卡&#xff0c;即专门用于处理人工智能应用中的大量计算任务的模块&#xff08;其他非计算任务仍由CPU负责…

ACwing :1221 四平方和 (二分)

*#include <iostream> #include <cstring> #include <algorithm>using namespace std; const int N 5e6 10; int n;struct sum{int s,c,d;bool operator < (const sum &T)const{ // 重载小于符号if(s ! T.s) return s < T.s;if(c ! T.c) …

day11_oop_fianl_satic_多态

今日内容 零、 复习昨日 一、final 二、static 三、多态 四、向上转型&向下转型 五、多态应用 零、 复习昨日 0 类封装步骤 属性私有private提供setget方法 1 继承关键词,继承的好处 extends减少代码重复为多态做准备 2 子类可以使用父类什么 非私有的属性和方法 3 方法重写…

总结:直径测量的发展历程!在线测径仪已成主要方式!

测量在生活、生产和科学探究中扮演着至关重要的角色。从古至今&#xff0c;人们对测量的探索从未停止。而外径作为一种基础的几何尺寸&#xff0c;其测量也经过了多代发展&#xff0c;直到至今被广泛应用到工业生产中的在线测径仪。本文就来介绍一下外径测量的发展历程&#xf…