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

安卓开发数据库保存

使用SQLite数据库保存数据

SQLite是Android内置的轻量级数据库,适合存储结构化数据,以下是基本操作步骤:

创建数据库帮助类

继承SQLiteOpenHelper,用于管理数据库创建和版本升级。

public class MyDatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "app_data.db";
    private static final int VERSION = 1;
    public MyDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建表
        String sql = "CREATE TABLE user (" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT," +
                "name TEXT," +
                "age INTEGER)";
        db.execSQL(sql);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 数据库升级操作(如表结构变更)
        db.execSQL("DROP TABLE IF EXISTS user");
        onCreate(db);
    }
}

增删改查操作

// 插入数据
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "张三");
values.put("age", 25);
db.insert("user", null, values);
// 查询数据
Cursor cursor = db.query("user", null, "age > ?", new String[]{"20"}, null, null, null);
while (cursor.moveToNext()) {
    int id = cursor.getInt(cursor.getColumnIndex("id"));
    String name = cursor.getString(cursor.getColumnIndex("name"));
    // 处理数据...
}
cursor.close();
// 更新数据
values.clear();
values.put("age", 26);
db.update("user", values, "name = ?", new String[]{"张三"});
// 删除数据
db.delete("user", "id = ?", new String[]{"1"});

使用Room数据库保存数据

Room是Android Jetpack组件,提供更高效的数据库访问抽象层。

定义实体类

@Entity(tableName = "user")
public class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    @ColumnInfo(name = "name")
    public String name;
    @ColumnInfo(name = "age")
    public int age;
}

定义DAO接口

@Dao
public interface UserDao {
    @Insert
    void insert(User... users); // 支持批量插入
    @Query("SELECT  FROM user WHERE age > :minAge")
    List<User> getUsersOlderThan(int minAge);
    @Update
    void update(User user);
    @Delete
    void delete(User user);
}

构建数据库类

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

使用数据库

AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app_data.db").build();
UserDao userDao = db.userDao();
// 插入数据
User user = new User();
user.name = "李四";
user.age = 30;
userDao.insert(user);
// 查询数据(支持LiveData)
LiveData<List<User>> users = userDao.getUsersOlderThan(25);
users.observe(this, list -> {
    // 处理数据...
});

SQLite与Room对比

特性 SQLite Room
代码复杂度 高(需手动管理SQL) 低(面向对象操作)
编译时检查 支持(通过注解)
线程安全 需手动处理 自动支持(LiveData/Flow)
扩展性 低(需手写迁移逻辑) 高(支持迁移工具)

常见问题与解答

问题1:数据库版本升级时如何处理?

解答

  • SQLite:在onUpgrade()方法中执行ALTER TABLE或重建表逻辑。
  • Room:使用migrationStrategy配置迁移策略,或调用fallbackToDestructiveMigration()(会清空数据)。
    示例

    Room.databaseBuilder(context, AppDatabase.class, "app_data.db")
      .addMigrations(new Migration(1, 2) {
          @Override
          public void migrate(SupportSQLiteDatabase database) {
              database.execSQL("ALTER TABLE user ADD COLUMN address TEXT");
          }
      }).build();

问题2:如何在子线程中执行数据库操作?

解答

  • SQLite:通过AsyncTaskExecutorService在后台线程执行数据库操作。
  • Room:默认支持多线程,但复杂操作建议使用RxJavaCoroutines
    示例(协程)

    GlobalScope.launch(Dispatchers.IO) {
      val user = userDao.getUsersOlderThan(25)
      withContext(Dispatchers.Main) {
          // 更新UI...
      }
    }
0