Android SQlite數據庫使用詳解

概述

SQLite 一個非常流行的嵌入式數據庫,它支持 SQL 語言,並且只利用很少的內存就有很好的性能。此外它還是開源的,任何人都可以使用它。

查看模擬器數據庫傳送門: Android Studio查看SQLite數據庫方法大全

SQLite使用

SQLite數據庫創建

Android提供了一個SQLiteOpenHelper幫助類,用於對數據庫進行創建和升級
SQLiteOpenHelper是一個抽象類,使用時需要創建自己的類去繼承它。
SQLiteOpenHelper有兩個抽象方法onCreate()onUpgrade(),必須在自己的類中重寫這兩個方法,然後分別在這兩個方法中實現創建升級數據庫的邏輯。

public class DBOpenHelper extends SQLiteOpenHelper {
    public DBOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //創建數據庫sql語句並執行
        String sql="create table user(id integer primary key autoincrement,username varchar(20),password varchar(20),age integer)";
        db.execSQL(sql);

    }

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

    }
}

增加數據

public long insert(String table, String nullColumnHack, ContentValues values) ;

方法參數:

table 表名
nullColumnHack 可選參數,當values參數爲空時,指定哪個字段設置爲null,如果values不爲空,則該參數值可以爲空
values 指定具體的字段,相當於map集合,鍵值對的形式存儲
返回值 返回插入成功的行數,如果爲-1表示失敗

實例:
SQLiteOpenHelper中還有兩個非常重要的實例方法: getReadableDatabase()getWritableDatabase()
這兩個方法都可以創建或打開一個現有的數據庫(如果數據庫已存在則直接打開,否則創建一個新的數據庫),並返回一個可對數據庫進行讀寫操作的對象。
不同的是,當數據庫不可寫入的時候(如磁盤空間已滿),
getReadableDatabase()方法返回的對象將以只讀的方式去打開數據庫
getWritableDatabase()方法則將出現異常

 DBOpenHelper dbsqLiteOpenHelper = new DBOpenHelper(MainActivity.this,"users.db",null,1);
 SQLiteDatabase db = dbsqLiteOpenHelper.getWritableDatabase();
//創建存放數據的ContentValues對象
ContentValues values = new ContentValues();
values.put("username","test");
values.put("password","123456");
values.put("age",20);
//數據庫執行插入命令
db.insert("user", null, values);

添加之前一共7條數據
在這裏插入圖片描述
在這裏插入圖片描述
點擊添加按鈕刷新後多了一條數據
在這裏插入圖片描述

刪除數據

public int delete(String table, String whereClause, String[] whereArgs) 
table 表名
whereClause 查詢條件
whereArgs 指定條件語句,可以使用佔位符?
whereArgs 當表達式中含有佔位符,改參數用戶指定各佔位符參數的值
返回值 刪除成功的行數

使用方法:

 DBOpenHelper dbsqLiteOpenHelper = new DBOpenHelper(MainActivity.this,"users.db",null,1);
 SQLiteDatabase db = dbsqLiteOpenHelper.getWritableDatabase();
db.delete("user", "username=?", new String[]{"test"});

我們可以看到刪除數據之前表裏一共有9條數據
在這裏插入圖片描述
點擊刪除刷新後一共只剩6條數據了,成功刪除3條數據
在這裏插入圖片描述

更新數據

public int update(String table, ContentValues values, String whereClause, String[] whereArgs) 

方法參數:

table 表名
values 指定要更新的字段及對應的字段值
whereClause 指定條件語句,可以使用佔位符?
whereArgs 當表達式中含有佔位符,改參數用戶指定各佔位符參數的值
返回值 返回影響的數據條數

使用示例:

 DBOpenHelper dbsqLiteOpenHelper = new DBOpenHelper(MainActivity.this,"users.db",null,1);
 SQLiteDatabase db = dbsqLiteOpenHelper.getWritableDatabase();
ContentValues values2 = new ContentValues();
values2.put("username", "admin123");
db.update("user", values2, "username=?", new String[]{"admin"});

在這裏插入圖片描述
點擊修改按鈕後再刷新數據
在這裏插入圖片描述
在這裏插入圖片描述

