Android SQLite 打开、操作分析

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,到②的第一条以读写模式打开。


如果已经有了帮助

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值