SQLite:輕量級數據庫,適合應用移動端數據存儲。
入門使用
-
需求:在 SQLite 數據庫中創建一個 user 表,其中包含 id ,username,password字段。然後我們需要插入一條數據來測試。
-
簡要思路:
- 寫一個子類繼承SQLiteOpenHelper(這個類能夠幫助我們創建數據庫,升級數據庫,創建表,修改表,獲取數據庫交互對象等)。
- 使用SQLiteOpenHelper子類對象來獲取數據庫交互對象。
- 執行增刪改查。
- 釋放資源。
-
現在開始編寫代碼。
第一步: 寫一個子類繼承SQLiteOpenHelper。
package com.recoder.sqlite_use;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
/**
* 注意這個類不僅僅要實現onCreate方法和onUpgrade方法。
* 因爲父類只有有參構造,所以我們也需要編寫一個有參構造,
*/
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
/**
* 構造方法
* @param context 上下文對象,傳入Activity對象即可
* @param name 數據庫名字
* @param factory 遊標對象
* @param version 數據庫版本
*/
public MySQLiteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
/**
* 創建SQLite數據庫後的回調方法
* 在這個方法中我們可以創建表,修改表等
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table user(id int primary key,username varchar(12),password varchar(16))";
db.execSQL(sql);
}
/**
* 數據庫升級
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, i
nt oldVersion, int newVersion) {
}
}
第二步: 在 Activity 中完成簡要思路中的2,3,4步。
package com.recoder.sqlite_use;
import androidx.appcompat.app.AppCompatActivity;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//獲取SQLiteOpenHelper對象
SQLiteOpenHelper helper = new MySQLiteOpenHelper(MainActivity.this, "myDB", null, 1);
//獲取數據庫交互對象
SQLiteDatabase db = helper.getWritableDatabase();//這一步執行完畢後,就會去調用MySQLiteOpenHelper的onCreate方法
//定義sql
String sql = "insert into user values(?,?,?)";
//執行插入
db.execSQL(sql,new Object[]{1,"zhangsan","123"});
//釋放資源
db.close();
}
}
第三步: 運行我們的app。這時候我們就會問了,創建了 SQLite 數據庫,那它在哪那,同時表裏的數據怎麼看那?
- 這時候我們需要保持我們的虛擬設備開啓,然後點擊View -> Tool windows -> Device File Explorer。
- 然後找到 data/data/com.recoder.sqlite_user(個人的項目名)/databases/myDB(之前在代碼中定義的數據庫名)
-
然後右擊 myDB,save as 。保存到我們的磁盤中,注意加上.db後綴名。我就把它放桌面上了。
-
這個文件需要使用圖形化管理軟件打開。圖形化管理軟件我們使用 SQLite Expert。下載地址:SQLite Expert
-
使用 SQLite Expert 打開 myDB.db 文件。
- 選中user表,點擊 Design 可以看我們的表結構,點擊 Data 可以看錶中的數據。
- 可以看到我們的數據插入成功了,至此入門成功。
細節注意:
-
在執行數據庫修改後,我們要在device file explorer中同步我們的修改。
-
save as 的時候覆蓋上一次保存的myDB.db文件時,可能會保存失敗。原因:SQLite Expert打開了myDb.db,導致文件被佔用,我們無法save as覆蓋該文件。該報錯會在Android Studio的右下角 event log 找到。解決辦法就是:關閉sqlite expert後,再save as 我們的數據庫文件。
關於CRUD操作
- 增刪改 全部用SQLiteDatabase對象execSQL方法。
- 查詢 使用SQLiteDatabase對象rawQuery方法。下面是一個示例
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public List<User> selectAll() {
//獲取SQLiteOpenHelper對象
SQLiteOpenHelper helper = new MySQLiteOpenHelper(MainActivity.this, "myDB", null, 1);
//獲取數據庫交互對象
SQLiteDatabase db = helper.getReadableDatabase();
//定義sql
String sql = "select * from user where name like ?";
//執行 sql,獲取遊標對象
Cursor cursor = db.rawQuery(sql, new String[]{"%zhang%"});
//遍歷獲取結果
List<User> users = new ArrayList<>();
//moveToNext():如果當前遊標對象能夠下移一行,則返回true。同時遊標下移一行。
while (cursor.moveToNext()) {
User u = new User();
//Cursor對象的getXxx方法用於獲取表中指定索引列的值,索引從0開始
//比如username在第二列,是varchar類型,使用getString(1)就可以把它的值取到
u.setId(cursor.getInt(0));
u.setPassword(cursor.getString(1));
u.setUsername(cursor.getString(2));
users.add(u);
}
//釋放資源
db.close();
return users;
}
}
- 關於遊標
如果有下一行數據,那麼moveToNext()返回true,同時下移一行。遊標對象指示着結果中的每一行數據,我們可以使用Cursor對象的成員方法來獲取指定列的數據。有點類似於jdbc中對ResultSet的處理。