查詢數據

 public Cursor query(String table, String[] columns, String selection,String[] 
 selectionArgs, String groupBy, String having, String orderBy) 

參數詳解:

table 表名
columns 指定要查詢的列,如果爲空,返回所有
selection 查詢條件 ,可以用佔位符?
selectionArgs where對應的條件值
groupBy 指定分組方式
having 指定having條件
orderBy 排序方式

使用示例:

 DBOpenHelper dbsqLiteOpenHelper = new DBOpenHelper(MainActivity.this,"users.db",null,1);
 SQLiteDatabase db = dbsqLiteOpenHelper.getWritableDatabase();
  //創建遊標對象
Cursor cursor = db.query("user", new String[]{"id","username","age"}, "username=?",
 new String[]{"admin123"}, null, null, null);
//利用遊標遍歷所有數據對象
while(cursor.moveToNext()){
    String id = cursor.getString(cursor.getColumnIndex("id"));
    String username = cursor.getString(cursor.getColumnIndex("username"));
    int age = cursor.getInt(cursor.getColumnIndex("age"));
    Log.i("Mainactivity","result: id="  + id +" username: " + username +"  age:" + age);
}
// 關閉遊標,釋放資源
cursor.close();

我們可以看到數據庫表中的數據都被打印出來了在這裏插入圖片描述

完整代碼

MainActivity.java

package com.hnu.sqlite;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
 

import java.io.File;


public class MainActivity extends AppCompatActivity {

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


        DBOpenHelper dbsqLiteOpenHelper = new DBOpenHelper(MainActivity.this,"users.db",null,1);
        final SQLiteDatabase db = dbsqLiteOpenHelper.getWritableDatabase();

        Button button1 = findViewById(R.id.button2); //add
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //創建存放數據的ContentValues對象
                ContentValues values = new ContentValues();
                values.put("username","test");
                values.put("password","123456");
                values.put("age",21);
                //數據庫執行插入命令
                db.insert("user", null, values);
            }
        });
        Button button2 = findViewById(R.id.button3); //刪
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                db.delete("user", "username=?", new String[]{"test"});
            }
        });
        Button button3= findViewById(R.id.button4); //改
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContentValues values2 = new ContentValues();
                values2.put("username", "admin123");
                db.update("user", values2, "username=?", new String[]{"admin"});
            }
        });
        Button button4 = findViewById(R.id.button5); //查
        button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //創建遊標對象
                Cursor cursor = db.query("user", new String[]{"id","username","age"}, "username=?or age =?", new String[]{"test","20"}, null, null, null);
                //利用遊標遍歷所有數據對象
                while(cursor.moveToNext()){
                    String id = cursor.getString(cursor.getColumnIndex("id"));
                    String username = cursor.getString(cursor.getColumnIndex("username"));
                    int age = cursor.getInt(cursor.getColumnIndex("age"));
                    Log.i("Mainactivity","result: id="  + id +" username: " + username +"  age:" + age);
                }
                // 關閉遊標,釋放資源
                cursor.close();
            }
        });
    }
}

DBOpenHelper .java

package com.hnu.sqlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

public class DBOpenHelper extends SQLiteOpenHelper {
    public DBOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //創建數據庫sql語句並執行
        String sql="create table user(id integer primary key autoincrement,username varchar(20),password varchar(20),age integer)";
        db.execSQL(sql);

    }

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

    }
}

佈局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="52dp"
        android:text="增加數據"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="修改數據"
        app:layout_constraintEnd_toEndOf="@+id/button2"
        app:layout_constraintStart_toStartOf="@+id/button2"
        app:layout_constraintTop_toBottomOf="@+id/button2" />


    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="刪除數據"
        app:layout_constraintEnd_toEndOf="@+id/button4"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="@+id/button4"
        app:layout_constraintTop_toBottomOf="@+id/button4" />

    <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="查詢數據"
        app:layout_constraintEnd_toEndOf="@+id/button3"
        app:layout_constraintStart_toStartOf="@+id/button3"
        app:layout_constraintTop_toBottomOf="@+id/button3" />

</androidx.constraintlayout.widget.ConstraintLayout>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章