安卓第四天筆記-Sqlite

来源:http://www.cnblogs.com/liunanjava/archive/2016/02/27/5204308.html
-Advertisement-
Play Games

安卓第四天筆記-Sqlite 1.資料庫的創建運行與更新 1.1.創建一個類繼承SqliteOpenHelper 1.2.創建構造方法 /** * 資料庫創建類 * @author 劉楠 * * 2016-2-20上午10:04:34 */ public class DbSqliteOpenHelp


安卓第四天筆記-Sqlite

1.資料庫的創建運行與更新

1.1.創建一個類繼承SqliteOpenHelper

 

1.2.創建構造方法

/**

 * 資料庫創建類

    

 * @author 劉楠

 *

 * 2016-2-20上午10:04:34

 */

public class DbSqliteOpenHelper extends SQLiteOpenHelper {

 

     /**

      *

      * @param context 上下文

      * @param name  資料庫的名字如: students.db

      * @param factory  游標工廠 ,類似JDBC中的ResultSet中的hasNext();

      * @param version  資料庫的版本

      */

     public DbSqliteOpenHelper(Context context, String name,

              CursorFactory factory, int version) {

         super(context, name, factory, version);

     }

 

     /**

      * 當資料庫被創建時,執行,

      * 只會執行一次

      */

     @Override

     public void onCreate(SQLiteDatabase db) {

        

 

     }

 

     /**

      * 當數據版本升級時執行,

      * 數據版本只能升不能降 從1開始

      * 這裡常用於更改資料庫中的表的結構,如添加列,刪除列,之類的,創建新的表

      */

     @Override

     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

     }

}

 

 

1.3.更改構造方法

/**

      *

      * @param context 上下文

      * @param name  資料庫的名字如: students.db

      * @param factory  游標工廠 ,類似JDBC中的ResultSet中的hasNext();

      * @param version  資料庫的版本

      */

     public DbSqliteOpenHelper(Context context) {

         super(context, "student.db", null, 1);

     }

 

 

更改後

/**

      *

      * @param context 上下文

      * @param name  資料庫的名字如: students.db

      * @param factory  游標工廠 ,類似JDBC中的ResultSet中的hasNext();

      * @param version  資料庫的版本 這裡的版本必須大於0,如果為0就會報錯

      */

     public DbSqliteOpenHelper(Context context) {

         super(context, "student.db", null, 1);

     }

 

 

源碼中的解釋,資料庫版本必須大於等於0,否則會拋出異常

 

將資料庫版本設置為0,運行

 

不能降版本

 

 

1.4.在onCreate方法中創建資料庫表

/**

      * 當資料庫被創建時,執行,

      * 只會執行一次

      */

     @Override

     public void onCreate(SQLiteDatabase db) {

         //創建資料庫表

         //sql    create table students(_id integer primary key, name varchar(30))

         db.execSQL("create table students(_id integer primary key, name varchar(30))");

         Log.i(TAG, "onCreate 方法執行了");

 

     }

 

 

1.5.在Activity中實例化

 

 

/**

 * 資料庫初始化

    

 * @author 劉楠

 *

 * 2016-2-20上午10:27:04

 */

public class MainActivity extends Activity {

 

     private static final String TAG = "MainActivity";

     private DbSqliteOpenHelper helper;

     @Override

     protected void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);

         setContentView(R.layout.activity_main);

         //實例化

         helper = new DbSqliteOpenHelper(this);

        

         Log.i(TAG, "helper 實例化");

         //執行下方的代碼後才會創建資料庫

         helper.getWritableDatabase();

     }

 

}

 

 

創建資料庫後並不會被創建,只有執行了,getReadDatabase或者getWriteDatabase(),

才會執行onCreate中的方法

 

 

運行查看LOG

 

 

 

1.6.數據已經創建,查看資料庫

 

將資料庫文件導出到桌面

SQLite Expert Professional 3打開

 

 

 

1.7.修改資料庫版本,同是添加一列

 

/**

      * 當數據版本升級時執行,

      * 數據版本只能升不能降 從1開始

      * 這裡常用於更改資料庫中的表的結構,如添加列,刪除列,之類的,創建新的表

      */

     @Override

     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

         Log.i(TAG, "onUpgrade 方法執行了");

        

         //sql alter table  students add gender varchar(10)

        

        

              //添加列

              db.execSQL("alter table  students add gender varchar(10)");

 

     }

 

 

 

 

 

