加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SQLite 源码笔记(1)

发布时间:2020-12-12 19:40:12 所属栏目:百科 来源:网络整理
导读:SQLiteDatabase SQLiteConnectionPool SQLiteConnection - execute() - nativeExecute(mConnectionPtr,statement.mStatementPtr); /home/fyf/WORK/kitkat/mydroid/frameworks/base/core/jni/android_database_SQLiteConnection.cpp: nativeExecute(JNIEnv* e
  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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读