Если вы собираетесь использовать исходные таблицы в Room, то у вас могут возникнуть некоторые проблемы, так как Room довольно конкретно относится к таблице, соответствующей соответствующей сущности, например, могут использоваться ТОЛЬКО типы столбцов TEXT, INTEGER, REAL и BLOB, но не NULL. подразумевается, что его следует использовать, например, для примитива Java (использование Long, а не long и т. д. может обойти такие проблемы, более поздние версии Room расширяют это требование, чтобы таблицы соответствовали сущностям со значениями по умолчанию (я полагаю)).
Есливы просто используете новые столы для комнаты, тогда не комната и комната могут сосуществовать. Тогда проблема заключается в использовании нескольких соединений. Возможно, вам удастся обойти это, если вы можете использовать SupportSQLiteDatabase вместо SQLiteDatabase , а затем использовать только одно соединение (отметив, что SupportSQLiteDatabase ограничен по сравнению с SQLiteDatabase).
- например, SQLiteDatabase ' query метод создает SQL через 7 или более параметров, в то время как SupportSQliteDatabase запрос принимает SQL как sinlgeпараметр.
Простой пример
Ниже приведено простое приложение, которое может переключаться между использованием только таблицы предварительной комнаты (mytable) и использованием дополнительной таблицы комнат (roomtable) вв сочетании с mytable через SupportSQliteDatabase.
Сначала DatabaseHelper, расширяющий SQLiteOPenHelper (он же предварительная комната), а именно DatabaseHelperPreRoom.java
public class DatabaseHelperPreRoom extends SQLiteOpenHelper {
public static final String DBNAME = "mydb";
public static final int DBVERSION = 1;
public static final String TABLE_MYTABLE = "mytable";
public static final String COL_MYTABLE_ID = BaseColumns._ID;
public static final String COl_MYTABLE_NAME = "name";
SQLiteDatabase mDB;
public DatabaseHelperPreRoom(Context context) {
super(context,DBNAME, null, DBVERSION);
mDB = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_MYTABLE +
"(" +
COL_MYTABLE_ID + " INTEGER PRIMARY KEY," +
COl_MYTABLE_NAME + " TEXT UNIQUE " +
")");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public long insert(String name) {
ContentValues cv = new ContentValues();
cv.put(COl_MYTABLE_NAME,name);
return mDB.insert(TABLE_MYTABLE,null,cv);
}
public Cursor getAll() {
return mDB.query(TABLE_MYTABLE,null,null,null,null,null,null);
}
public static long insertPostRoom(SupportSQLiteDatabase db, String name) {
ContentValues cv = new ContentValues();
cv.put(COl_MYTABLE_NAME,name);
return db.insert(TABLE_MYTABLE, OnConflictStrategy.IGNORE,cv);
}
public static Cursor getAllPostRoom(SupportSQLiteDatabase db) {
return db.query("SELECT * FROM " + TABLE_MYTABLE);
}
}
- Обратите внимание надва последних статических метода добавлены при подготовке к добавлению комнаты к миксу.
Комната комнаты для стола. (в основном то же, что и mytable) RoomTable.java : -
@Entity(tableName = "roomtable")
public class RoomTable {
@PrimaryKey
@ColumnInfo(name = BaseColumns._ID)
Long id;
String name;
public RoomTable () {}
@Ignore
public RoomTable(String name) {
this.id = null;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Dao RoomTableDao.java
@Dao
public interface RoomTableDao {
@Insert
long insert(RoomTable roomTable);
@Query("SELECT * FROM roomtable")
List<RoomTable> getAll();
@Query("SELECT count() AS " + BaseColumns._COUNT + " FROM roomtable")
long getRowCount();
}
База данных комнат RoomTableDatabase.java
@Database(version = DatabaseHelperPreRoom.DBVERSION, entities = {RoomTable.class})
public abstract class RoomTableDatabase extends RoomDatabase {
abstract RoomTableDao roomTableDao();
}
Наконец, соберите все вместе в упражнении, используя код, который позволяет легко переключаться между предварительной комнатой и комнатой + предварительной комнатой MainActivity.java
public class MainActivity extends AppCompatActivity {
public static final Boolean USINGROOM = true; //<<<<<<<<<< Switch control
DatabaseHelperPreRoom mDBHlpr;
RoomTableDatabase mRoomDB;
RoomTableDao roomTableDao;
SupportSQLiteDatabase mSDB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//<<<<<<<<<< The SWITCH as to use Pre-Room or ROOM
if (!USINGROOM) {
PreRoomCode();
} else {
PostRoomCode();
}
}
private void PreRoomCode() {
// Adds 3 rows if none exist and then log the data.
mDBHlpr = new DatabaseHelperPreRoom(this);
if (DatabaseUtils.queryNumEntries(mDBHlpr.getWritableDatabase(),DatabaseHelperPreRoom.TABLE_MYTABLE) < 1) {
mDBHlpr.insert("A");
mDBHlpr.insert("B");
mDBHlpr.insert("C");
}
Cursor csr = mDBHlpr.getAll();
while (csr.moveToNext()) {
Log.d(
"PREROOMINFO",
"Name is " + csr.getString(csr.getColumnIndex(DatabaseHelperPreRoom.COl_MYTABLE_NAME)) +
" ID is " + csr.getString(csr.getColumnIndex(DatabaseHelperPreRoom.COL_MYTABLE_ID))
);
}
csr.close();
}
private void PostRoomCode() {
// Get around the fact that Room will only create it's tables for a new database
createRoomTableIfNeeded();
// Build the Room database
mRoomDB = Room.databaseBuilder(this,RoomTableDatabase.class,DatabaseHelperPreRoom.DBNAME)
.allowMainThreadQueries()
.build();
roomTableDao = mRoomDB.roomTableDao();
// Get a SupportSQliteDatabase for use later
mSDB = mRoomDB.getOpenHelper().getWritableDatabase();
// If no rows then add 3 to new room table and another 3 to the pre-room table
// i.e. basic proof of concept
if (roomTableDao.getRowCount() < 1) {
roomTableDao.insert(new RoomTable("X"));
roomTableDao.insert(new RoomTable("Y"));
roomTableDao.insert(new RoomTable("Z"));
DatabaseHelperPreRoom.insertPostRoom(mSDB,"M");
DatabaseHelperPreRoom.insertPostRoom(mSDB,"N");
DatabaseHelperPreRoom.insertPostRoom(mSDB,"O");
}
// Show whats in the room table
List<RoomTable> roomTableList = roomTableDao.getAll();
for (RoomTable r: roomTableList) {
Log.d("ROOMINFO","Name is " + r.getName() + " ID is " + r.getId());
}
// Show whats in the pre-room table
Cursor csr = DatabaseHelperPreRoom.getAllPostRoom(mSDB);
while (csr.moveToNext()) {
Log.d(
"PREROOMINFO",
"Name is " + csr.getString(csr.getColumnIndex(DatabaseHelperPreRoom.COl_MYTABLE_NAME)) +
" ID is " + csr.getString(csr.getColumnIndex(DatabaseHelperPreRoom.COL_MYTABLE_ID))
);
}
}
private void createRoomTableIfNeeded() {
/* As the Room table will not exist and will not get created as the db exists
this is used to create the table.
*/
SQLiteDatabase db = SQLiteDatabase.openDatabase(this.getDatabasePath(DatabaseHelperPreRoom.DBNAME).getPath(),null,SQLiteDatabase.OPEN_READWRITE);
Cursor csr = db.query("sqlite_master",null,"name=? AND type=?",new String[]{"roomtable","table"},null,null,null);
int rowcount = csr.getCount();
csr.close();
if (rowcount == 0) {
// CREATE SQL COPIED FROM RoomTableDatabase_Impl in java generated so the expected table is created
db.execSQL("CREATE TABLE IF NOT EXISTS `roomtable` (`_id` INTEGER, `name` TEXT, PRIMARY KEY(`_id`))");
}
db.close();
}
}
Результаты
USINGROOM = false;
2019-11-06 20:50:09.665 D/PREROOMINFO: Name is A ID is 1
2019-11-06 20:50:09.665 D/PREROOMINFO: Name is B ID is 2
2019-11-06 20:50:09.665 D/PREROOMINFO: Name is C ID is 3
- Результат один и тот же, независимо от того, влажный илитаблица не существует, поэтому переключение на false в любое время дает тот же результат.
USINGROOM = true;
2019-11-06 20:52:44.042 D/ROOMINFO: Name is X ID is 1
2019-11-06 20:52:44.042 D/ROOMINFO: Name is Y ID is 2
2019-11-06 20:52:44.042 D/ROOMINFO: Name is Z ID is 3
2019-11-06 20:52:44.043 D/PREROOMINFO: Name is A ID is 1
2019-11-06 20:52:44.043 D/PREROOMINFO: Name is B ID is 2
2019-11-06 20:52:44.043 D/PREROOMINFO: Name is C ID is 3
2019-11-06 20:52:44.043 D/PREROOMINFO: Name is M ID is 4
2019-11-06 20:52:44.043 D/PREROOMINFO: Name is N ID is 5
2019-11-06 20:52:44.043 D/PREROOMINFO: Name is O ID is 6
- Опять вы можетепереключение между комнатным и предварительным режимом без какого-либо влияния, кроме результатов.