查看日誌

 

1.8.導出資料庫中的文件再次查看

 

 

列已經添加成功

2.傳統方式操作資料庫

使用sql來操作資料庫

/**

 * 傳統資料庫操作工具類

      

 * @author 劉楠

 *

 * 2016-2-20下午12:19:16

 */

public class StudentDao {

      

       private static final String TAG = "StudentDao";

       /*

        * 操作資料庫類

        */

       private DbSqliteOpenHelper helper;

      

       public StudentDao(Context context){

              helper = new DbSqliteOpenHelper(context);

       }

      

       /**

        * 插入方法

        * @param name 姓名

        * @param gender 性別

        * @param stuno 學號

        */

       public void insert(String name,String gender,String stuno){

              //獲取數據

              SQLiteDatabase db = helper.getWritableDatabase();

             

              String sql="insert into students values (null,?,?,?)";

              //填充占位符

              Object [] bindArgs={name,gender,stuno};

              //執行SQL

              db.execSQL(sql, bindArgs);

              //關閉資料庫連接

              db.close();

       }

       /**

        * 修改更改 update

        * @param name 姓名

        * @param gender 性別

        * @param stuno 學號

        */

       public void update(String name,String gender,String stuno){

              //獲取數據

              SQLiteDatabase db = helper.getWritableDatabase();

             

              String sql="update students set gender=?,stuno=? where name=?";

              //填充占位符

              Object [] bindArgs={gender,stuno,name};

              //執行SQL

              db.execSQL(sql, bindArgs);

              //關閉資料庫連接

              db.close();

       }

       /**

        * 刪除

        * @param name 姓名

        */

       public void delete(String name){

              //獲取數據

              SQLiteDatabase db = helper.getWritableDatabase();

             

              String sql="delete from  students where name=?";

              //填充占位符

              Object [] bindArgs={name};

              //執行SQL

              db.execSQL(sql, bindArgs);

              //關閉資料庫連接

              db.close();

       }

       /**

        * 查詢全部

        *

        */

       public void getAll(){

              //獲取數據

              SQLiteDatabase db = helper.getReadableDatabase();

             

              String sql="select _id,name,gender,stuno from students";

 

              //執行SQL

              Cursor cursor = db.rawQuery(sql, null);

             

              while(cursor.moveToNext()){

                     int _id = cursor.getInt(cursor.getColumnIndex("_id"));

                     String name = cursor.getString(cursor.getColumnIndex("name"));

                     String gender = cursor.getString(cursor.getColumnIndex("gender"));

                     String stuno = cursor.getString(cursor.getColumnIndex("stuno"));

                    

                     Log.i(TAG, "_id:"+_id+"name:"+name+",gender:"+gender+",stuno:"+stuno);

              }

              cursor.close();

              //關閉資料庫連接

              db.close();

       }

       /**

        * 查詢全部

        *

        */

       public void getOne(String stuname){

              //獲取數據

              SQLiteDatabase db = helper.getReadableDatabase();

             

              String sql="select _id,name,gender,stuno from students where name=?";

               String[] selectionArgs = {stuname};

              //執行SQL

              Cursor cursor = db.rawQuery(sql, selectionArgs);

             

              while(cursor.moveToNext()){

                     int _id = cursor.getInt(cursor.getColumnIndex("_id"));

                     String name = cursor.getString(cursor.getColumnIndex("name"));

                     String gender = cursor.getString(cursor.getColumnIndex("gender"));

                     String stuno = cursor.getString(cursor.getColumnIndex("stuno"));

                    

                     Log.i(TAG, "_id:"+_id+"name:"+name+",gender:"+gender+",stuno:"+stuno);

              }

              cursor.close();

              //關閉資料庫連接

              db.close();

       }

}

 

 

測試類

/**

 * 測試傳統方式資料庫工具類

      

 * @author 劉楠

 *

 * 2016-2-20下午12:48:37

 */

public class TestStudentDao extends  AndroidTestCase{

 

       private  StudentDao studentDao;

      

       @Override

       protected void setUp() throws Exception {

              studentDao = new StudentDao(getContext());

       }

       /**

        * 測試插入

        */

       public void testInsert(){

              studentDao.insert("lisi", "man", "heimaAndroid2179");

       }

       /**

        * 測試插入

        */

       public void testDelete(){

              studentDao.delete("liunan");

             

       }

       /**

        * 測試修改

        */

