Android——SQLite 數據庫存儲
Android 為了讓我們更加方便地管理數據庫,專門提供了一個 SQLiteOpenHelper 幫助類,借助這個類可以簡單地對數據庫繼續寧創建和升級。
SQLiteOpenHelper 的基本用法:
SQL... 是一個抽象類,使用的話,需要創建一個自己的幫助類去繼承它,有兩個抽象方法:onCreate() 和 onUpgrade() ,需要在自己的幫助類中重寫這兩個方法,然后分別在這兩個方法中去實現創建、升級數據庫的邏輯。
SQL... 兩個實例方法:getReadableDatabase() 和 getWritableDatabase() 。這兩個方法都可以創建或打開一個現有的數據庫(如果數據庫已存在則直接打開,否則創建新的),并返回一個可對數據庫進行讀寫操作的對象。
SQL...的構造方法:4個參數,1-Context,2-數據庫名,3-Cursor(null),4-當前數據庫版本號,可用于對數據庫進行升級操作。
構建出 SQLiteOpenHelper 的實例之后,再調用它的 getReadableDatabase() 或 getWritableDatabase() 方法就可以創建數據庫了。
1. 新建 MyDatabaseHelper 類 繼承自 SQLiteOpenHelper,在代碼中執行SQL語句創建表
public class MyDatabaseHelper 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 MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2. activity_main.xml 加入一個按鈕,點擊用于創建數據庫
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/create_database"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Create database" />
</LinearLayout>
3. MainActivity.java
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
}
}
在 onCreate() 方法中構建了一個 MyDatabaseHelper 對象,并且通過構造函數的參數將數據庫名指定為 BookStore.db, 版本號指定為 1,然后在 Create database 按鈕的點擊事件里調用了 getWritableDatabase() 方法,創建數據庫并調用 MyDatabaseHelper 中的 onCreate() 方法。
打開 AS右下角的 Device File Explorer 找到 BookStore.db
右鍵另存為到桌面上,使用 SQLiteStudio 軟件打開,如下
升級數據庫
onUpgrade() 方法,對數據庫進行升級
目前 DatabaseTest 項目中已經有一張 Book 表用于存放書的各種詳細數據,再添加一張 Category 表用于記錄圖書的分類
將建表語句添加到 MyDatabaseHelper 中:
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK = "create table Book("
+ "id integer primary key autoincrement,"
+ "author text,"
+ "price real,"
+ "pages integer,"
+ "name text)";
public static final String CREATE_CATEGORY = "create table Category("
+ "id integer primary key autoincrement,"
+ "category_name text,"
+ "category_code integer)";
private Context mContext;
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
}
在 onUpgrade() 方法中執行了兩條 DROP 語句,如果發現數據庫中已經存在 Book表 或 Category 表,就把這兩張表刪除掉,再調用 onCreate() 方法重新創建。
修改 MainActivity 中的代碼,版本號傳入比 1 大的數
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
}
}
重新運行,查看數據庫如下:
添加數據
SQLiteDatabase 提供了一個 insert() 方法,用于添加數據,接收 3 個參數:1-表名,2-null,3-ContentValues對象,提供了一系列的 put() 方法重載,用于向 ContentValues 中添加數據,只需要將表中每個列名以及相應的待添加數據傳入即可。
修改 activity_main.xml 添加一個按鈕:
<Button
android:id="@+id/add_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Add data" />
修改 MainActivity.java :
Button addData = (Button)findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
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("Boook", 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); // 插入第二條數據
}
});
按鈕的點擊事件里面,先獲取到了 SQLiteDatabase 對象,然后使用 ContentValues 來對要添加的數據進行組裝。然后調用 insert() 方法將數據添加到表中。
更新數據
update() 方法,4個參數:1-表名,2-ContentValues對象,3、4-約束更新某一行或某幾行中的數據,不指定的話默認更新所有
修改 activity_main.xml 提加按鈕
<Button
android:id="@+id/update_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="update data" />
修改 MainActivity.java,添加點擊事件
Button updateData = (Button) findViewById(R.id.update_data);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price", 10.99);
db.update("Book", values, "name = ?", new String[]{"The Da Vinci Code"});
}
});
構建了一個 ContentValues 對象,指定了一組數據,只想把價格這一列的數據更新成 10.99。然后調用 SQLiteDatabase 的 update() 方法去執行具體的更新操作,第三個參數對應的是 SQL語句的 where 部分,表示更新所有 name = ?的行,而 ?是一個占位符,可以通過第四個參數提供的一個字符串數組為第三個參數中的每個占位符指定相應的內容。
刪除數據
delete()方法,接收3個參數:1-表名,2、3-約束刪除某一行或某幾行的數據,不指定默認就是刪除所有行。
修改 activity_main.xml
<Button
android:id="@+id/delete_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Delete data" />
修改 MainActivity.java,添加按鈕點擊事件
Button deleteButton = (Button) findViewById(R.id.delete_data);
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book", "pages > ?", new String[] { "500" });
}
});
指明刪除 Book 表中的數據,指定僅刪除 頁數超過 500頁 的書
查詢數據
智能推薦
【鼠】安卓學習雜記(十三)——Android數據存儲之SQLite數據庫存儲
一、適用場景 適用于存儲一些復雜的關系型數據。 二、概述 輕量級嵌入式數據庫引擎,它支持SQL 語言,并且只利用很少的內存就有很好的性能。可存儲大量的數據。 Android SQLite對我目前的安卓學習水平而言,還是比較復雜的,在此處暫不做詳細闡述,僅以此時使用狀態闡述。 三、使用步驟 第一步:創建MyDatabaseHelper繼承SQLiteOpenHelper 第二步:在MainActiv...
QML使用Sqlite數據庫存儲ListModel數據
(本文為utf-8格式,可以直接使用相應代碼) Models 是用來提供數據的,它既可以以 QML 的形式出現也可以是 C++的類。QML中的Model有ListModel、XmlListModel、 VisualItemModel;C++ 中的 Model 有 QAbstractItemModel、QStringList、 QList<QObject*>等。...
SQLite數據庫存儲(一)【安卓學習筆記】
對于MODE_PRIVATE,MODE_APPEND兩種模式,對寫文件的影響有什么不同? MODE_PRIVATE:該文件只能被當前程序讀寫,會把原來的內容覆蓋掉 MODE_APPEND:該文件的內容可追加,不會把原來的內容覆蓋掉,新寫的內容追加在文件后面 但是對于修改文件中的部分內容,應該怎么做呢?這就需要我們用到SQLite數據庫 主要內容: 創建和打開一個SQLite 數據庫 SQLite數...
17讀書筆記之SQLite數據庫存儲
SQLite數據庫存儲 創建數據庫 Android管理數據庫提供了一個SQLiteOpenHelper幫助類。 借助這個類就可以簡單地對數據庫進行創建和升級。下面學習SQLiteOpenHelper的基本用法。 首先SQLiteOpenHelper是一個抽象類,我們要是用的話,需要創建一個自己的幫助類去繼承它。SQLiteOpenHelper中有兩個抽象方法。 onCreate()和onUpgra...
猜你喜歡
【Android】數據存儲-SQLite
SQLite特點: 輕量級 獨立 隔離 跨平臺 多語言接口 安全性(多進程可以同時讀取,但同一時間只能有一個進程在寫入數據) 創建數據庫和表,以及數據庫的增刪改查操作 DatabaseHelper.java 創建一個activity: DatabaseButtonActivity.java xml: 使用Android Debug Database查看數據庫和表信息 參考鏈接:https://ju...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...