上一篇
安卓开发怎么导入数据库
- 行业动态
- 2025-04-23
- 4380
在Android中导入数据库可通过SQLiteOpenHelper创建/升级本地数据库,或读取assets预置.db文件后复制到私有目录,也可集成Room持久化库简化操作
SQLite数据库导入基础
创建数据库与表结构
在Android中,通常通过继承SQLiteOpenHelper
类管理数据库,以下是创建数据库和表的基本步骤:
public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "mydatabase.db"; private static final int DATABASE_VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表结构 String createTable = "CREATE TABLE users (" + "id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT," + "age INTEGER)"; db.execSQL(createTable); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级逻辑 db.execSQL("DROP TABLE IF EXISTS users"); onCreate(db); } }
插入数据(导入方式)
通过SQLiteDatabase
对象执行INSERT
语句:
MyDatabaseHelper dbHelper = new MyDatabaseHelper(context); SQLiteDatabase db = dbHelper.getWritableDatabase(); // 插入单条数据 ContentValues values = new ContentValues(); values.put("name", "Alice"); values.put("age", 25); db.insert("users", null, values); // 批量插入数据(推荐) List<ContentValues> userList = new ArrayList<>(); userList.add(new ContentValues().put("name", "Bob").put("age", 30)); userList.add(new ContentValues().put("name", "Charlie").put("age", 28)); db.beginTransaction(); try { db.insert("users", null, userList.get(0)); db.insert("users", null, userList.get(1)); db.setTransactionSuccessful(); } finally { db.endTransaction(); }
导入现有数据库文件
将数据库文件放入assets
目录
将预定义的.db
文件(如prepopulated.db
)放入src/main/assets
目录。
复制数据库文件到应用私有目录
public void copyDatabase(Context context) { String destPath = context.getDatabasePath("prepopulated.db").getPath(); if (!new File(destPath).exists()) { InputStream assetStream = null; OutputStream outStream = null; try { assetStream = context.getAssets().open("prepopulated.db"); outStream = new FileOutputStream(destPath); byte[] buffer = new byte[1024]; int len; while ((len = assetStream.read(buffer)) > 0) { outStream.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (assetStream != null) assetStream.close(); if (outStream != null) outStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
通过SQLiteOpenHelper
访问数据库
public class PrepopulatedDBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "prepopulated.db"; private static final int DATABASE_VERSION = 1; public PrepopulatedDBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); copyDatabase(context); // 调用复制方法 } @Override public void onCreate(SQLiteDatabase db) { // 如果数据库已存在,则无需创建表 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 处理数据库升级逻辑 } }
使用Room库导入数据(推荐)
Room是Jetpack组件,提供更简洁的数据库操作接口。
定义实体类
@Entity(tableName = "users") public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; public int age; }
创建DAO接口
@Dao public interface UserDao { @Insert void insertUser(User user); @Query("SELECT FROM users") List<User> getAllUsers(); }
配置数据库
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
插入数据(异步操作)
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app-database").build(); User user = new User(); user.name = "David"; user.age = 35; // 异步插入 Executors.newSingleThreadExecutor().execute(() -> { db.userDao().insertUser(user); });
常见问题与权限处理
问题 | 解决方案 |
---|---|
数据库文件过大导致内存溢出 | 使用InputStream 分块读取,避免一次性加载整个文件到内存。 |
多线程操作数据库冲突 | 使用synchronized 或Room 的异步操作机制。 |
存储位置权限问题 | 若数据库文件存放在ExternalStorage ,需申请READ_EXTERNAL_STORAGE 权限。 |
数据库版本升级 | 在onUpgrade() 中处理表结构变更,或通过SQLiteDatabase.execSQL() 执行迁移脚本。 |
相关问题与解答
问题1:如何导出Android应用的SQLite数据库?
解答:
- 通过
adb
命令导出数据库文件:adb shell "run-as <包名> cp /data/data/<包名>/databases/mydatabase.db /sdcard/" adb pull /sdcard/mydatabase.db ./
- 或在代码中将数据库文件复制到
ExternalStorage
目录(需申请写入权限)。
问题2:如何在不同Android版本中迁移数据库?
解答:
- 增加版本号:在
SQLiteOpenHelper
中修改DATABASE_VERSION
。 - 实现
onUpgrade()
:根据新旧版本差异执行ALTER TABLE
或数据迁移脚本。 - 使用Room的迁移功能:
Room.databaseBuilder(context, AppDatabase.class, "app-database") .addMigrations(MIGRATION_1_2) // 定义Migration对象 .build();