       public void testUpdate(){

              studentDao.update("lisi", "女", "33");

       }

       /**

        * 測試查詢全部

        */

       public void testGetAll(){

              studentDao.getAll();

             

       }

       /**

        * 測試查詢一個

        */

       public void testGetOne(){

              studentDao.getOne("lisi");

             

       }

}

 

 

 

3.數據版本判斷與更新

/**

 * 資料庫創建類

      

 * @author 劉楠

 *

 * 2016-2-20上午10:04:34

 */

public class DbSqliteOpenHelper extends SQLiteOpenHelper {

 

       private static final String TAG = "DbSqliteOpenHelper";

 

       /**

        *

        * @param context 上下文

        * @param name  資料庫的名字如: students.db

        * @param factory  游標工廠 ,類似JDBC中的ResultSet中的hasNext();

        * @param version  資料庫的版本 這裡的版本必須大於0,如果為0就會報錯

        */

       public DbSqliteOpenHelper(Context context) {

              super(context, "student.db", null,4);

       }

 

       /**

        * 當資料庫被創建時,執行,

        * 只會執行一次

        * 第二閃運行是就不會執行了

        */

       @Override

       public void onCreate(SQLiteDatabase db) {

              int version = db.getVersion();

              Log.i(TAG, "version:"+version);

              Log.i(TAG, "onCreate 方法執行了");

              if(version==0){

                     db.execSQL("create table students(_id integer primary key autoincrement, name varchar(30),gender varchar(10),stuno varchar(50))");

                     Log.i(TAG, "version=0執行了");

              }else{

                     //創建資料庫表

                     //sql    create table students(_id integer primary key, name varchar(30))

                     db.execSQL("create table students(_id integer primary key autoincrement, name varchar(30))");

                     Log.i(TAG, "version不等0執行了");

              }

                    

             

       }

 

       /**

        * 當數據版本升級時執行,

        * 數據版本只能升不能降 從1開始

        * 這裡常用於更改資料庫中的表的結構,如添加列,刪除列,之類的,創建新的表

        */

       @Override

       public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

              Log.i(TAG, "onUpgrade 方法執行了");

              Log.i(TAG, oldVersion+"");

              Log.i(TAG, newVersion+"");

 

             

              //算出新 舊版本的差

              int difference = newVersion-oldVersion;

             

              switch (difference) {

              case 1:

                     db.execSQL("alter table  students add gender varchar(10)");

                     Log.i(TAG, difference+"");

                     break;

              case 2:

                     db.execSQL("alter table  students add gender varchar(10))");

                     db.execSQL("alter table  students add stuno varchar(50))");

                     Log.i(TAG, difference+"");

                     break;

 

              default:

                     break;

              }

             

             

       }

 

}

 

 

 

4.使用Android提供的API來操作資料庫

/**

 * 使用Android中的API來執行操作資料庫

 *

 * @author 劉楠

 *

 *         2016-2-20下午12:19:16

 */

public class StudentDao2 {

 

       private static final String TAG = "StudentDao2";

       /*

        * 操作資料庫類

        */

       private DbSqliteOpenHelper helper;

 

       public StudentDao2(Context context) {

              helper = new DbSqliteOpenHelper(context);

       }

 

       /**

        * 插入方法

        *

        * @param name

        *            姓名

        * @param gender

        *            性別

        * @param stuno

        *            學號

        */

       public long insert(String name, String gender, String stuno) {

              // 獲取數據

              SQLiteDatabase db = helper.getWritableDatabase();

 

              // 填充占位符

              ContentValues values = new ContentValues();

              values.put("name", name);

              values.put("gender", gender);

              values.put("stuno", stuno);

 

              String nullColumnHack = "values(null,?,?,?)";

              // 執行SQL

              long insert = db.insert("students", nullColumnHack, values);

              // 關閉資料庫連接

              db.close();

              return insert;

       }

 

       /**

        * 修改更改 update

        *

        * @param name

        *            姓名

        * @param gender

        *            性別

        * @param stuno

        *            學號

        */

       public int update(String name, String gender, String stuno) {

              // 獲取數據

              SQLiteDatabase db = helper.getWritableDatabase();

 

              String sql = "update students set gender=?,stuno=? where name=?";

      

              // 填充占位符

              ContentValues values = new ContentValues();

             

              values.put("gender", gender);

              values.put("stuno", stuno);   

              // 執行SQL

              int update = db.update("students", values, " name=?", new String[]{name});

              // 關閉資料庫連接

              db.close();

              return update;

       }

 

