当前位置:首页 > 行业动态 > 正文

安卓开发怎么导入数据库

在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语句:

安卓开发怎么导入数据库  第1张

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分块读取,避免一次性加载整个文件到内存。
多线程操作数据库冲突 使用synchronizedRoom的异步操作机制。
存储位置权限问题 若数据库文件存放在ExternalStorage,需申请READ_EXTERNAL_STORAGE权限。
数据库版本升级 onUpgrade()中处理表结构变更,或通过SQLiteDatabase.execSQL()执行迁移脚本。

相关问题与解答

问题1:如何导出Android应用的SQLite数据库?

解答

  1. 通过adb命令导出数据库文件:
    adb shell "run-as <包名> cp /data/data/<包名>/databases/mydatabase.db /sdcard/"
    adb pull /sdcard/mydatabase.db ./
  2. 或在代码中将数据库文件复制到ExternalStorage目录(需申请写入权限)。

问题2:如何在不同Android版本中迁移数据库?

解答

  1. 增加版本号:在SQLiteOpenHelper中修改DATABASE_VERSION
  2. 实现onUpgrade():根据新旧版本差异执行ALTER TABLE或数据迁移脚本。
  3. 使用Room的迁移功能
    Room.databaseBuilder(context, AppDatabase.class, "app-database")
        .addMigrations(MIGRATION_1_2) // 定义Migration对象
        .build();
0