Android-多数据库一个项目

Kos*_*asC 2 android android-room

我想问一下,使用Room Persistence Library是否可以在一个项目下拥有多个数据库?动态更改数据库的选择。谢谢

Deˣ*_*Deˣ 8

如果数据库具有相同的架构并在它们之间动态切换,您可以重用实体和 DAO(如果您想为每个用户使用不同的数据库文件,这很有帮助)。

实体类

@Entity
public class User {
    @PrimaryKey
    @NonNull
    public String uid;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;
}
Run Code Online (Sandbox Code Playgroud)

DAO类

@Dao
public interface UserDao {
    @Query("SELECT * FROM user")
    List<User> getAll();

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    List<User> loadAllByIds(int[] userIds);

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
           "last_name LIKE :last LIMIT 1")
    User findByName(String first, String last);

    @Insert
    void insertAll(User... users);

    @Delete
    void delete(User user);
}
Run Code Online (Sandbox Code Playgroud)

数据库类

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

数据库客户端类

public class DatabaseClient {

  private Context mCtx;
  private AppDatabase appDatabase;
  private static String databaseName;
  private static DatabaseClient mInstance;


  private DatabaseClient(Context mCtx, String dbName) {
    this.mCtx = mCtx;

    if(databaseName == null || !databaseName.equalsIgnoreCase(dbName)) {
      databaseName = dbName;
    }
    appDatabase = Room.databaseBuilder(mCtx, AppDatabase.class, databaseName).build();
  }

  public String getDatabaseName() {
    return databaseName;
  }

  public static synchronized DatabaseClient getInstance(Context mCtx, String dbName) {
    if (mInstance == null || databaseName == null || !databaseName.equalsIgnoreCase(dbName)) {
      mInstance = new DatabaseClient(mCtx, dbName);
    }
    return mInstance;
  }

  public AppDatabase getAppDatabase() {
    return appDatabase;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以通过在我的例子中的参数中传递它的名称来基于特定的数据库进行查询,让我们说 myDb

List<User> users = DatabaseClient.getInstance(getApplicationContext(), myDb).getAppDatabase().userDao().getAll()
Run Code Online (Sandbox Code Playgroud)

请记住,每当您使用数据库名称执行第一次调用时,它都会创建数据库文件。如果新用户到达并调用插入其信息,它会自动创建一个新的数据库文件并将信息数据插入其中。


Gre*_*amà 5

有可能的。假设您有两组实体和两组DAO。您可以通过以下方式访问两个数据库:

  • 创建两个扩展RoomDatabase的类:

AppDatabase 1:

@Database(entities = {/*... the first set of entities ...*/}, version = 1)
public abstract class AppDatabase1 extends RoomDatabase {
    // the first set of DAOs
}
Run Code Online (Sandbox Code Playgroud)

AppDatabase2:

@Database(entities = {/*... the second set of entities ...*/}, version = 1)
public abstract class AppDatabase2 extends RoomDatabase {
    // the second set of DAOs
}
Run Code Online (Sandbox Code Playgroud)
  • 实例化两个数据库:

请注意,您将使用两个不同的文件名。

AppDatabase db1 = Room.databaseBuilder(getApplicationContext(), AppDatabase1.class, "database1.db").build();

AppDatabase db2 = Room.databaseBuilder(getApplicationContext(), AppDatabase2.class, "database2.db").build();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以同时使用两个数据库,但是将无法在它们之间创建查询。如果需要附加两个数据库,则应查看提供的@Anees链接。

  • 根据 Android 文档“每个 RoomDatabase 实例都相当昂贵,并且您很少需要在单个进程中访问多个实例。”我们如何使用单个数据库实例创建多个数据库或表 (2认同)