包 androidx.room有這個功能,如果我連接到資料庫,它應該回傳。但我想確保這是僅適用于 Room 而不是SQLite的正確功能 ,我得到的所有資訊都是錯誤的。
/**
* Returns true if database connection is open and initialized.
*
* @return true if the database connection is open, false otherwise.
*/
public boolean isOpen() {
// We need to special case for the auto closing database because mDatabase is the
// underlying database and not the wrapped database.
if (mAutoCloser != null) {
return mAutoCloser.isActive();
}
final SupportSQLiteDatabase db = mDatabase;
return db != null && db.isOpen();
}
uj5u.com熱心網友回復:
是的,但是當您打開資料庫時,您很可能會誤解,因為您是錯誤的。
那就是構建 RoomDatabase 不會(除非你強行)打開資料庫。它保持實際開放,直到需要為止。只有在實際嘗試訪問資料庫時才需要。
考慮以下顯示狀態的內容:-
public class MainActivity extends AppCompatActivity {
TheDatabase db;
AllDao dao;
List<Table1> table1List;
private static final String TAG = "MAININFO";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
Log.d(TAG, "Getting Room instance" db.isOpen());
} catch (Exception e) {
e.printStackTrace();
}
db = TheDatabase.getInstance(this);
try {
Log.d(TAG,"Getting DAO" db.isOpen());
} catch (Exception e) {
e.printStackTrace();
}
dao = db.getAllDao();
try {
Log.d(TAG, "Querying Table1 " db.isOpen());
} catch (Exception e) {
e.printStackTrace();
}
table1List = dao.getAll();
try {
Log.d(TAG, "After Query " db.isOpen());
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Database (TheDatabase) 類包含一個回呼,當 onOpen 或 onCreate 被呼叫時,該回呼會寫入日志。
運行時,日志包括以下內容:-
2021-10-07 06:40:49.037 D/MAININFO: Getting DAOfalse
2021-10-07 06:40:49.039 D/MAININFO: Querying Table1 false
2021-10-07 06:40:49.069 D/THEDATABSEINFO: onCreate has been called. For a.a.so69466269roomisopen.TheDatabase$1 a.a.so69466269roomisopen.TheDatabase$1@112c3ea Opencounter = 0
2021-10-07 06:40:49.075 D/THEDATABSEINFO: onOpen has been called. For a.a.so69466269roomisopen.TheDatabase$1 a.a.so69466269roomisopen.TheDatabase$1@112c3ea OPenCounter = 0
2021-10-07 06:40:49.080 D/MAININFO: After Query true
所以在查詢之后 (即在實際訪問資料庫之后) isOpen 回傳 true。在訪問資料庫之前 isOpen 回傳 false。
- 第一次嘗試(在獲取實體之前)發出 NPE(正如預期的那樣),因此訊息不會寫入日志。
強制打開
現在考慮@Database 類TheDatabase,自從運行上面的代碼以來,它添加了以下行(在回傳實體之前)。
instance.getOpenHelper().getWritableDatabase(); //<<<<< FORCE OPEN
這是完整的TheDatabase類(針對力進行了修改):-
abstract class TheDatabase extends RoomDatabase {
abstract AllDao getAllDao();
private static final String DATABASE_NAME = "thedatabase.db";
private static final String TAG = "THEDATABSEINFO";
private static volatile TheDatabase instance = null;
private static int counter = 0;
static TheDatabase getInstance(Context context) {
if (instance == null) {
instance = Room.databaseBuilder(
context,
TheDatabase.class,
DATABASE_NAME
)
.addCallback(callback)
.allowMainThreadQueries()
.build();
}
instance.getOpenHelper().getWritableDatabase(); //<<<<< FORCE OPEN
return instance;
}
static Callback callback = new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
Log.d(TAG,"onCreate has been called. For " this.getClass().getName() " " this " Opencounter = " counter);
}
@Override
public void onOpen(@NonNull SupportSQLiteDatabase db) {
super.onOpen(db);
Log.d(TAG,"onOpen has been called. For " this.getClass().getName() " " this " OPenCounter = " counter );
}
@Override
public void onDestructiveMigration(@NonNull SupportSQLiteDatabase db) {
super.onDestructiveMigration(db);
}
};
}
現在運行時日志包括:-
2021-10-07 07:07:16.264 D/THEDATABSEINFO: onOpen has been called. For a.a.so69466269roomisopen.TheDatabase$1 a.a.so69466269roomisopen.TheDatabase$1@112c3ea OPenCounter = 0
2021-10-07 07:07:16.264 D/MAININFO: Getting DAOtrue
2021-10-07 07:07:16.266 D/MAININFO: Querying Table1 true
2021-10-07 07:07:16.271 D/MAININFO: After Query true
即isOpen一旦獲得實體就回傳真。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/311420.html
標籤:安卓 数据库 sqlite 科特林 android-room
