概述
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>