下面列出了怎么用android.database.sqlite.SQLiteCursor的API类实例代码及写法,或者点击链接到github查看源代码。
/**
* Uses the given binding arguments as positional parameters for the query.
*
* <p>Note that unlike {@link SQLiteDatabase#rawQuery}, this method takes Object binding
* objects. Values in the <tt>args</tt> array need to be of a type that's usable in any of the
* SQLiteProgram bindFoo methods.
*
* @return this Query object, for chaining.
*/
Query binding(Object... args) {
// This is gross, but the best way to preserve both the readability of the caller (since
// values don't have be arbitrarily converted to Strings) and allows BLOBs to be used as
// bind arguments.
//
// The trick here is that since db.query and db.rawQuery take String[] bind arguments, we
// need some other way to bind. db.execSQL takes Object[] bind arguments but doesn't actually
// allow querying because it doesn't return a Cursor. SQLiteQuery does allow typed bind
// arguments, but isn't directly usable.
//
// However, you can get to the SQLiteQuery indirectly by supplying a CursorFactory to
// db.rawQueryWithFactory. The factory's newCursor method will be called with a new
// SQLiteQuery, and now we can bind with typed values.
cursorFactory =
(db1, masterQuery, editTable, query) -> {
bind(query, args);
return new SQLiteCursor(masterQuery, editTable, query);
};
return this;
}
private void bindPreHoneycomb(JSONObject row, String key, Cursor cursor, int i) throws JSONException {
// Since cursor.getType() is not available pre-honeycomb, this is
// a workaround so we don't have to bind everything as a string
// Details here: http://stackoverflow.com/q/11658239
SQLiteCursor sqLiteCursor = (SQLiteCursor) cursor;
CursorWindow cursorWindow = sqLiteCursor.getWindow();
int pos = cursor.getPosition();
if (cursorWindow.isNull(pos, i)) {
row.put(key, JSONObject.NULL);
} else if (cursorWindow.isLong(pos, i)) {
row.put(key, cursor.getLong(i));
} else if (cursorWindow.isFloat(pos, i)) {
row.put(key, cursor.getDouble(i));
/* ** Read BLOB as Base-64 DISABLED in this branch:
} else if (cursorWindow.isBlob(pos, i)) {
row.put(key, new String(Base64.encode(cursor.getBlob(i), Base64.DEFAULT)));
// ** Read BLOB as Base-64 DISABLED to HERE. */
} else { // string
row.put(key, cursor.getString(i));
}
}
/**
* {@inheritDoc}
*/
@Override
public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver driver,
String editTable, SQLiteQuery query) {
if (debugLogQueries) {
Log.d(GeoPackageCursorFactory.class.getSimpleName(), query.toString());
}
// Create a standard cursor
Cursor cursor = new SQLiteCursor(driver, editTable, query);
// Wrap the cursor
Cursor wrappedCursor = wrapCursor(cursor, editTable);
return wrappedCursor;
}
/**
* Get the SQLite Android Bindings cursor factory
*
* @return bindings cursor factory
* @since 3.4.0
*/
public org.sqlite.database.sqlite.SQLiteDatabase.CursorFactory getBindingsCursorFactory() {
return new org.sqlite.database.sqlite.SQLiteDatabase.CursorFactory() {
/**
* {@inheritDoc}
*/
@Override
public Cursor newCursor(org.sqlite.database.sqlite.SQLiteDatabase db, org.sqlite.database.sqlite.SQLiteCursorDriver driver, String editTable, org.sqlite.database.sqlite.SQLiteQuery query) {
if (debugLogQueries) {
Log.d(GeoPackageCursorFactory.class.getSimpleName(), query.toString());
}
// Create a standard cursor
Cursor cursor = new org.sqlite.database.sqlite.SQLiteCursor(driver, editTable, query);
// Wrap the cursor
Cursor wrappedCursor = wrapCursor(cursor, editTable);
return wrappedCursor;
}
};
}
/**
* Compat method so we can get type of column on API < 11.
* Source: http://stackoverflow.com/a/20685546/2643666
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static int getColumnType(Cursor cursor, int col) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
SQLiteCursor sqLiteCursor = (SQLiteCursor) cursor;
CursorWindow cursorWindow = sqLiteCursor.getWindow();
int pos = cursor.getPosition();
int type = -1;
if (cursorWindow.isNull(pos, col)) {
type = FIELD_TYPE_NULL;
} else if (cursorWindow.isLong(pos, col)) {
type = FIELD_TYPE_INTEGER;
} else if (cursorWindow.isFloat(pos, col)) {
type = FIELD_TYPE_FLOAT;
} else if (cursorWindow.isString(pos, col)) {
type = FIELD_TYPE_STRING;
} else if (cursorWindow.isBlob(pos, col)) {
type = FIELD_TYPE_BLOB;
}
return type;
} else {
return cursor.getType(col);
}
}
public SQLiteDatabase openDatabase(final File dbFile) {
return SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), new SQLiteDatabase.CursorFactory() {
@Override
@SuppressWarnings("deprecation")
public Cursor newCursor(final SQLiteDatabase db, SQLiteCursorDriver driver, String editTable, SQLiteQuery query) {
return new SQLiteCursor(db, driver, editTable, query) {
@Override
public void close() {
Log.d(TAG, "closing cursor");
super.close();
db.close();
if (!dbFile.delete()) {
Log.w(TAG, "could not delete database " + dbFile);
}
}
};
}
}, SQLiteDatabase.OPEN_READWRITE);
}
@Override
public SQLiteIterator select() {
mDb.acquireReference();
try {
final SQLiteCursorDriver driver = SQLiteCompat.newDriver(mDb, mSql);
return new CursorIterator(new SQLiteCursor(driver, null, mQuery));
} finally {
mDb.releaseReference();
}
}
public static void upgradeCursorWindowSize(final Cursor cursor) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
if (cursor instanceof AbstractWindowedCursor) {
final AbstractWindowedCursor windowedCursor = (AbstractWindowedCursor) cursor;
windowedCursor.setWindow(new CursorWindow("4M", 4 * 1024 * 1024));
}
if (cursor instanceof SQLiteCursor) {
((SQLiteCursor) cursor).setFillWindowForwardOnly(true);
}
}
}
@Override
public Cursor newCursor(SQLiteDatabase sqLiteDatabase, SQLiteCursorDriver sqLiteCursorDriver, String tableName, SQLiteQuery sqLiteQuery) {
if (isDebugEnabled) {
QuantumFluxLog.d(sqLiteQuery.toString());
}
return new SQLiteCursor(sqLiteCursorDriver, tableName, sqLiteQuery);
}
@Override
public Cursor newCursor(SQLiteDatabase sqLiteDatabase, SQLiteCursorDriver sqLiteCursorDriver, String tableName, SQLiteQuery sqLiteQuery) {
if (debugEnabled) {
CPOrmLog.d(sqLiteQuery.toString());
}
return new SQLiteCursor(sqLiteCursorDriver, tableName, sqLiteQuery);
}
@SuppressWarnings("deprecation")
public Cursor newCursor(SQLiteDatabase sqLiteDatabase,
SQLiteCursorDriver sqLiteCursorDriver,
String editTable,
SQLiteQuery sqLiteQuery) {
if (debugEnabled) {
Log.d("SQL Log", sqLiteQuery.toString());
}
return new SQLiteCursor(sqLiteDatabase, sqLiteCursorDriver, editTable, sqLiteQuery);
}
public static int getType(Cursor cursor, int i) {
SQLiteCursor sqLiteCursor = (SQLiteCursor) cursor;
CursorWindow cursorWindow = sqLiteCursor.getWindow();
int pos = cursor.getPosition();
int type = -1;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // Honeycomb or later.
type = cursor.getType(i);
if (type == Cursor.FIELD_TYPE_BLOB) {
type = FIELD_TYPE_BLOB;
} else if (type == Cursor.FIELD_TYPE_FLOAT) {
type = FIELD_TYPE_FLOAT;
} else if (type == Cursor.FIELD_TYPE_INTEGER) {
type = FIELD_TYPE_INTEGER;
} else if (type == Cursor.FIELD_TYPE_NULL) {
type = FIELD_TYPE_NULL;
} else if (type == Cursor.FIELD_TYPE_STRING) {
type = FIELD_TYPE_STRING;
}
} else { // Before Honeycomb
if (cursorWindow.isNull(pos, i)) {
type = FIELD_TYPE_NULL;
} else if (cursorWindow.isLong(pos, i)) {
type = FIELD_TYPE_INTEGER;
} else if (cursorWindow.isFloat(pos, i)) {
type = FIELD_TYPE_FLOAT;
} else if (cursorWindow.isString(pos, i)) {
type = FIELD_TYPE_STRING;
} else if (cursorWindow.isBlob(pos, i)) {
type = FIELD_TYPE_BLOB;
}
}
return type;
}
@SuppressWarnings("deprecation")
@Override
public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery,
String editTable, SQLiteQuery query) {
LOG.debug(query.toString());
// non-deprecated API is only available in API 11
return new SQLiteCursor(db, masterQuery, editTable, query);
}
public static void upgradeCursorWindowSize(final Cursor cursor) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
if (cursor instanceof AbstractWindowedCursor) {
final AbstractWindowedCursor windowedCursor = (AbstractWindowedCursor) cursor;
windowedCursor.setWindow(new CursorWindow("4M", 4 * 1024 * 1024));
}
if (cursor instanceof SQLiteCursor) {
((SQLiteCursor) cursor).setFillWindowForwardOnly(true);
}
}
}
public Cursor query(String tablename, String[] columns, String selection,
String[] selectionArgs, String groupBy, String having, String orderBy) {
if (selection != null) {
SQLiteCursor c = (SQLiteCursor) getReadableDatabase().query(
tablename,
columns,
KEY_SUGGEST_COLUMN_TEXT_1 + " LIKE '%" + selection + "%' OR "
+ KEY_SUGGEST_COLUMN_TEXT_2 + " LIKE '%" + selection + "%'", selectionArgs,
groupBy, having, orderBy);
c.moveToFirst();
return c;
} else {
return getReadableDatabase().query(tablename, columns, selection, selectionArgs, groupBy, having, orderBy);
}
}
@Override
public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) {
if (debugQueries) {
DUtils.log(query.toString());
}
return new SQLiteCursor(masterQuery, editTable, query);
}
@Override
public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) {
bindArgumentsToProgram(query, sqlArgs);
return new SQLiteCursor(masterQuery, editTable, query);
}
@Override public Object getItem(int position) {
return new CursorAdapterItem((SQLiteCursor) super.getItem(position));
}
CursorAdapterItem(SQLiteCursor cursor) {
super(cursor.getInt(3), cursor.getInt(2), cursor.getInt(1));
}
@SuppressWarnings("deprecation")
@Override
public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) {
return new SQLiteCursor(db, masterQuery, editTable, query);
}