最近在看android 平台的源码,下面总结一下SQLiteDataBase与其底层的SQLLite 数据库的关系,上层的SQLiteDataBase是如何调用到底层的SQLite数据库操作。
SQLiteDataBase是android framework层用于封装SQLlite数据库操作的类,app可以直接使用SQLiteDataBase在android 平台上使用数据库。开发者可以使用SQLiteDataBase来实现一个ContentProvider。
SQLite数据库是一个C代码写的一个轻量级关系型数据库。被android系统采用。
下面以两个操作来总结一下SQLiteDataBase和SQLite数据库之间的调用。
第一个是SQLiteDataBase::Query()
第二个是SQLiteDataBase::Insert()。
1. Query
SQLiteCursor lCursor = SqliteDataBase::Query(SQLState);
While(lCursor->MoveToNext())
{
StringlString = lCursor->GetString();
}
SqliteDataBase::Query()的返回是一个SQLiteCursor, SqliteCursor是专门正对SQLitedatabase写的Cursor类,用于在查询结果上的光标游走,方便app从SqliteDatabase中获取数据。
这里需要提到一个叫做CursorWindow的类,这个类作为一个buffer,用于存储Query()返回的结果。SQLiteCursor的游走也是在CursorWindow的类上得游走。
SQLiteCursor继承自AbstractWindowCursor(AWC), AWC继承自Cursor,AWC拥有一个成员变量CursorWindow,所以SqliteCursor类拥有CursorWindow。
如果SQLiteCursor想要在CursorWindow上游走,首先需要做的是对CursorWindow的填写,SqliteCursor实现了一个fillWindow()接口,用于从数据库中获得查询结果,之后把查询结果写到CursorWindow中。
还有就是fillWindow()接口,在查询数据库的时候,并不是把数据中所有的数据都返回,而是获得一部分数据,写入cursorWindow中,当SQLiteCursor游走到cursorWindow的最后行时候,会再次调用fillWindow()去再次获取数据。
moveToNext()的workflow:
SQLiteCursor::MoveToNext() -à AbstractCursor::MoveToNext(),-àSqliteCursor:: onMove()
当光标游走到CursorWindow的最后一行的时候,需要调用SQLiteCursor::FillWindow()来填写CursorWindow, àSqliteCursor::FillWindow()调用SQLiteQuery::FillWindow()-----------------------à通过JNI接口调用native_fill_window()的接口,最后再native_fill_window()中调用SQLite数据库的C接口Sqlte3_step()去执行SQL语句,之后把返回的数据结果填写入CursorWindow中。
GetString()的workflow:
SQLiteCursor::GetString()-àAWC::GetString()à调用CursorWindow::getString(),最后CursorWindow还是通过JNI接口GetString_native()从C++写的CursorWindow的类中获得数据。
2. Insert()
SQLDatabase::insert()的操作比较简单,没有像Query()那样涉及到这么多个类,这个接口和delete,update等操作的workFlow差不多,都是比较直接的。
大致workFlow如下:
1. 在insert()中,利用insert()传入的参数,生成一个SQLiteStatement对象,代表的一条SQL语句,
2. 调用SQLiteStatement::execute()去执行SQL语句。
3. 在execute()中调用native_execute()JNI接口去执行。
4. 在native_execute()(android_database_SQLiteStatement.cpp)中,
5. 调用err = sqlite3_step(statement); 去执行Sql语句。