Будут ли какие-либо конфликты, если Sqlite и Room существуют в одном проекте с одинаковым именем базы данных в Android? - PullRequest
4 голосов
/ 06 ноября 2019

У меня есть несколько старых модулей, которые используют SQlite Db, а новые модули используют Room DB (оба в одном проекте, SQlite еще не перенесен в Room), оба используют одно и то же имя базы данных, будут ли конфликты?

например: Имя базы данных "user_table" с SQLite. У меня есть 2 таблицы, и новое требование использует пространство для новых таблиц с тем же именем базы данных. это вызовет какие-либо проблемы с БД, которая уже создана? Если да, как я буду решать это?

1 Ответ

1 голос
/ 06 ноября 2019

Если вы собираетесь использовать исходные таблицы в 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
  • Опять вы можетепереключение между комнатным и предварительным режимом без какого-либо влияния, кроме результатов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...