SQLite 源码笔记(1)

前端之家收集整理的这篇文章主要介绍了SQLite 源码笔记(1)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. sqliteDatabase
  2. sqliteConnectionPool
  3. sqliteConnection -> execute() -> nativeExecute(mConnectionPtr,statement.mStatementPtr);
  4. /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).
  5. sqlite3_step()已经是sqlite3Lib提供的函数: http://www.cnblogs.com/kfqcome/archive/2011/06/27/2136999.html: sqlite3_setp().

  6. sqliteDatabase -> executesql(…)

  7. sqliteStatement statement = new sqliteStatement(this,sql,bindArgs)
    executeUpdateDelete().
  8. executeUpdateDelete() -> getSession().executeForChangedRowCount(…) -> sqliteProgram的mDatabase.getThreadSession()
  9. mConnection.executeForChangedRowCount(…)
  10. -> nativeExecuteForChangedRowCount(mConnectionPtr,statement.mStatementPtr);

  11. sqliteDataBase->rawQuery->rawQueryWithFactory

    • sqliteCursorDriver driver = new sqliteDirectCursorDriver(this,editTable,cancellationSignal) -> driver.query(…)
    • -> sqliteDirectCursorDriver -> query(…) :
      • cursor = new sqliteCursor(this,mEditTable,q uery);
      • cursor = factory.newCursor(mDatabase,this,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,cancellationSignal)
    • sqliteConnection -> executeForCursorWindow(…) -> nativeExecuteForCursorWindow(mConnectionPtr,statement.mStatementPtr,window.mWindowPtr,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的库函数.
  12. 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).
原文链接:https://www.f2er.com/sqlite/199396.html

猜你在找的Sqlite相关文章