177 lines
6.6 KiB
Java
177 lines
6.6 KiB
Java
/*
|
|
* Copyright (C) 2006 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
/*
|
|
** Modified to support SQLite extensions by the SQLite developers:
|
|
** sqlite-dev@sqlite.org.
|
|
*/
|
|
|
|
package org.sqlite.database;
|
|
import android.database.Cursor;
|
|
import android.database.CursorWindow;
|
|
|
|
/* import org.apache.commons.codec.binary.Hex; */
|
|
|
|
import android.content.ContentValues;
|
|
import android.content.Context;
|
|
import android.content.OperationApplicationException;
|
|
import org.sqlite.database.sqlite.SQLiteAbortException;
|
|
import org.sqlite.database.sqlite.SQLiteConstraintException;
|
|
import org.sqlite.database.sqlite.SQLiteDatabase;
|
|
import org.sqlite.database.sqlite.SQLiteDatabaseCorruptException;
|
|
import org.sqlite.database.sqlite.SQLiteDiskIOException;
|
|
import org.sqlite.database.sqlite.SQLiteException;
|
|
import org.sqlite.database.sqlite.SQLiteFullException;
|
|
import org.sqlite.database.sqlite.SQLiteProgram;
|
|
import org.sqlite.database.sqlite.SQLiteStatement;
|
|
import android.os.OperationCanceledException;
|
|
import android.os.Parcel;
|
|
import android.os.ParcelFileDescriptor;
|
|
import android.text.TextUtils;
|
|
import android.util.Log;
|
|
|
|
import java.io.FileNotFoundException;
|
|
import java.io.PrintStream;
|
|
import java.text.Collator;
|
|
import java.util.HashMap;
|
|
import java.util.Locale;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
* Static utility methods for dealing with databases and {@link Cursor}s.
|
|
*/
|
|
public class ExtraUtils {
|
|
private static final String TAG = "ExtraUtils";
|
|
|
|
private static final boolean DEBUG = false;
|
|
|
|
/** One of the values returned by {@link #getSqlStatementType(String)}. */
|
|
public static final int STATEMENT_SELECT = 1;
|
|
/** One of the values returned by {@link #getSqlStatementType(String)}. */
|
|
public static final int STATEMENT_UPDATE = 2;
|
|
/** One of the values returned by {@link #getSqlStatementType(String)}. */
|
|
public static final int STATEMENT_ATTACH = 3;
|
|
/** One of the values returned by {@link #getSqlStatementType(String)}. */
|
|
public static final int STATEMENT_BEGIN = 4;
|
|
/** One of the values returned by {@link #getSqlStatementType(String)}. */
|
|
public static final int STATEMENT_COMMIT = 5;
|
|
/** One of the values returned by {@link #getSqlStatementType(String)}. */
|
|
public static final int STATEMENT_ABORT = 6;
|
|
/** One of the values returned by {@link #getSqlStatementType(String)}. */
|
|
public static final int STATEMENT_PRAGMA = 7;
|
|
/** One of the values returned by {@link #getSqlStatementType(String)}. */
|
|
public static final int STATEMENT_DDL = 8;
|
|
/** One of the values returned by {@link #getSqlStatementType(String)}. */
|
|
public static final int STATEMENT_UNPREPARED = 9;
|
|
/** One of the values returned by {@link #getSqlStatementType(String)}. */
|
|
public static final int STATEMENT_OTHER = 99;
|
|
|
|
/**
|
|
* Returns column index of "_id" column, or -1 if not found.
|
|
*/
|
|
public static int findRowIdColumnIndex(String[] columnNames) {
|
|
int length = columnNames.length;
|
|
for (int i = 0; i < length; i++) {
|
|
if (columnNames[i].equals("_id")) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/**
|
|
* Picks a start position for {@link Cursor#fillWindow} such that the
|
|
* window will contain the requested row and a useful range of rows
|
|
* around it.
|
|
*
|
|
* When the data set is too large to fit in a cursor window, seeking the
|
|
* cursor can become a very expensive operation since we have to run the
|
|
* query again when we move outside the bounds of the current window.
|
|
*
|
|
* We try to choose a start position for the cursor window such that
|
|
* 1/3 of the window's capacity is used to hold rows before the requested
|
|
* position and 2/3 of the window's capacity is used to hold rows after the
|
|
* requested position.
|
|
*
|
|
* @param cursorPosition The row index of the row we want to get.
|
|
* @param cursorWindowCapacity The estimated number of rows that can fit in
|
|
* a cursor window, or 0 if unknown.
|
|
* @return The recommended start position, always less than or equal to
|
|
* the requested row.
|
|
* @hide
|
|
*/
|
|
public static int cursorPickFillWindowStartPosition(
|
|
int cursorPosition, int cursorWindowCapacity) {
|
|
return Math.max(cursorPosition - cursorWindowCapacity / 3, 0);
|
|
}
|
|
|
|
/**
|
|
* Returns data type of the given object's value.
|
|
*<p>
|
|
* Returned values are
|
|
* <ul>
|
|
* <li>{@link Cursor#FIELD_TYPE_NULL}</li>
|
|
* <li>{@link Cursor#FIELD_TYPE_INTEGER}</li>
|
|
* <li>{@link Cursor#FIELD_TYPE_FLOAT}</li>
|
|
* <li>{@link Cursor#FIELD_TYPE_STRING}</li>
|
|
* <li>{@link Cursor#FIELD_TYPE_BLOB}</li>
|
|
*</ul>
|
|
*</p>
|
|
*
|
|
* @param obj the object whose value type is to be returned
|
|
* @return object value type
|
|
*/
|
|
public static int getTypeOfObject(Object obj) {
|
|
if (obj == null) {
|
|
return Cursor.FIELD_TYPE_NULL;
|
|
} else if (obj instanceof byte[]) {
|
|
return Cursor.FIELD_TYPE_BLOB;
|
|
} else if (obj instanceof Float || obj instanceof Double) {
|
|
return Cursor.FIELD_TYPE_FLOAT;
|
|
} else if (obj instanceof Long || obj instanceof Integer
|
|
|| obj instanceof Short || obj instanceof Byte) {
|
|
return Cursor.FIELD_TYPE_INTEGER;
|
|
} else {
|
|
return Cursor.FIELD_TYPE_STRING;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Utility method to run the query on the db and return the value in the
|
|
* first column of the first row.
|
|
*/
|
|
public static long longForQuery(
|
|
SQLiteDatabase db, String query, String[] selectionArgs
|
|
) {
|
|
SQLiteStatement prog = db.compileStatement(query);
|
|
try {
|
|
return longForQuery(prog, selectionArgs);
|
|
} finally {
|
|
prog.close();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Utility method to run the pre-compiled query and return the value in the
|
|
* first column of the first row.
|
|
*/
|
|
public static long longForQuery(
|
|
SQLiteStatement prog, String[] selectionArgs
|
|
) {
|
|
prog.bindAllArgsAsStrings(selectionArgs);
|
|
return prog.simpleQueryForLong();
|
|
}
|
|
}
|