當前位置:編程學習大全網 - 源碼下載 - SQLiteDatabase query 和 rawQuery 的區別

SQLiteDatabase query 和 rawQuery 的區別

剛才在 CSDN 上看見有人問說在 Android SQLiteDatabase 裏,query() 和 rawQuery() 方法的區別。對於這種問題,其實最好的辦法就是參看源碼,結果確實這樣,通過源代碼,很快就找到了問題的答案了。

咱們先看看 query() 是怎麽實現的。

public Cursor query(String table, String[] columns, String selection,

String[] selectionArgs, String groupBy, String having, String orderBy) {

return query(false, table, columns, selection, selectionArgs, groupBy,

having, orderBy, null /* limit */);

}

public Cursor query(boolean distinct, String table, String[] columns,

String selection, String[] selectionArgs, String groupBy,

String having, String orderBy, String limit) {

return queryWithFactory(null, distinct, table, columns, selection, selectionArgs,

groupBy, having, orderBy, limit, null);

}

這幾個方法都沒有具體實現。

public Cursor queryWithFactory(CursorFactory cursorFactory,

boolean distinct, String table, String[] columns,

String selection, String[] selectionArgs, String groupBy,

String having, String orderBy, String limit, CancellationSignal cancellationSignal) {

acquireReference();

try {

String sql = SQLiteQueryBuilder.buildQueryString(

distinct, table, columns, selection, groupBy, having, orderBy, limit);

return rawQueryWithFactory(cursorFactory, sql, selectionArgs,

findEditTable(table), cancellationSignal);

} finally {

releaseReference();

}

}

最終調用的就是這個方法。

public Cursor rawQueryWithFactory(

CursorFactory cursorFactory, String sql, String[] selectionArgs,

String editTable, CancellationSignal cancellationSignal) {

acquireReference();

try {

SQLiteCursorDriver driver = new SQLiteDirectCursorDriver(this, sql, editTable,

cancellationSignal);

return driver.query(cursorFactory != null ? cursorFactory : mCursorFactory,

selectionArgs);

} finally {

releaseReference();

}

}

咱們再看看 rawQuery() 是怎麽實現的。

public Cursor rawQuery(String sql, String[] selectionArgs) {

return rawQueryWithFactory(null, sql, selectionArgs, null, null);

}

還是這個方法。

public Cursor rawQueryWithFactory(

CursorFactory cursorFactory, String sql, String[] selectionArgs,

String editTable, CancellationSignal cancellationSignal) {

acquireReference();

try {

SQLiteCursorDriver driver = new SQLiteDirectCursorDriver(this, sql, editTable,

cancellationSignal);

return driver.query(cursorFactory != null ? cursorFactory : mCursorFactory,

selectionArgs);

} finally {

releaseReference();

}

}

可以看到,最後,調用的都是rawQueryWithFactory(CursorFactory,String,String[],String,CancellationSignal) 這個方法,妳完全可以代碼都不用看懂都可以找到答案。

回到問題上,這兩個方法的區別在於,最終的 SQL 語句,誰來拼?query() 做的壹件事就是幫妳拼寫 SQL 語句,而調用 rawQuery() 是妳自己拼寫好語句。我認為的差別僅次而已。

  • 上一篇:鋼四無限資源代碼
  • 下一篇:股票該怎麽樣選股?
  • copyright 2024編程學習大全網