mydict.db,建立資料表並匯入資料。app/src/main/assets/mydict.db (或 assets/databases/mydict.db)
public class DbOpenHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "mydict.db";
private static final int DB_VERSION = 1;
private final Context context;
private SQLiteDatabase database;
private final String dbPath;
public DbOpenHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.context = context;
this.dbPath = context.getDatabasePath(DB_NAME).getAbsolutePath();
}
@Override
public void onCreate(SQLiteDatabase db) {
// 不建表,改用複製法
copyDatabaseFromAssets();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 版本升級策略:刪除舊檔再複製新檔(簡單但會清除用戶資料)
context.deleteDatabase(DB_NAME);
copyDatabaseFromAssets();
}
private void copyDatabaseFromAssets() {
try (InputStream is = context.getAssets().open(DB_NAME);
OutputStream os = new FileOutputStream(dbPath)) {
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
os.flush();
} catch (IOException e) {
throw new RuntimeException("複製預置資料庫失敗", e);
}
}
public SQLiteDatabase openDatabase() {
if (database == null || !database.isOpen()) {
database = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE);
}
return database;
}
@Override
public synchronized void close() {
if (database != null) database.close();
super.close();
}
}
DbOpenHelper helper = new DbOpenHelper(this);
SQLiteDatabase db = helper.openDatabase();
Cursor c = db.rawQuery("SELECT word, detail FROM dict WHERE word LIKE ?", new String[]{"%apple%"});
while (c.moveToNext()) {
String word = c.getString(0);
String detail = c.getString(1);
// 顯示...
}
c.close();
SQLiteDatabase.OPEN_READONLY 避免寫入鎖。mydict.db.001, .002 啟動時合併,或改用 Room 預打包資料庫(createFromAsset)。Room.databaseBuilder(context, AppDatabase::class.java, DB_NAME).createFromAsset("mydict.db").build() 一行搞定複製與遷移。將 SQLite 檔放入 assets/,SQLiteOpenHelper.onCreate 中複製至 context.getDatabasePath(),即可實現 App 內建資料庫。新專案強烈建議直接使用 **Room + createFromAsset** 簡化流程。