【问题标题】:Which SQLite methods are exposed by Room?Room 公开了哪些 SQLite 方法?
【发布时间】:2017-12-18 10:45:34
【问题描述】:

我正在开发一个高度依赖database 的应用程序。所以为此,我决定使用Room。但在开始之前,我几乎没有遇到任何问题,我试图找到但没有成功。

  1. 我可以更改房间中的页面和缓存大小吗?
  2. NGQP 可以带房间吗?
  3. Vaccum 可能吗?
  4. 我可以查询已经创建的 SQLite 数据库吗?即我的 sd 卡上已经有一个数据库,所以我可以直接将它与 room 一起使用吗?
  5. 我可以在房间内使用 Pragmas 吗?

【问题讨论】:

    标签: android sqlite android-room


    【解决方案1】:

    Re 2 - NGQP 是否可以与房间一起使用?

    我相信 NGQP 基本上依赖于 SQLIte 版本,如果您使用的是具有它的 SQLite 版本,即 3.8.0 所以 API21+ BUT,它应该可以工作

    一些设备制造商在其上包含不同版本的 SQLite 他们的设备。android.database.sqlite

    This may also be of interest - The Next-Generation Query Planner

    Re 4 - 我可以查询已经创建的 SQLite 数据库吗?即我的 sd 卡上已经有一个数据库,所以我可以直接将它与 room 一起使用吗?

    这可能很有趣How to migrate existing SQLite application to Room Persistance Library?

    当然,您没有理由无法在 Room 之外打开数据库,例如有一个 SQLiteOpenHelper 的子类。不过我猜 The Room Police :) 可能会提出很多你不应该这样做的理由。

    关于 1、3 和 5

    我相信您可以覆盖扩展 RoomDatabase 类的类的 init 方法,这是在 RoomDatabase 子类打开数据库之前的安全位置。

    例如:-

    @Database(entities = Todo.class, version = 1, exportSchema = false)
    public abstract class TodoDatabase extends RoomDatabase {
        public abstract TodoDAO todoDAO();
    
        @Override
        public void init(DatabaseConfiguration dbconfig) {
            Log.d("ROOM_INIT","Room init invoked - Databse name is " + dbconfig.name);
            String dbpath = (dbconfig.context).getDatabasePath(dbconfig.name).getPath();
            if (ifDBExists(dbpath)) {
                SQLiteDatabase db = SQLiteDatabase.openDatabase(dbpath, null,Context.MODE_PRIVATE);
                actionCustomConfiguration(db);
                db.close();
            }
            super.init(dbconfig);
        }
    
        private boolean ifDBExists(String dbpath) {
            File db = new File(dbpath);
            if(db.exists()) return true;
            File dir = new File(db.getParent());
            if (!dir.exists()) {
                dir.mkdirs();
            }
            return false;
        }
    
        private void actionCustomConfiguration(SQLiteDatabase db) {
            Log.d("ROOM_CUSTCONFIG","Custom Configuration invoked.");
            db.execSQL("VACUUM");
            logDatabaseInfo(db);
        }
    
        private static void logDatabaseInfo(SQLiteDatabase db) {
    
            // Issue PRAGMA database_list commnand
            Cursor dblcsr = db.rawQuery(PRAGMA_STATEMENT + PRAGMA_DATABASELIST,null);
            // Write databases to the log
            while (dblcsr.moveToNext()) {
                Log.d(CSU_TAG,"DatabaseList Row " + Integer.toString(dblcsr.getPosition() + 1) +
                        " Name=" + dblcsr.getString(dblcsr.getColumnIndex(PRAGMA_DBLIST_NAME_COL)) +
                        " File=" + dblcsr.getString(dblcsr.getColumnIndex(PRAGMA_DBLIST_FILE_COL))
                );
            }
            dblcsr.close();
            // Issue PRAGMA user_version to get the version and write to the log
            //Note! to set user_version use execSQL not rawQuery
            Cursor uvcsr = db.rawQuery(PRAGMA_STATEMENT + PRAGMA_USERVERSION,null);
            while (uvcsr.moveToNext()) {
                Log.d(CSU_TAG,"Database Version = " +
                        Integer.toString(uvcsr.getInt(uvcsr.getColumnIndex(PRAGMA_USERVERSION))));
            }
            uvcsr.close();
            // Select all table entry rows from sqlite_master
            Cursor tlcsr = db.rawQuery("SELECT * FROM " +
                            SQLITE_MASTER + " WHERE " +
                            SM_TABLE_TYPE_COLUMN + "='" + SM_TYPE_TABLE + "'"
                    ,null);
            // For each table write table information to the log
            // (inner loop gets column info per table)
            while (tlcsr.moveToNext()) {
                String current_table = tlcsr.getString(tlcsr.getColumnIndex(SM_TABLENAME_COLUMN));
                Log.d(CSU_TAG,
                        "Table Name = " + current_table +
                                " Created Using = " + tlcsr.getString(tlcsr.getColumnIndex(SM_SQL_COLUMN)),
                        null
                );
                // Issue PRAGMA tabel_info for the current table
                Cursor ticsr = db.rawQuery(PRAGMA_STATEMENT + PRAGMA_TABLEINFO +
                                "(" + current_table + ")",
                        null
                );
                // Write column info (see headings below) to the log
                while (ticsr.moveToNext()) {
                    Log.d(CSU_TAG,"Table = " +
                                    current_table +
                                    " ColumnName = " +
                                    ticsr.getString(ticsr.getColumnIndex(PRAGMA_TABLEINFO_NAME_COl)) +
                                    " ColumnType = " +
                                    ticsr.getString(ticsr.getColumnIndex(PRAGMA_TABLEINFO_TYPE_COL)) +
                                    " Default Value = " +
                                    ticsr.getString(ticsr.getColumnIndex(PRAGMA_TABLEINFO_DEFAULTVALUE_COL)) +
                                    " PRIMARY KEY SEQUENCE = " + Integer.toString(
                            ticsr.getInt(ticsr.getColumnIndex(PRAGMA_TABLEINFO_PRIMARYKEY_COL))
                            )
                    );
                }
                ticsr.close();
            }
            tlcsr.close();
        }
    }
    

    上面的示例输出:-

    12-18 02:21:33.157 1607-1607/mjt.roomtodo D/ROOM_INIT: Room init invoked - Databse name is tododb
    12-18 02:21:33.157 1607-1607/mjt.roomtodo D/ROOM_CUSTCONFIG: Custom Configuration invoked.
    12-18 02:21:33.165 1607-1607/mjt.roomtodo D/SQLITE_CSU: DatabaseList Row 1 Name=main File=/data/data/mjt.roomtodo/databases/tododb
    12-18 02:21:33.165 1607-1607/mjt.roomtodo D/SQLITE_CSU: Database Version = 1
    12-18 02:21:33.169 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table Name = android_metadata Created Using = CREATE TABLE android_metadata (locale TEXT)
    12-18 02:21:33.169 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table = android_metadata ColumnName = locale ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
    12-18 02:21:33.169 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table Name = room_master_table Created Using = CREATE TABLE room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)
    12-18 02:21:33.169 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table = room_master_table ColumnName = id ColumnType = INTEGER Default Value = null PRIMARY KEY SEQUENCE = 1
    12-18 02:21:33.169 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table = room_master_table ColumnName = identity_hash ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
    12-18 02:21:33.169 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table Name = Todo Created Using = CREATE TABLE `Todo` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `description` TEXT, `starts` INTEGER NOT NULL, `finishes` INTEGER NOT NULL, `status_flags` INTEGER NOT NULL, `repeat_code` INTEGER NOT NULL, `repeat_multiplier` INTEGER NOT NULL, `added_count` INTEGER NOT NULL)
    12-18 02:21:33.169 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table = Todo ColumnName = _id ColumnType = INTEGER Default Value = null PRIMARY KEY SEQUENCE = 1
    12-18 02:21:33.169 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table = Todo ColumnName = description ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
    12-18 02:21:33.169 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table = Todo ColumnName = starts ColumnType = INTEGER Default Value = null PRIMARY KEY SEQUENCE = 0
    12-18 02:21:33.169 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table = Todo ColumnName = finishes ColumnType = INTEGER Default Value = null PRIMARY KEY SEQUENCE = 0
    12-18 02:21:33.169 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table = Todo ColumnName = status_flags ColumnType = INTEGER Default Value = null PRIMARY KEY SEQUENCE = 0
    12-18 02:21:33.173 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table = Todo ColumnName = repeat_code ColumnType = INTEGER Default Value = null PRIMARY KEY SEQUENCE = 0
    12-18 02:21:33.173 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table = Todo ColumnName = repeat_multiplier ColumnType = INTEGER Default Value = null PRIMARY KEY SEQUENCE = 0
    12-18 02:21:33.173 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table = Todo ColumnName = added_count ColumnType = INTEGER Default Value = null PRIMARY KEY SEQUENCE = 0
    12-18 02:21:33.173 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table Name = sqlite_sequence Created Using = CREATE TABLE sqlite_sequence(name,seq)
    12-18 02:21:33.173 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table = sqlite_sequence ColumnName = name ColumnType =  Default Value = null PRIMARY KEY SEQUENCE = 0
    12-18 02:21:33.173 1607-1607/mjt.roomtodo D/SQLITE_CSU: Table = sqlite_sequence ColumnName = seq ColumnType =  Default Value = null PRIMARY KEY SEQUENCE = 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-28
      • 2020-04-20
      • 2011-02-26
      • 2021-11-04
      • 2010-10-16
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多