       /**

        * 刪除

        *

        * @param name

        *            姓名

        */

       public int delete(String name) {

              // 獲取數據

              SQLiteDatabase db = helper.getWritableDatabase();

 

              // 執行SQL

              int delete = db.delete("students", " name=?", new String[]{name});

              // 關閉資料庫連接

              db.close();

              return delete;

       }

 

       /**

        * 查詢全部

        *

        */

       public void getAll() {

              // 獲取數據

              SQLiteDatabase db = helper.getReadableDatabase();

 

              String sql = "select _id,name,gender,stuno from students";

 

              // 執行SQL

              Cursor cursor = db.query("students", new String[]{"_id","name","gender","stuno"}, null, null, null, null, null);

 

              while (cursor.moveToNext()) {

                     int _id = cursor.getInt(cursor.getColumnIndex("_id"));

                     String name = cursor.getString(cursor.getColumnIndex("name"));

                     String gender = cursor.getString(cursor.getColumnIndex("gender"));

                     String stuno = cursor.getString(cursor.getColumnIndex("stuno"));

 

                     Log.i(TAG, "_id:" + _id + "name:" + name + ",gender:" + gender

                                   + ",stuno:" + stuno);

              }

              cursor.close();

              // 關閉資料庫連接

              db.close();

       }

 

       /**

        * 查詢全部

        *

        */

       public void getOne(String stuname) {

              // 獲取數據

              SQLiteDatabase db = helper.getReadableDatabase();

              // 執行SQL

              Cursor cursor = db.query("students", new String[]{"_id","name","gender","stuno"}, "name =?", new String[]{stuname}, null, null, null);

 

              while (cursor.moveToNext()) {

                     int _id = cursor.getInt(cursor.getColumnIndex("_id"));

                     String name = cursor.getString(cursor.getColumnIndex("name"));

                     String gender = cursor.getString(cursor.getColumnIndex("gender"));

                     String stuno = cursor.getString(cursor.getColumnIndex("stuno"));

 

                     Log.i(TAG, "_id:" + _id + "name:" + name + ",gender:" + gender

                                   + ",stuno:" + stuno);

              }

              cursor.close();

              // 關閉資料庫連接

              db.close();

       }

}

 

 

 

 

測試

 

 

/**

 * 測試傳統方式資料庫工具類

      

 * @author 劉楠

 *

 * 2016-2-20下午12:48:37

 */

public class TestStudentDao2 extends  AndroidTestCase{

 

       private static final String TAG = "TestStudentDao2";

       private  StudentDao2 studentDao2;

      

       @Override

       protected void setUp() throws Exception {

              studentDao2 = new StudentDao2(getContext());

       }

       /**

        * 測試插入

        */

       public void testInsert(){

              long result = studentDao2.insert("lisi", "man", "heimaAndroid2179");

              Log.i(TAG, result+"");

       }

       /**

        * 測試插入

        */

       public void testDelete(){

              int delete = studentDao2.delete("aa");

              Log.i(TAG, delete+"");

             

       }

       /**

        * 測試修改

        */

       public void testUpdate(){

              int update = studentDao2.update("lisi", "hh", "33");

              Log.i(TAG, update+"");

       }

       /**

        * 測試查詢全部

        */

       public void testGetAll(){

              studentDao2.getAll();

             

       }

       /**

        * 測試查詢一個

        */

       public void testGetOne(){

              studentDao2.getOne("gh");

             

       }

}

 

 

 

5.創建一個學生信息錄入,使用ListView展示信息baseAdapter

 

 

 

佈局

<LinearLayout 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"

    android:orientation="vertical"

    android:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    tools:context=".MainActivity" >

 

    <TextView

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:gravity="center_horizontal"

        android:text="學生信息管理系統"

        android:textColor="#77ff0000"

        android:textSize="29sp" />

 

    <EditText

        android:id="@+id/et_name"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:hint="請輸入學生姓名" />

    <!-- 性別 -->

 

    <RadioGroup

        android:id="@+id/rgp"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal" >

 

        <!-- 性別男 -->

 

        <RadioButton

            android:id="@+id/rb_male"

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:checked="true"

            android:text="male" />

        <!-- 性別女 -->

 

        <RadioButton

            android:id="@+id/rb_female"

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:text="female" />

    </RadioGroup>

 

    <!-- 保存 -->

 

    <Button

        android:id="@+id/btn_save"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="保存" />

    <!-- 查詢 -->

 

    <Button

        android:id="@+id/btn_querty"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="查詢全部學生信息" />

 

    <ListView

        android:id="@+id/lv_item"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:divider="#ff0000"

        android:dividerHeight="2dp">

    </ListView>

 

