- 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提供的函数: http://www.cnblogs.com/kfqcome/archive/2011/06/27/2136999.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,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的库函数.
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).
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|