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).
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).
相关文章推荐
- 如何简化 Oracle Linux 上 Oracle Database 的安装
- redis-cli pipe 管道
- mysql优化
- MySql中文乱码问题
- Oracle使用并行索引需要注意的问题
- MySQL 慢查询
- mysql索引操作(增删查)
- jdbc连接oracle报错No suitable driver found for jdbc
- oracle start with
- MySQL备份和还原
- mysql写入数据乱码问题的解决
- Memcached之存储命令(2)
- MySQL架构设计相关的方式方法和软件介绍(转)
- sqlite常用的命令-增删改查
- Memcached之Window和Linux安装(1)
- 关于Redis修改配置没有效果的问题分析
- MyBatis的动态SQL详解
- mysql字段长度的问题
- 《MYSQL必知必会》读书笔记
- Python____MongoDB+爬虫