</LinearLayout>

 

 

ListView要使用的佈局

 

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="wrap_content" >

 

    <ImageView

        android:id="@+id/iv_sex"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_centerVertical="true"

        android:layout_margin="20dp"

        android:src="@drawable/mr" />

 

    <RelativeLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_margin="10dp"

        android:layout_toRightOf="@id/iv_sex" >

 

        <TextView

            android:id="@+id/tv_no"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="學號" />

 

        <TextView

            android:id="@+id/tv_name"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_below="@id/tv_no"

            android:text="姓名" />

 

        <ImageView

            android:id="@+id/iv_delete"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_alignParentRight="true"

            android:layout_centerVertical="true"

            android:layout_margin="20dp"

            android:src="@drawable/delete" />

    </RelativeLayout>

 

</RelativeLayout>

 

 

 

 

資料庫創建類

 

/**

 * 資料庫創建類,與維護的類 繼承SQLiteOpenHelper

      

 * @author 劉楠

 *

 * 2016-2-20下午6:32:00

 */

public class StudentSqliteOpenHelper extends SQLiteOpenHelper {

 

       private static final String TAG = "StudentSqliteOpenHelper";

 

       public StudentSqliteOpenHelper(Context context) {

              super(context, "student.db", null, 2);

       }

 

       /**

        * 創建資料庫時,執行一次,只執行一次

        * 用來創建數據表

        */

       @Override

       public void onCreate(SQLiteDatabase db) {

              Log.i(TAG, "onCreate執行了");

              //獲取原來的版本,獲取不到為0

              int version = db.getVersion();

              if(version==0){

                     //創建表

                     String sql= "create table students ( _id integer primary key autoincrement,  name varchar(30),gender varchar(10))";

                     db.execSQL(sql);

              }else{

                     //創建表

                     String sql= "create table students ( _id integer primary key autoincrement,  name varchar(30))";

                     db.execSQL(sql);

              }

       }

 

       /**

        * 當資料庫版本發生變化時執行

        */

       @Override

       public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

              Log.i(TAG, "onUpgrade執行了");

             

              switch (oldVersion) {

              case 1:

                     String sql= "alter table students add gender varchar(10)";

                     db.execSQL(sql);

                     break;

              case 2:

                    

                     break;

 

              default:

                     break;

              }

       }

 

}

 

 

 

 

實體類

 

/**

 * 學生的封裝類

 *

 * @author 劉楠

 *

 *         2016-2-20下午6:31:20

 */

public 	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 很多天之前就安裝了visual studio community 2015,今天閑著麽事想試一下Apache Cordova,用它來開發跨平臺App。在這之前需要配置N多東西,這裡找到了一篇MS官方文章:配置 Visual Studio Tools for Apache Cordova。看著這片文章
  • http://pan.baidu.com/share/link?shareid=3506499606&uk=4278629985&app=zd
  • RecyclerView是加強版的ListView,用於在有限的視窗中展示大量的數據,而LoadMoreRecyclerView則是為RecyclerView增加了載入更多的功能,先來看效果: 三種載入方式: 自動載入: 手動載入: 使用圖片動畫載入: 項目簡介: demo中的下拉刷新採用的是Swi
  • AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.y
  • AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.y
  • 本文簡單介紹了Android(Linux)串口驅動線路規程的使用。
  • 分類:C#、Android、VS2015; 創建日期:2016-02-28 一、簡介 廣播(Broadcast):其功能類似於收音機的廣播,你只要調到那個台(只要在接收的類中註冊了要接收的廣播),就能收到這個台播放的信息。 通知(Notifications):安卓的服務組件(Android Serv
  • 在iOS開發過程中,我一直習慣於使用C語法里的基本類型,而很少用(除非必須使用)Foundation的數據類型。最近看了一些資料,發現自己這樣寫可能有風險,雖然目前沒遇到過相關的問題,但這是非常需要註意的一點。 新博客 "wossoneri.com" 壞習慣的開端 初寫iOS時,我做的是把原項目從
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...