首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android SQLite多表操作:跨Activity訪問不同表的正確姿勢

     編輯:程式設計綜合問答

核心原則

SQLiteOpenHelper是單例模式管理數據庫連接。整個應用進程中應只有一個實例,所有Activity共享同一個`SQLiteDatabase`對象(通過`getWritableDatabase()`/`getReadableDatabase()`獲取)。

正確實現步驟

1. 數據庫幫助類(單例模式)

public class MyDatabaseHelper extends SQLiteOpenHelper {
    private static MyDatabaseHelper instance;
    private static final String DB_NAME = "UserDB.db";
    private static final int DB_VERSION = 1;

    // 表結構定義(去除尾部逗號,規範SQL)
    private static final String CREATE_USER = 
        "CREATE TABLE USER (username TEXT, usermima TEXT)";
    private static final String CREATE_STU = 
        "CREATE TABLE STU (id TEXT PRIMARY KEY, name TEXT, num TEXT)";

    private MyDatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    public static synchronized MyDatabaseHelper getInstance(Context context) {
        if (instance == null) {
            instance = new MyDatabaseHelper(context.getApplicationContext());
        }
        return instance;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_USER);
        db.execSQL(CREATE_STU);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldV, int newV) {
        // 版本升級邏輯:備份數據、刪表、重建、恢復
    }
}

2. 任意Activity中獲取數據庫實例

// Activity A 操作 USER 表
MyDatabaseHelper helper = MyDatabaseHelper.getInstance(this);
SQLiteDatabase db = helper.getWritableDatabase();
// 插入
ContentValues values = new ContentValues();
values.put("username", "zhangsan");
values.put("usermima", "123456");
db.insert("USER", null, values);

// Activity B 操作 STU 表(同樣獲取helper實例)
MyDatabaseHelper helper = MyDatabaseHelper.getInstance(this);
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = db.query("STU", null, null, null, null, null, null);

常見錯誤避坑

  • ❌ 在每個Activity `new MyDatabaseHelper(...)` → 多實例、鎖衝突、數據不一致
  • ❌ `CREATE TABLE` SQL 末尾帶逗號 → 執行報錯 `near ",": syntax error`
  • ❌ 不關閉 `Cursor` / `SQLiteDatabase` → 內存洩漏、文件句柄耗盡
  • ✅ 使用 `try-with-resources` (API 19+) 或 `finally` 關閉游標

進階:封裝DAO層

建議為每張表創建對應DAO類(`UserDao`、`StuDao`),內部持有`MyDatabaseHelper`引用,暴露`insert`、`query`、`update`、`delete`方法,Activity只調用DAO,不直接寫SQL。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved