您的位置:首页 > 数据库

SQLite 源码笔记(1)

2015-08-25 12:20 288 查看
SQLiteDatabase

SQLiteConnectionPool

SQLiteConnection -> execute() -> nativeExecute(mConnectionPtr, statement.mStatementPtr);

/home/fyf/WORK/kitkat/mydroid/frameworks/base/core/jni/android_database_SQLiteConnection.cpp: nativeExecute(JNIEnv* env, jclass clazz, jint connectionPtr, jint statementPtr) -> executeNonQuery(env, connection, statement) -> sqlite3_step(statement).

sqlite3_step()已经是Sqlite3Lib提供的函数: /article/6999535.html: sqlite3_setp().

SQLiteDatabase -> executeSql(…)

SQLiteStatement statement = new SQLiteStatement(this, sql, bindArgs)

executeUpdateDelete().

executeUpdateDelete() -> getSession().executeForChangedRowCount(…) -> SQLiteProgram的mDatabase.getThreadSession()

mConnection.executeForChangedRowCount(…)

-> nativeExecuteForChangedRowCount(mConnectionPtr, statement.mStatementPtr);

SQLiteDataBase->rawQuery->rawQueryWithFactory

SQLiteCursorDriver driver = new SQLiteDirectCursorDriver(this, sql, editTable, cancellationSignal) -> driver.query(…)

-> SQLiteDirectCursorDriver -> query(…) :

cursor = new SQLiteCursor(this, mEditTable, q uery);

cursor = factory.newCursor(mDatabase, this, mEditTable, query);

SQLiteCursor -> fillWindow(int requiredPos) -> mQuery.fillWindow(…..)

SQLiteQuery -> fillWindow(….) -> int numRows = getSession().executeForCursorWindow(getSql(), getBindArgs(), window, startPos, requiredPos, countAllRows, getConnectionFlags(), mCancellationSignal)

SQLiteSession -> executeForCursorWindow(…) -> mConnection.executeForCursorWindow(sql, bindArgs, window, startPos, requiredPos, countAllRows, cancellationSignal)

SQLiteConnection -> executeForCursorWindow(…) -> nativeExecuteForCursorWindow(mConnectionPtr, statement.mStatementPtr, window.mWindowPtr, startPos, requiredPos, countAllRows);

android_database_SQLiteConnection.cpp -> nativeExecuteForCursorWindow(…) -> copyRow(…)

copyRow(…)区分了五种类型(sqlite3_column_type(statement, i)):

SQLITE_TEXT: const char* text = reinterpret_cast”<”const char*>(

sqlite3_column_text(statement, i))

SQLITE_INTEGER: sqlite3_column_int64(statement, i)

SQLITE_FLOAT: sqlite3_column_double(statement, i)

SQLITE_BLOB: sqlite3_column_blob(statement, i)

SQLITE_NULL: putNull(addedRows, i)

sqlite3_XXX()函数都是Sqlite3的库函数.

SQLiteOpenHelper:

在构造时传入了对应的SQL DB的信息,但是不会在构造时就对DB进行创建/修改, 而是delay到第一次对getDatabaseLocked(XXX)的调用, 其很多的回调点onOpen/onCreate/XX等也是在这个函数内被调用的.

getDatabaseLocked(boolean writable):

check SQLiteDatabase mDatabase:

如果是null, 那么说明还没有被创建.

如果不是null, 但是发现不是open的, 那么说明之前被用户关闭了, 这种情况下返回null.

如果这次没有要求可写或者mDataBase已经是可写的, 那么直接返回mDataBase就可以.

下面是在mDataBase没被创建或者不满足需求的情况下对其创建或修改配置:

如果只是开可写,那么调用mDatabase.reopenReadWrite().

否则需要创建:

如果没有指定 mName, db = SQLiteDatabase.create(null).

否则根据需求调用SQLiteDatabase.openDatabase(…)/mContext.openOrCreateDatabase(…)

然后调用 onConfigure(db).

db.getVersion()获取当前DB的版本号, 并和新的版本号(mNewVersion)进行比较:

如果不相等, 那么需要进行update(但是如果是readonly的就不行了)

db.beginTransaction() + db.endTransaction()将update的操作包起来以提高效率, 如果当前DB的version是0, 那么会调用onCreate(db), 否则调用onDowngrade(…)/onUpgrade(…), 同时将新版本号更新(db.setVersion(mNewVersion)).

调用onOpen(db).
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: