# Android如何操作SQLite
## 一、SQLite簡介
SQLite是一款輕量級的關系型數據庫,具有以下特點:
- 無需服務器進程
- 零配置
- 事務性(ACID兼容)
- 單個磁盤文件存儲
- 支持標準SQL語法
- 非常適合移動設備使用
在Android平臺上,SQLite是默認集成的數據庫引擎,被廣泛用于本地數據存儲場景。
## 二、核心組件類
### 1. SQLiteOpenHelper
抽象幫助類,用于數據庫創建和版本管理。主要方法:
- `onCreate()` - 首次創建數據庫時調用
- `onUpgrade()` - 數據庫升級時調用
- `getWritableDatabase()` - 獲取可寫數據庫實例
- `getReadableDatabase()` - 獲取只讀數據庫實例
### 2. SQLiteDatabase
數據庫訪問入口,提供:
- 執行SQL語句
- 增刪改查操作
- 事務處理
### 3. Cursor
查詢結果集,支持:
- 遍歷結果
- 按列名/索引獲取數據
- 類型轉換
## 三、完整使用流程
### 1. 創建數據庫幫助類
```java
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "mydb.db";
private static final int DB_VERSION = 1;
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE users (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"name TEXT NOT NULL," +
"age INTEGER," +
"email TEXT UNIQUE)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS users");
onCreate(db);
}
}
DBHelper dbHelper = new DBHelper(context);
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 方式1:使用ContentValues
ContentValues values = new ContentValues();
values.put("name", "張三");
values.put("age", 25);
values.put("email", "zhangsan@example.com");
long id = db.insert("users", null, values);
// 方式2:直接執行SQL
String sql = "INSERT INTO users (name,age,email) VALUES (?,?,?)";
db.execSQL(sql, new Object[]{"李四", 30, "lisi@test.com"});
// 參數說明:表名、列名數組、WHERE條件、條件參數、GROUP BY、HAVING、ORDER BY
Cursor cursor = db.query("users",
new String[]{"_id", "name", "age"},
"age > ?",
new String[]{"20"},
null, null, "age DESC");
try {
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(2);
// 處理數據...
}
} finally {
cursor.close(); // 必須關閉Cursor
}
ContentValues values = new ContentValues();
values.put("age", 26);
int count = db.update("users",
values,
"_id = ?",
new String[]{"1"});
int count = db.delete("users",
"name = ?",
new String[]{"張三"});
db.beginTransaction();
try {
// 批量操作...
db.setTransactionSuccessful(); // 標記事務成功
} finally {
db.endTransaction(); // 結束事務
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2) {
// 版本1到2的升級邏輯
db.execSQL("ALTER TABLE users ADD COLUMN phone TEXT");
}
if (oldVersion < 3) {
// 版本2到3的升級邏輯
// ...
}
}
SQLiteStatement stmt = db.compileStatement(
"INSERT INTO users (name) VALUES (?)");
stmt.bindString(1, "王五");
long id = stmt.executeInsert();
stmt.close();
@Override
public void onCreate(SQLiteDatabase db) {
// 創建表后添加索引
db.execSQL("CREATE INDEX idx_user_name ON users(name)");
db.execSQL("CREATE INDEX idx_user_email ON users(email)");
}
Room是Google推薦的SQLite抽象層:
@Entity
public class User {
@PrimaryKey(autoGenerate = true)
public int id;
public String name;
public int age;
}
@Dao
public interface UserDao {
@Insert
void insert(User user);
@Query("SELECT * FROM user")
List<User> getAll();
}
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
adb shell
查看數據庫文件:adb shell
cd /data/data/<package>/databases
sqlite3 mydb.db
.tables
.schema users
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE users ADD COLUMN address TEXT");
}
};
Room.databaseBuilder(context, AppDatabase.class, "mydb")
.addMigrations(MIGRATION_1_2)
.build();
cursor.getColumnIndex()
獲取列索引cursor.getType()
判斷字段類型VACUUM
命令app/
├── java/
│ ├── com.example.app/
│ │ ├── data/
│ │ │ ├── DBHelper.java
│ │ │ ├── UserContract.java (定義表結構常量)
│ │ │ └── UserDao.java
│ │ ├── models/
│ │ │ └── User.java
│ │ └── activities/
│ │ └── MainActivity.java
└── res/
└── raw/ (可存放預置數據庫文件)
通過本文介紹,你應該已經掌握了Android平臺操作SQLite數據庫的核心知識和實踐技巧。在實際開發中,建議根據項目復雜度選擇原生SQLite API或Room等ORM框架,并始終注意性能優化和數據安全。 “`
(注:實際字數為約2000字,可根據需要增減細節內容調整篇幅)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。