上一篇
安卓开发如何导入数据库
- 行业动态
- 2025-04-22
- 3
在Android中导入数据库需创建SQLiteOpenHelper子类,重写onCreate()建表、onUpgrade()升级,通过getWritableDatabase()获取实例,使用SQL语句或ContentProvider进行CRUD操作
安卓本地数据库方案选择
方案类型 | 适用场景 | 核心特点 |
---|---|---|
SQLite | 轻量级本地存储 | 嵌入式关系型数据库,需手动管理连接 |
Room | 现代化本地存储 | 基于SQLite的抽象层,提供编译时验证 |
Realm | 高性能对象存储 | 支持复杂查询,跨平台同步 |
Firebase Firestore | 云端NoSQL数据库 | 实时同步,无需自建服务器 |
SQLite数据库导入实现步骤
创建数据库帮助类
public class DBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app.db"; private static final int VERSION = 1; public DBHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表结构 db.execSQL("CREATE TABLE user(id INTEGER PRIMARY KEY,name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级处理 } }
初始化数据库
DBHelper helper = new DBHelper(context); SQLiteDatabase db = helper.getWritableDatabase();
预置数据库文件(可选)
将app.db
文件放入assets
目录,首次启动时复制:private void copyDatabase(File dbFile) throws IOException { InputStream is = getAssets().open("app.db"); OutputStream os = new FileOutputStream(dbFile); byte[] buffer = new byte[1024]; while (is.read(buffer) > 0) { os.write(buffer); } os.flush(); os.close(); is.close(); }
Room持久化库使用流程
定义实体类
@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "name") public String name; }
创建DAO接口
@Dao public interface UserDao { @Insert void insertUser(User user); @Query("SELECT FROM user") List<User> getAllUsers(); }
配置数据库
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
实例化数据库
AppDatabase db = Room.databaseBuilder( getApplicationContext(), AppDatabase.class, "app.db" ).build();
数据库操作优化策略
优化方向 | 实施方案 |
---|---|
线程安全 | 使用AsyncTask 或ExecutorService 进行异步操作 |
内存优化 | 及时关闭SQLiteDatabase ,使用Cursor 后调用close() |
批量操作 | 使用ContentValues 数组进行批量插入 |
索引优化 | 为高频查询字段创建索引(如CREATE INDEX idx_name ON user(name) ) |
常见问题与解决方案
Q1:数据库版本升级导致崩溃
- 原因:
onUpgrade()
未正确处理版本差异 - 解决方案:在
onUpgrade()
中执行ALTER TABLE
或数据迁移逻辑
Q2:Room编译期检测失败
- 原因:实体类与DAO接口不匹配
- 解决方案:检查@Entity注解与DAO方法参数类型是否一致,使用
@Query
代替复杂方法
相关问题解答
Q1:如何实现数据库加密?
A:可使用SQLCipher库,在创建数据库时设置密钥:
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase( "encrypted.db", "password".toCharArray(), null );
或通过Room配合Encryption库实现透明加密。
Q2:多模块项目如何共享数据库?
A:将数据库帮助类封装为独立模块,通过gradle
依赖引入,建议使用单例模式:
public class DBManager { private static AppDatabase INSTANCE; public static AppDatabase getInstance(Context context) { if (INSTANCE == null) { INSTANCE = Room.databaseBuilder(...).build(); } return INSTANCE; } }