文章目錄
- 1. Android開發之外訪Sqlite數據庫
- 1.1 Sqlite數據庫的優點
- 1.2 Sqlite接口簡介
- 接口中的抽象方法
- 接口中的實例方法
- 接口的構造方法
- 示例
- 步驟
- 例子 —— 實現增刪改查
1. Android開發之外訪Sqlite數據庫
SQLite是一個軟件庫,實現了自給自足的、無服務器的、零配置的、事務性的 SQL 數據庫引擎。SQLite是一個增長最快的數據庫引擎,這是在普及方面的增長,與它的尺寸大小無關。SQLite 源代碼不受版權限制。
SQLite是一個進程內的庫,實現了自給自足的、無服務器的、零配置的、事務性的 SQL 數據庫引擎。它是一個零配置的數據庫,這意味著與其他數據庫不一樣,您不需要在系統中配置。
就像其他數據庫,SQLite 引擎不是一個獨立的進程,可以按應用程序需求進行靜態或動態連接。SQLite 直接訪問其存儲文件。
1.1 Sqlite數據庫的優點
- 不需要一個單獨的服務器進程或操作的系統(無服務器的)。
- SQLite 不需要配置,這意味著不需要安裝或管理。
- 一個完整的 SQLite 數據庫是存儲在一個單一的跨平臺的磁盤文件。
- SQLite 是非常小的,是輕量級的,完全配置時小于 400KiB,省略可選功能配置時小于250KiB。
- SQLite 是自給自足的,這意味著不需要任何外部的依賴。
- SQLite 事務是完全兼容 ACID 的,允許從多個進程或線程安全訪問。
- SQLite 支持 SQL92(SQL2)標準的大多數查詢語言的功能。
- SQLite 使用 ANSI-C 編寫的,并提供了簡單和易于使用的 API。
- SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中運行。
1.2 Sqlite接口簡介
接口中的抽象方法
- 首先你要知道SQLiteOpenHelper 是一個抽象類,這意味著如果我們想要使用它的話,就需要創建一個 自己的幫助類去繼承它。SQLiteOpenHelper 中有兩個抽象方法,分別是onCreate()和onUpgrade();兩個方法需要實現創建、升級數據庫的邏輯。
接口中的實例方法
-
sQLiteOpenHelper中還有兩個非常重要的實例方法: **getReadableDatabase()**和 getWritableDatabase()。這兩個方法都可以創建或打開一個現有的數據庫(如果數據庫已存在則直接打開,否則創建一個新的數據庫),并返回一個可對數據庫進行讀寫操作的對象。
不同的是當數據庫不可寫人的時候(如磁盤空間已滿), **getReadableDatabase()方法返回的對象將以只讀的方式打開數據庫,而getWritableDatabase()**方法則將出現異常。
接口的構造方法
- SQLiteOpenHelper中有兩個構造方法可供重寫,一般使用參數少一點的那個構造方法即可。這個構造方法中接收4個參數,第一個參數是Context,就是上下文環境,必須要有它才能對數據庫進行操作。第二個參數是數據庫名,創建數據庫時使用的就是這里指定的名稱。第三個參數允許我們在查詢數據的時候返回一個自定義的Cursor,一般都是傳人null。第四個參數表示當前數據庫的版本號,可用于對數據庫進行升級操作。構建出SQLiteOpenHelper 的實例之后,再調用它的**getReadableDatabase()或getWritableDatabase()方 法就能夠創建數據庫了此時,重寫的onCreate()**方法也會得到執行,所以通常會在這里去處理一些創建表的邏輯。
示例
步驟
- 實現
SQLiteOpenHelper
接口,重寫其中的onCreate()
和onUpgrade()
方法- 定義建表語句
- 在
onCreate()
方法中使用參數調用execSQL()
方法傳入建表語句;【可以使用一個Toast顯示創建成功】
- 在java文件中定義觸發方式和觸發邏輯
- 使主類繼承點擊接口;定義控件,獲取控件,定義事件監聽器
- 別忘了在
onCreate()
方法中找到控件 - 使用
SQLiteDatabase
定義數據庫操作對象 - 使用
ContentValues
定義數據組裝以便后續傳入數據庫 - 對象調用
ContentValues
的put()
方法組裝數據 - 對象調用
SQLiteDatabase
定義的insert()
、update()
、delete()
方法操作數據庫
- 別忘了在
- 使主類繼承點擊接口;定義控件,獲取控件,定義事件監聽器
例子 —— 實現增刪改查
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"><android.widget.Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/create_database"android:text="Create database"/><android.widget.Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/add_data"android:text="Add data"/><android.widget.Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/update_data"android:text="Update data"/><android.widget.Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/delete_data"android:text="Delete data"/></LinearLayout>
MySqliteOpenHelper.java
package com.example.sql;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;import androidx.annotation.Nullable;public class MySqliteOpenHelper extends SQLiteOpenHelper {public static final String CREATE_BOOK = "create table Book ("+ "_id integer primary key autoincrement,"+ "author text,"+ "price real,"+ "pages integer,"+ "name text)";private Context mContext;public MySqliteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);mContext = context;}// 數據庫創建時調用@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);Toast.makeText(mContext, "create succeed", Toast.LENGTH_SHORT).show();}// 數據庫升級時使用@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}
MainActivity.java
package com.example.sql;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 android.widget.Toast;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private MySqliteOpenHelper dbHelper;private Button createDatabase;private Button addData;private Button updateData;private Button deleteData;private Button queryData;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);dbHelper = new MySqliteOpenHelper(this,"BookStore.db",null,2);createDatabase = findViewById(R.id.create_database);addData = findViewById(R.id.add_data);updateData = findViewById(R.id.update_data);deleteData = findViewById(R.id.delete_data);queryData = findViewById(R.id.query_data);createDatabase.setOnClickListener(this);addData.setOnClickListener(this);updateData.setOnClickListener(this);deleteData.setOnClickListener(this);queryData.setOnClickListener(this);}@Overridepublic void onClick(View v) {if(v.getId() == R.id.create_database){dbHelper.getWritableDatabase();}else if(v.getId() == R.id.add_data){SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();// 開始組裝第一條數據values.put("name","The Da Vinci Code");values.put("author","Dan Brown");values.put("pages","454");values.put("price","16.96");db.insert("Book",null,values); // 插入第一條數據values.clear();// 開始組裝第二條數據values.put("name","The Lost Symbol");values.put("author","Dan Brown");values.put("pages","510");values.put("price","19.95");db.insert("Book",null,values); // 插入第一條數據Toast.makeText(this, "add succeed", Toast.LENGTH_SHORT).show();}else if(v.getId() == R.id.update_data){SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("price",10.99);db.update("Book",values,"name = ?",new String[]{"The Da Vinci Code"});Toast.makeText(this, "update succeed", Toast.LENGTH_SHORT).show();}else if(v.getId() == R.id.delete_data){SQLiteDatabase db = dbHelper.getWritableDatabase();db.delete("Book","pages > ?",new String[]{ "500" });Toast.makeText(this, "delete succeed", Toast.LENGTH_SHORT).show();}else if(v.getId() == R.id.query_data){SQLiteDatabase db = dbHelper.getWritableDatabase();// 查詢Book表中所有的數據Cursor cursor = db.query("Book",null,null,null,null,null,null);if(cursor.moveToFirst()){do{// 遍歷Cursor對象,取出數據并打印String name = cursor.getString(0);String author = cursor.getString(0);int pages = cursor.getInt(0);double price = cursor.getDouble(0);Log.d("MainActivity","book name is " + name);Log.d("MainActivity","book author is " + author);Log.d("MainActivity","book pages is " + pages);Log.d("MainActivity","book price is " + price);}while(cursor.moveToNext());}Toast.makeText(this, "yes", Toast.LENGTH_SHORT).show();cursor.close();}}
}