在安卓中操作已有数据库(如SQLite数据库)前,需确保以下条件:
AndroidManifest.xml
中声明读写权限(如 READ_EXTERNAL_STORAGE
、WRITE_EXTERNAL_STORAGE
)。// 假设已有自定义的 SQLiteOpenHelper 子类 SQLiteOpenHelper dbHelper = new MyDatabaseHelper(context); // 获取可读/可写数据库(若数据库不存在会自动创建) SQLiteDatabase db = dbHelper.getReadableDatabase(); // 或 getWritableDatabase()
SQLiteOpenHelper
会直接打开它;若不存在则创建新数据库。// 已知数据库文件的路径 File dbFile = new File("/path/to/existing/database.db"); SQLiteDatabase db = SQLiteDatabase.openDatabase( dbFile.getAbsolutePath(), // 数据库路径 null, // CursorFactory(通常为 null) SQLiteDatabase.OPEN_READWRITE // 或 OPEN_READONLY );
SQLiteOpenHelper
,直接操作已有数据库文件。// 查询任意表(如 "table_name")是否存在 Cursor cursor = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table' AND name='table_name'", null); if (cursor.getCount() > 0) { Log.d("Database", "Table exists, database opened successfully."); } else { Log.e("Database", "Table not found, check database integrity."); } cursor.close();
// 通过 SQLiteOpenHelper 获取版本号 int dbVersion = dbHelper.getDatabaseVersion(); Log.d("Database", "Current database version: " + dbVersion);
问题 | 解决方案 |
---|---|
数据库文件不存在 | 检查路径是否正确,或改用 SQLiteOpenHelper 自动创建数据库。 |
权限不足 | 确保已申请存储权限(Android 6.0+需动态请求权限)。 |
数据库被锁定 | 避免多线程同时写入,使用 synchronized 或 SQLiteDatabase.yieldIfContendedSafely() 。 |
版本冲突 | 在 SQLiteOpenHelper 的 onUpgrade 方法中处理数据库迁移。 |
步骤 | 方法 | 作用 |
---|---|---|
检查数据库是否存在 | File().exists() |
确认文件路径有效。 |
打开数据库 | getReadableDatabase() 或 openDatabase() |
获取数据库连接对象。 |
验证连接 | 执行查询或获取版本号 | 确保数据库可正常使用。 |
解答:
在 SQLiteOpenHelper
的 onUpgrade
方法中,通过 ALTER TABLE
或手动迁移数据。
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 2) { db.execSQL("ALTER TABLE table_name ADD COLUMN new_column TEXT"); // 添加新列 } // 其他版本迁移逻辑... }
解答:
通过复制数据库文件到指定路径:
File sourceDb = new File("/path/to/source.db"); File backupDb = new File("/path/to/backup.db"); try (InputStream in = new FileInputStream(sourceDb)) { try (OutputStream out = new FileOutputStream(backupDb)) { byte[] buffer = new byte[1024]; int len; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } } } catch (IOException e) { e.printStackTrace(); }