Android中使用sqlite,使用最多的类莫过于SQLiteOpenHelper及SQLiteDatabased两个类。使用最多的操作莫过于创建打开数据库、操作数据两种操作,后者最长用的是insert delete update、query两种操作。其中,query即select操作又牵扯到cursor等。
上述操作主要涉及SQLiteDatabase SQLiteSession SQLiteConnectionPool SQLiteConnection四个大类。本文将对Android操作sqlite的内部流程做简要分析。
1、主要类成员变量
public final class SQLiteDatabase extends SQLiteClosable {
private static WeakHashMap<SQLiteDatabase, Object> sActiveDatabases =
new WeakHashMap<SQLiteDatabase, Object>(); // 存储所有打开的数据库的引用
private final ThreadLocal<SQLiteSession> mThreadSession = new ThreadLocal<SQLiteSession>() {
@Override
protected SQLiteSession initialValue() { // 每个线程有自己的一份mThreadSeesion
return createSession();
}
};
private final CursorFactory mCursorFactory; // Cursor工厂类,为了自定义Cursor
private final SQLiteDatabaseConfiguration mConfigurationLocked; // 数据库的配置
private SQLiteConnectionPool mConnectionPoolLocked; // 数据库连接池
……
}
public final class SQLiteSession {
private final SQLiteConnectionPool mConnectionPool; // 连接池
private SQLiteConnection mConnection; // 连接
private int mConnectionFlags;
private int mConnectionUseCount;
private Transaction mTransactionPool; // 事务池
private Transaction mTransactionStack; // 事务栈
……
}
public final class SQLiteConnectionPool implements Closeable {
private final SQLiteDatabaseConfiguration mConfiguration;
private int mMaxConnectionPoolSize;
private boolean mIsOpen;
private int mNextConnectionId;
private ConnectionWaiter mConnectionWaiterPool; // 连接等待池 其实是由 等待的连接 组成的链
private ConnectionWaiter mConnectionWaiterQueue; // 连接等待队列
private final ArrayList<SQLiteConnection> mAvailableNonPrimaryConnections =
new ArrayList<SQLiteConnection>(); //强引用,非主连接
private SQLiteConnection mAvailablePrimaryConnection; // 主连接 只有一个
private final WeakHashMap<SQLiteConnection, AcquiredConnectionStatus> mAcquiredConnections =
new WeakHashMap<SQLiteConnection, AcquiredConnectionStatus>(); //弱引用,已取得的连接
……
}
public final class SQLiteConnection implements CancellationSignal.OnCancelListener {
private final SQLiteConnectionPool mPool;
private final SQLiteDatabaseConfiguration mConfiguration;
private final int mConnectionId;
private final boolean mIsPrimaryConnection;
private final boolean mIsReadOnlyConnection;
private final PreparedStatementCache mPreparedStatementCache; //stmt的缓存 强引用
private PreparedStatement mPreparedStatementPool;
private int mConnectionPtr; // native层SQLiteConnection的指针
……
}
2、打开数据库时的调用情况
我们使用SQLiteOpenHelper时:
①
新建一个帮助类,getReadableDatabase或getWritableDatabase时,到②的第二条新打开
如果已经有了帮助类并且使用过,如果已经手动mDatabase.close过,到②的第二条新打开
getReadableDatabase时,无论上次使用是getReadableDatabase还是getWritableDatabase,会直接返回mDatabase,
getWritableDatabase时,如果上次是getWritableDatabase依然直接返回mDataBase,如果上次是getReadableDatabase,到②的第一条以读写模式打开。
②
如果已经有了帮助