返回介绍

1 open

发布于 2024-12-23 21:41:49 字数 3495 浏览 0 评论 0 收藏 0

获取 SQLiteDatabase 对象,从上面可以看到 getReadableDatabase()、getWritableDatabase() 是通过 SQLiteDatabase.openDatabase(..) 创建数据库,那么其中包含那些细节呢?

public static SQLiteDatabase openDatabase(String path, CursorFactory factory, int flags,
    DatabaseErrorHandler errorHandler) {
  SQLiteDatabase db = new SQLiteDatabase(path, flags, factory, errorHandler);
  db.open();
  return db;
}

可以看到 new 一个 SQLiteDatabase 对象,并调用 open(),再返回该数据库对象,先看 open() 函数:

private void open() {
  try {
    try {
      openInner();
    } catch (SQLiteDatabaseCorruptException ex) {
      onCorruption();
      openInner();
    }
  } catch (SQLiteException ex) {
    // .... 
  }
}

private void openInner() {
  synchronized (mLock) {
    assert mConnectionPoolLocked == null;
    mConnectionPoolLocked = SQLiteConnectionPool.open(mConfigurationLocked);
    mCloseGuardLocked.open("close");
  }

  synchronized (sActiveDatabases) {
    sActiveDatabases.put(this, null);
  }
}

// 可以看到调用 SQLiteConnectionPool.open(mConfigurationLocked):
public static SQLiteConnectionPool open(SQLiteDatabaseConfiguration configuration) {
  if (configuration == null) {
    throw new IllegalArgumentException("configuration must not be null.");
  }

  // Create the pool.
  SQLiteConnectionPool pool = new SQLiteConnectionPool(configuration);
  pool.open(); // might throw
  return pool;
}
// 可以看到其中是创建一个 SQLiteConnectionPool,并且调用 open 操作:

// Might throw
private void open() {
  // Open the primary connection.
  // This might throw if the database is corrupt.
  mAvailablePrimaryConnection = openConnectionLocked(mConfiguration,
      true /*primaryConnection*/); // might throw

   // ...
}

// 可以看到创建了主连接 mAvailablePrimaryConnection:
private SQLiteConnection openConnectionLocked(SQLiteDatabaseConfiguration configuration,
    boolean primaryConnection) {
  final int connectionId = mNextConnectionId++;
  return SQLiteConnection.open(this, configuration,
      connectionId, primaryConnection); // might throw
}

// 调用了 SQLiteConnection.open() 创建主连接:
static SQLiteConnection open(SQLiteConnectionPool pool,
    SQLiteDatabaseConfiguration configuration,
    int connectionId, boolean primaryConnection) {
  SQLiteConnection connection = new SQLiteConnection(pool, configuration,
      connectionId, primaryConnection);
  try {
    connection.open();
    return connection;
  } catch (SQLiteException ex) {
    connection.dispose(false);
    throw ex;
  }
}

private void open() {
  mConnectionPtr = nativeOpen(mConfiguration.path, mConfiguration.openFlags,
      mConfiguration.label,
      SQLiteDebug.DEBUG_SQL_STATEMENTS, SQLiteDebug.DEBUG_SQL_TIME);

  setPageSize();
  setForeignKeyModeFromConfiguration();
  setWalModeFromConfiguration();
  setJournalSizeLimit();
  setAutoCheckpointInterval();
  setLocaleFromConfiguration();

  // Register custom functions.
  final int functionCount = mConfiguration.customFunctions.size();
  for (int i = 0; i < functionCount; i++) {
    SQLiteCustomFunction function = mConfiguration.customFunctions.get(i);
    nativeRegisterCustomFunction(mConnectionPtr, function);
  }
}

// 可以看到最终调用了 nativeOpen 打开一个主数据库连接,并且设置各自 sqlite 的属性。

创建流程:

可以看出,创建一个数据库对象,会创建一个数据库连接池,并且会创建出一个主连接

数据库连接池用于管理数据库连接对象

而数据库连接 SQLiteConnection 则在其中包装了 native 的 sqlite3 对象,数据库 sql 语句最终会通过 sqlite3 对象执行可以看出,创建一个数据库对象,会创建一个数据库连接池,并且会创建出一个主连接

数据库连接池用于管理数据库连接对象

而数据库连接 SQLiteConnection 则在其中包装了 native 的 sqlite3 对象,数据库 sql 语句最终会通过 sqlite3 对象执行

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文