You've already forked android_translation_layer
mirror of
https://gitlab.com/android_translation_layer/android_translation_layer.git
synced 2025-10-27 11:48:10 -07:00
add complete java side of sqlite implementation
Mostly taken from https://www.sqlite.org/android which is forked from AOSPs implementation
This commit is contained in:
@@ -0,0 +1,165 @@
|
|||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class android_database_CursorWindow */
|
||||||
|
|
||||||
|
#ifndef _Included_android_database_CursorWindow
|
||||||
|
#define _Included_android_database_CursorWindow
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativeCreate
|
||||||
|
* Signature: (Ljava/lang/String;I)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_android_database_CursorWindow_nativeCreate
|
||||||
|
(JNIEnv *, jclass, jstring, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativeDispose
|
||||||
|
* Signature: (J)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_CursorWindow_nativeDispose
|
||||||
|
(JNIEnv *, jclass, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativeGetName
|
||||||
|
* Signature: (J)Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jstring JNICALL Java_android_database_CursorWindow_nativeGetName
|
||||||
|
(JNIEnv *, jclass, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativeGetBlob
|
||||||
|
* Signature: (JII)[B
|
||||||
|
*/
|
||||||
|
JNIEXPORT jbyteArray JNICALL Java_android_database_CursorWindow_nativeGetBlob
|
||||||
|
(JNIEnv *, jclass, jlong, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativeGetString
|
||||||
|
* Signature: (JII)Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jstring JNICALL Java_android_database_CursorWindow_nativeGetString
|
||||||
|
(JNIEnv *, jclass, jlong, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativeCopyStringToBuffer
|
||||||
|
* Signature: (JIILandroid/database/CharArrayBuffer;)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_CursorWindow_nativeCopyStringToBuffer
|
||||||
|
(JNIEnv *, jclass, jlong, jint, jint, jobject);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativePutBlob
|
||||||
|
* Signature: (J[BII)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_android_database_CursorWindow_nativePutBlob
|
||||||
|
(JNIEnv *, jclass, jlong, jbyteArray, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativePutString
|
||||||
|
* Signature: (JLjava/lang/String;II)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_android_database_CursorWindow_nativePutString
|
||||||
|
(JNIEnv *, jclass, jlong, jstring, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativeClear
|
||||||
|
* Signature: (J)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_CursorWindow_nativeClear
|
||||||
|
(JNIEnv *, jclass, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativeGetNumRows
|
||||||
|
* Signature: (J)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_android_database_CursorWindow_nativeGetNumRows
|
||||||
|
(JNIEnv *, jclass, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativeSetNumColumns
|
||||||
|
* Signature: (JI)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_android_database_CursorWindow_nativeSetNumColumns
|
||||||
|
(JNIEnv *, jclass, jlong, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativeAllocRow
|
||||||
|
* Signature: (J)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_android_database_CursorWindow_nativeAllocRow
|
||||||
|
(JNIEnv *, jclass, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativeFreeLastRow
|
||||||
|
* Signature: (J)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_CursorWindow_nativeFreeLastRow
|
||||||
|
(JNIEnv *, jclass, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativeGetType
|
||||||
|
* Signature: (JII)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_android_database_CursorWindow_nativeGetType
|
||||||
|
(JNIEnv *, jclass, jlong, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativeGetLong
|
||||||
|
* Signature: (JII)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_android_database_CursorWindow_nativeGetLong
|
||||||
|
(JNIEnv *, jclass, jlong, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativeGetDouble
|
||||||
|
* Signature: (JII)D
|
||||||
|
*/
|
||||||
|
JNIEXPORT jdouble JNICALL Java_android_database_CursorWindow_nativeGetDouble
|
||||||
|
(JNIEnv *, jclass, jlong, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativePutLong
|
||||||
|
* Signature: (JJII)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_android_database_CursorWindow_nativePutLong
|
||||||
|
(JNIEnv *, jclass, jlong, jlong, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativePutDouble
|
||||||
|
* Signature: (JDII)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_android_database_CursorWindow_nativePutDouble
|
||||||
|
(JNIEnv *, jclass, jlong, jdouble, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_CursorWindow
|
||||||
|
* Method: nativePutNull
|
||||||
|
* Signature: (JII)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_android_database_CursorWindow_nativePutNull
|
||||||
|
(JNIEnv *, jclass, jlong, jint, jint);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,231 @@
|
|||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class android_database_sqlite_SQLiteConnection */
|
||||||
|
|
||||||
|
#ifndef _Included_android_database_sqlite_SQLiteConnection
|
||||||
|
#define _Included_android_database_sqlite_SQLiteConnection
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#undef android_database_sqlite_SQLiteConnection_DEBUG
|
||||||
|
#define android_database_sqlite_SQLiteConnection_DEBUG 0L
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeOpen
|
||||||
|
* Signature: (Ljava/lang/String;ILjava/lang/String;ZZ)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_android_database_sqlite_SQLiteConnection_nativeOpen
|
||||||
|
(JNIEnv *, jclass, jstring, jint, jstring, jboolean, jboolean);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeClose
|
||||||
|
* Signature: (J)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_sqlite_SQLiteConnection_nativeClose
|
||||||
|
(JNIEnv *, jclass, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeRegisterCustomFunction
|
||||||
|
* Signature: (JLandroid/database/sqlite/SQLiteCustomFunction;)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_sqlite_SQLiteConnection_nativeRegisterCustomFunction
|
||||||
|
(JNIEnv *, jclass, jlong, jobject);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeRegisterLocalizedCollators
|
||||||
|
* Signature: (JLjava/lang/String;)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_sqlite_SQLiteConnection_nativeRegisterLocalizedCollators
|
||||||
|
(JNIEnv *, jclass, jlong, jstring);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativePrepareStatement
|
||||||
|
* Signature: (JLjava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_android_database_sqlite_SQLiteConnection_nativePrepareStatement
|
||||||
|
(JNIEnv *, jclass, jlong, jstring);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeFinalizeStatement
|
||||||
|
* Signature: (JJ)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_sqlite_SQLiteConnection_nativeFinalizeStatement
|
||||||
|
(JNIEnv *, jclass, jlong, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeGetParameterCount
|
||||||
|
* Signature: (JJ)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_android_database_sqlite_SQLiteConnection_nativeGetParameterCount
|
||||||
|
(JNIEnv *, jclass, jlong, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeIsReadOnly
|
||||||
|
* Signature: (JJ)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_android_database_sqlite_SQLiteConnection_nativeIsReadOnly
|
||||||
|
(JNIEnv *, jclass, jlong, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeGetColumnCount
|
||||||
|
* Signature: (JJ)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_android_database_sqlite_SQLiteConnection_nativeGetColumnCount
|
||||||
|
(JNIEnv *, jclass, jlong, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeGetColumnName
|
||||||
|
* Signature: (JJI)Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jstring JNICALL Java_android_database_sqlite_SQLiteConnection_nativeGetColumnName
|
||||||
|
(JNIEnv *, jclass, jlong, jlong, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeBindNull
|
||||||
|
* Signature: (JJI)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_sqlite_SQLiteConnection_nativeBindNull
|
||||||
|
(JNIEnv *, jclass, jlong, jlong, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeBindLong
|
||||||
|
* Signature: (JJIJ)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_sqlite_SQLiteConnection_nativeBindLong
|
||||||
|
(JNIEnv *, jclass, jlong, jlong, jint, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeBindDouble
|
||||||
|
* Signature: (JJID)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_sqlite_SQLiteConnection_nativeBindDouble
|
||||||
|
(JNIEnv *, jclass, jlong, jlong, jint, jdouble);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeBindString
|
||||||
|
* Signature: (JJILjava/lang/String;)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_sqlite_SQLiteConnection_nativeBindString
|
||||||
|
(JNIEnv *, jclass, jlong, jlong, jint, jstring);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeBindBlob
|
||||||
|
* Signature: (JJI[B)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_sqlite_SQLiteConnection_nativeBindBlob
|
||||||
|
(JNIEnv *, jclass, jlong, jlong, jint, jbyteArray);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeResetStatementAndClearBindings
|
||||||
|
* Signature: (JJ)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_sqlite_SQLiteConnection_nativeResetStatementAndClearBindings
|
||||||
|
(JNIEnv *, jclass, jlong, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeExecute
|
||||||
|
* Signature: (JJ)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_sqlite_SQLiteConnection_nativeExecute
|
||||||
|
(JNIEnv *, jclass, jlong, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeExecuteForLong
|
||||||
|
* Signature: (JJ)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_android_database_sqlite_SQLiteConnection_nativeExecuteForLong
|
||||||
|
(JNIEnv *, jclass, jlong, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeExecuteForString
|
||||||
|
* Signature: (JJ)Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jstring JNICALL Java_android_database_sqlite_SQLiteConnection_nativeExecuteForString
|
||||||
|
(JNIEnv *, jclass, jlong, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeExecuteForBlobFileDescriptor
|
||||||
|
* Signature: (JJ)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_android_database_sqlite_SQLiteConnection_nativeExecuteForBlobFileDescriptor
|
||||||
|
(JNIEnv *, jclass, jlong, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeExecuteForChangedRowCount
|
||||||
|
* Signature: (JJ)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_android_database_sqlite_SQLiteConnection_nativeExecuteForChangedRowCount
|
||||||
|
(JNIEnv *, jclass, jlong, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeExecuteForLastInsertedRowId
|
||||||
|
* Signature: (JJ)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_android_database_sqlite_SQLiteConnection_nativeExecuteForLastInsertedRowId
|
||||||
|
(JNIEnv *, jclass, jlong, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeExecuteForCursorWindow
|
||||||
|
* Signature: (JJLandroid/database/CursorWindow;IIZ)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_android_database_sqlite_SQLiteConnection_nativeExecuteForCursorWindow
|
||||||
|
(JNIEnv *, jclass, jlong, jlong, jobject, jint, jint, jboolean);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeGetDbLookaside
|
||||||
|
* Signature: (J)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_android_database_sqlite_SQLiteConnection_nativeGetDbLookaside
|
||||||
|
(JNIEnv *, jclass, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeCancel
|
||||||
|
* Signature: (J)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_sqlite_SQLiteConnection_nativeCancel
|
||||||
|
(JNIEnv *, jclass, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeResetCancel
|
||||||
|
* Signature: (JZ)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_sqlite_SQLiteConnection_nativeResetCancel
|
||||||
|
(JNIEnv *, jclass, jlong, jboolean);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteConnection
|
||||||
|
* Method: nativeHasCodec
|
||||||
|
* Signature: ()Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_android_database_sqlite_SQLiteConnection_nativeHasCodec
|
||||||
|
(JNIEnv *, jclass);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class android_database_sqlite_SQLiteDebug */
|
||||||
|
|
||||||
|
#ifndef _Included_android_database_sqlite_SQLiteDebug
|
||||||
|
#define _Included_android_database_sqlite_SQLiteDebug
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#undef android_database_sqlite_SQLiteDebug_DEBUG_LOG_SLOW_QUERIES
|
||||||
|
#define android_database_sqlite_SQLiteDebug_DEBUG_LOG_SLOW_QUERIES 0L
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteDebug
|
||||||
|
* Method: nativeGetPagerStats
|
||||||
|
* Signature: (Landroid/database/sqlite/SQLiteDebug/PagerStats;)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_android_database_sqlite_SQLiteDebug_nativeGetPagerStats
|
||||||
|
(JNIEnv *, jclass, jobject);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class android_database_sqlite_SQLiteGlobal */
|
||||||
|
|
||||||
|
#ifndef _Included_android_database_sqlite_SQLiteGlobal
|
||||||
|
#define _Included_android_database_sqlite_SQLiteGlobal
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: android_database_sqlite_SQLiteGlobal
|
||||||
|
* Method: nativeReleaseMemory
|
||||||
|
* Signature: ()I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_android_database_sqlite_SQLiteGlobal_nativeReleaseMemory
|
||||||
|
(JNIEnv *, jclass);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
@@ -6,4 +6,13 @@ import android.net.Uri;
|
|||||||
public class ContentResolver {
|
public class ContentResolver {
|
||||||
public final void registerContentObserver(Uri uri, boolean notifyForDescendants, ContentObserver observer) {
|
public final void registerContentObserver(Uri uri, boolean notifyForDescendants, ContentObserver observer) {
|
||||||
}
|
}
|
||||||
|
public final void unregisterContentObserver(ContentObserver observer) {
|
||||||
|
}
|
||||||
|
public void notifyChange(Uri uri, ContentObserver observer) {
|
||||||
|
}
|
||||||
|
public int getUserId() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
public final void registerContentObserver(Uri uri, boolean notifyForDescendants, ContentObserver observer, int userHandle) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -360,4 +360,11 @@ public class Context extends Object {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isRestricted() {return false;}
|
public boolean isRestricted() {return false;}
|
||||||
|
|
||||||
|
public File getDatabasePath(String dbName) {
|
||||||
|
File databaseDir = new File(getDataDirFile(), "databases");
|
||||||
|
if (!databaseDir.exists())
|
||||||
|
databaseDir.mkdirs();
|
||||||
|
return new File(databaseDir, dbName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
484
src/api-impl/android/database/AbstractCursor.java
Normal file
484
src/api-impl/android/database/AbstractCursor.java
Normal file
@@ -0,0 +1,484 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package android.database;
|
||||||
|
|
||||||
|
import android.content.ContentResolver;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
|
import dalvik.system.CloseGuard;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is an abstract cursor class that handles a lot of the common code
|
||||||
|
* that all cursors need to deal with and is provided for convenience reasons.
|
||||||
|
*/
|
||||||
|
public abstract class AbstractCursor implements CrossProcessCursor {
|
||||||
|
private static final String TAG = "Cursor";
|
||||||
|
/**
|
||||||
|
* @removed This field should not be used.
|
||||||
|
*/
|
||||||
|
protected HashMap<Long, Map<String, Object>> mUpdatedRows;
|
||||||
|
/**
|
||||||
|
* @removed This field should not be used.
|
||||||
|
*/
|
||||||
|
protected int mRowIdColumnIndex;
|
||||||
|
/**
|
||||||
|
* @removed This field should not be used.
|
||||||
|
*/
|
||||||
|
protected Long mCurrentRowID;
|
||||||
|
/**
|
||||||
|
* @deprecated Use {@link #getPosition()} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected int mPos;
|
||||||
|
/**
|
||||||
|
* @deprecated Use {@link #isClosed()} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected boolean mClosed;
|
||||||
|
/**
|
||||||
|
* @deprecated Do not use.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected ContentResolver mContentResolver;
|
||||||
|
|
||||||
|
private Uri mNotifyUri;
|
||||||
|
private List<Uri> mNotifyUris;
|
||||||
|
private final Object mSelfObserverLock = new Object();
|
||||||
|
private ContentObserver mSelfObserver;
|
||||||
|
private boolean mSelfObserverRegistered;
|
||||||
|
private final DataSetObservable mDataSetObservable = new DataSetObservable();
|
||||||
|
private final ContentObservable mContentObservable = new ContentObservable();
|
||||||
|
private Bundle mExtras = Bundle.EMPTY;
|
||||||
|
/** CloseGuard to detect leaked cursor **/
|
||||||
|
private final CloseGuard mCloseGuard = CloseGuard.get();
|
||||||
|
/* -------------------------------------------------------- */
|
||||||
|
/* These need to be implemented by subclasses */
|
||||||
|
@Override
|
||||||
|
abstract public int getCount();
|
||||||
|
@Override
|
||||||
|
abstract public String[] getColumnNames();
|
||||||
|
@Override
|
||||||
|
abstract public String getString(int column);
|
||||||
|
@Override
|
||||||
|
abstract public short getShort(int column);
|
||||||
|
@Override
|
||||||
|
abstract public int getInt(int column);
|
||||||
|
@Override
|
||||||
|
abstract public long getLong(int column);
|
||||||
|
@Override
|
||||||
|
abstract public float getFloat(int column);
|
||||||
|
@Override
|
||||||
|
abstract public double getDouble(int column);
|
||||||
|
@Override
|
||||||
|
abstract public boolean isNull(int column);
|
||||||
|
@Override
|
||||||
|
public int getType(int column) {
|
||||||
|
// Reflects the assumption that all commonly used field types (meaning everything
|
||||||
|
// but blobs) are convertible to strings so it should be safe to call
|
||||||
|
// getString to retrieve them.
|
||||||
|
return FIELD_TYPE_STRING;
|
||||||
|
}
|
||||||
|
// TODO implement getBlob in all cursor types
|
||||||
|
@Override
|
||||||
|
public byte[] getBlob(int column) {
|
||||||
|
throw new UnsupportedOperationException("getBlob is not supported");
|
||||||
|
}
|
||||||
|
/* -------------------------------------------------------- */
|
||||||
|
/* Methods that may optionally be implemented by subclasses */
|
||||||
|
/**
|
||||||
|
* If the cursor is backed by a {@link CursorWindow}, returns a pre-filled
|
||||||
|
* window with the contents of the cursor, otherwise null.
|
||||||
|
*
|
||||||
|
* @return The pre-filled window that backs this cursor, or null if none.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public CursorWindow getWindow() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public int getColumnCount() {
|
||||||
|
return getColumnNames().length;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void deactivate() {
|
||||||
|
onDeactivateOrClose();
|
||||||
|
}
|
||||||
|
/** @hide */
|
||||||
|
protected void onDeactivateOrClose() {
|
||||||
|
if (mSelfObserver != null) {
|
||||||
|
mContentResolver.unregisterContentObserver(mSelfObserver);
|
||||||
|
mSelfObserverRegistered = false;
|
||||||
|
}
|
||||||
|
mDataSetObservable.notifyInvalidated();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean requery() {
|
||||||
|
if (mSelfObserver != null && mSelfObserverRegistered == false) {
|
||||||
|
final int size = mNotifyUris.size();
|
||||||
|
for (int i = 0; i < size; ++i) {
|
||||||
|
final Uri notifyUri = mNotifyUris.get(i);
|
||||||
|
mContentResolver.registerContentObserver(notifyUri, true, mSelfObserver);
|
||||||
|
}
|
||||||
|
mSelfObserverRegistered = true;
|
||||||
|
}
|
||||||
|
mDataSetObservable.notifyChanged();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean isClosed() {
|
||||||
|
return mClosed;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
mClosed = true;
|
||||||
|
mContentObservable.unregisterAll();
|
||||||
|
onDeactivateOrClose();
|
||||||
|
mCloseGuard.close();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* This function is called every time the cursor is successfully scrolled
|
||||||
|
* to a new position, giving the subclass a chance to update any state it
|
||||||
|
* may have. If it returns false the move function will also do so and the
|
||||||
|
* cursor will scroll to the beforeFirst position.
|
||||||
|
*
|
||||||
|
* @param oldPosition the position that we're moving from
|
||||||
|
* @param newPosition the position that we're moving to
|
||||||
|
* @return true if the move is successful, false otherwise
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean onMove(int oldPosition, int newPosition) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) {
|
||||||
|
// Default implementation, uses getString
|
||||||
|
String result = getString(columnIndex);
|
||||||
|
if (result != null) {
|
||||||
|
char[] data = buffer.data;
|
||||||
|
if (data == null || data.length < result.length()) {
|
||||||
|
buffer.data = result.toCharArray();
|
||||||
|
} else {
|
||||||
|
result.getChars(0, result.length(), data, 0);
|
||||||
|
}
|
||||||
|
buffer.sizeCopied = result.length();
|
||||||
|
} else {
|
||||||
|
buffer.sizeCopied = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* -------------------------------------------------------- */
|
||||||
|
/* Implementation */
|
||||||
|
public AbstractCursor() {
|
||||||
|
mPos = -1;
|
||||||
|
mCloseGuard.open("AbstractCursor.close");
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public final int getPosition() {
|
||||||
|
return mPos;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public final boolean moveToPosition(int position) {
|
||||||
|
// Make sure position isn't past the end of the cursor
|
||||||
|
final int count = getCount();
|
||||||
|
if (position >= count) {
|
||||||
|
mPos = count;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Make sure position isn't before the beginning of the cursor
|
||||||
|
if (position < 0) {
|
||||||
|
mPos = -1;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Check for no-op moves, and skip the rest of the work for them
|
||||||
|
if (position == mPos) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
boolean result = onMove(mPos, position);
|
||||||
|
if (result == false) {
|
||||||
|
mPos = -1;
|
||||||
|
} else {
|
||||||
|
mPos = position;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void fillWindow(int position, CursorWindow window) {
|
||||||
|
DatabaseUtils.cursorFillWindow(this, position, window);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public final boolean move(int offset) {
|
||||||
|
return moveToPosition(mPos + offset);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public final boolean moveToFirst() {
|
||||||
|
return moveToPosition(0);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public final boolean moveToLast() {
|
||||||
|
return moveToPosition(getCount() - 1);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public final boolean moveToNext() {
|
||||||
|
return moveToPosition(mPos + 1);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public final boolean moveToPrevious() {
|
||||||
|
return moveToPosition(mPos - 1);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public final boolean isFirst() {
|
||||||
|
return mPos == 0 && getCount() != 0;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public final boolean isLast() {
|
||||||
|
int cnt = getCount();
|
||||||
|
return mPos == (cnt - 1) && cnt != 0;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public final boolean isBeforeFirst() {
|
||||||
|
if (getCount() == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return mPos == -1;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public final boolean isAfterLast() {
|
||||||
|
if (getCount() == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return mPos == getCount();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public int getColumnIndex(String columnName) {
|
||||||
|
// Hack according to bug 903852
|
||||||
|
final int periodIndex = columnName.lastIndexOf('.');
|
||||||
|
if (periodIndex != -1) {
|
||||||
|
Exception e = new Exception();
|
||||||
|
Log.e(TAG, "requesting column name with table name -- " + columnName, e);
|
||||||
|
columnName = columnName.substring(periodIndex + 1);
|
||||||
|
}
|
||||||
|
String columnNames[] = getColumnNames();
|
||||||
|
int length = columnNames.length;
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
if (columnNames[i].equalsIgnoreCase(columnName)) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (false) {
|
||||||
|
if (getCount() > 0) {
|
||||||
|
Log.w("AbstractCursor", "Unknown column " + columnName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public int getColumnIndexOrThrow(String columnName) {
|
||||||
|
final int index = getColumnIndex(columnName);
|
||||||
|
if (index < 0) {
|
||||||
|
String availableColumns = "";
|
||||||
|
try {
|
||||||
|
availableColumns = Arrays.toString(getColumnNames());
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.d(TAG, "Cannot collect column names for debug purposes", e);
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("column '" + columnName
|
||||||
|
+ "' does not exist. Available columns: " + availableColumns);
|
||||||
|
}
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public String getColumnName(int columnIndex) {
|
||||||
|
return getColumnNames()[columnIndex];
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void registerContentObserver(ContentObserver observer) {
|
||||||
|
mContentObservable.registerObserver(observer);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void unregisterContentObserver(ContentObserver observer) {
|
||||||
|
// cursor will unregister all observers when it close
|
||||||
|
if (!mClosed) {
|
||||||
|
mContentObservable.unregisterObserver(observer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void registerDataSetObserver(DataSetObserver observer) {
|
||||||
|
mDataSetObservable.registerObserver(observer);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void unregisterDataSetObserver(DataSetObserver observer) {
|
||||||
|
mDataSetObservable.unregisterObserver(observer);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Subclasses must call this method when they finish committing updates to notify all
|
||||||
|
* observers.
|
||||||
|
*
|
||||||
|
* @param selfChange
|
||||||
|
*/
|
||||||
|
protected void onChange(boolean selfChange) {
|
||||||
|
synchronized (mSelfObserverLock) {
|
||||||
|
mContentObservable.dispatchChange(selfChange, null);
|
||||||
|
if (mNotifyUris != null && selfChange) {
|
||||||
|
final int size = mNotifyUris.size();
|
||||||
|
for (int i = 0; i < size; ++i) {
|
||||||
|
final Uri notifyUri = mNotifyUris.get(i);
|
||||||
|
mContentResolver.notifyChange(notifyUri, mSelfObserver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Specifies a content URI to watch for changes.
|
||||||
|
*
|
||||||
|
* @param cr The content resolver from the caller's context.
|
||||||
|
* @param notifyUri The URI to watch for changes. This can be a
|
||||||
|
* specific row URI, or a base URI for a whole class of content.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setNotificationUri(ContentResolver cr, Uri notifyUri) {
|
||||||
|
setNotificationUris(cr, Arrays.asList(notifyUri));
|
||||||
|
}
|
||||||
|
// @Override
|
||||||
|
public void setNotificationUris(ContentResolver cr, List<Uri> notifyUris) {
|
||||||
|
Objects.requireNonNull(cr);
|
||||||
|
Objects.requireNonNull(notifyUris);
|
||||||
|
setNotificationUris(cr, notifyUris, cr.getUserId(), true);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Set the notification uri but with an observer for a particular user's view. Also allows
|
||||||
|
* disabling the use of a self observer, which is sensible if either
|
||||||
|
* a) the cursor's owner calls {@link #onChange(boolean)} whenever the content changes, or
|
||||||
|
* b) the cursor is known not to have any content observers.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public void setNotificationUris(ContentResolver cr, List<Uri> notifyUris, int userHandle,
|
||||||
|
boolean registerSelfObserver) {
|
||||||
|
synchronized (mSelfObserverLock) {
|
||||||
|
mNotifyUris = notifyUris;
|
||||||
|
mNotifyUri = mNotifyUris.get(0);
|
||||||
|
mContentResolver = cr;
|
||||||
|
if (mSelfObserver != null) {
|
||||||
|
mContentResolver.unregisterContentObserver(mSelfObserver);
|
||||||
|
mSelfObserverRegistered = false;
|
||||||
|
}
|
||||||
|
if (registerSelfObserver) {
|
||||||
|
mSelfObserver = new SelfContentObserver(this);
|
||||||
|
final int size = mNotifyUris.size();
|
||||||
|
for (int i = 0; i < size; ++i) {
|
||||||
|
final Uri notifyUri = mNotifyUris.get(i);
|
||||||
|
mContentResolver.registerContentObserver(
|
||||||
|
notifyUri, true, mSelfObserver, userHandle);
|
||||||
|
}
|
||||||
|
mSelfObserverRegistered = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public Uri getNotificationUri() {
|
||||||
|
synchronized (mSelfObserverLock) {
|
||||||
|
return mNotifyUri;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// @Override
|
||||||
|
public List<Uri> getNotificationUris() {
|
||||||
|
synchronized (mSelfObserverLock) {
|
||||||
|
return mNotifyUris;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean getWantsAllOnMoveCalls() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// @Override
|
||||||
|
public void setExtras(Bundle extras) {
|
||||||
|
mExtras = (extras == null) ? Bundle.EMPTY : extras;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public Bundle getExtras() {
|
||||||
|
return mExtras;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public Bundle respond(Bundle extras) {
|
||||||
|
return Bundle.EMPTY;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @deprecated Always returns false since Cursors do not support updating rows
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected boolean isFieldUpdated(int columnIndex) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @deprecated Always returns null since Cursors do not support updating rows
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
protected Object getUpdatedField(int columnIndex) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* This function throws CursorIndexOutOfBoundsException if
|
||||||
|
* the cursor position is out of bounds. Subclass implementations of
|
||||||
|
* the get functions should call this before attempting
|
||||||
|
* to retrieve data.
|
||||||
|
*
|
||||||
|
* @throws CursorIndexOutOfBoundsException
|
||||||
|
*/
|
||||||
|
protected void checkPosition() {
|
||||||
|
if (-1 == mPos || getCount() == mPos) {
|
||||||
|
// throw new CursorIndexOutOfBoundsException(mPos, getCount());
|
||||||
|
throw new IndexOutOfBoundsException("index = " + mPos + " count = " + getCount());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
protected void finalize() {
|
||||||
|
if (mSelfObserver != null && mSelfObserverRegistered == true) {
|
||||||
|
mContentResolver.unregisterContentObserver(mSelfObserver);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if (mCloseGuard != null) mCloseGuard.warnIfOpen();
|
||||||
|
if (!mClosed) close();
|
||||||
|
} catch(Exception e) { }
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Cursors use this class to track changes others make to their URI.
|
||||||
|
*/
|
||||||
|
protected static class SelfContentObserver extends ContentObserver {
|
||||||
|
WeakReference<AbstractCursor> mCursor;
|
||||||
|
public SelfContentObserver(AbstractCursor cursor) {
|
||||||
|
super(null);
|
||||||
|
mCursor = new WeakReference<AbstractCursor>(cursor);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean deliverSelfNotifications() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onChange(boolean selfChange) {
|
||||||
|
AbstractCursor cursor = mCursor.get();
|
||||||
|
if (cursor != null) {
|
||||||
|
cursor.onChange(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
209
src/api-impl/android/database/AbstractWindowedCursor.java
Normal file
209
src/api-impl/android/database/AbstractWindowedCursor.java
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package android.database;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A base class for Cursors that store their data in {@link CursorWindow}s.
|
||||||
|
* <p>
|
||||||
|
* The cursor owns the cursor window it uses. When the cursor is closed,
|
||||||
|
* its window is also closed. Likewise, when the window used by the cursor is
|
||||||
|
* changed, its old window is closed. This policy of strict ownership ensures
|
||||||
|
* that cursor windows are not leaked.
|
||||||
|
* </p><p>
|
||||||
|
* Subclasses are responsible for filling the cursor window with data during
|
||||||
|
* {@link #onMove(int, int)}, allocating a new cursor window if necessary.
|
||||||
|
* During {@link #requery()}, the existing cursor window should be cleared and
|
||||||
|
* filled with new data.
|
||||||
|
* </p><p>
|
||||||
|
* If the contents of the cursor change or become invalid, the old window must be closed
|
||||||
|
* (because it is owned by the cursor) and set to null.
|
||||||
|
* </p>
|
||||||
|
*/
|
||||||
|
public abstract class AbstractWindowedCursor extends AbstractCursor {
|
||||||
|
/**
|
||||||
|
* The cursor window owned by this cursor.
|
||||||
|
*/
|
||||||
|
protected CursorWindow mWindow;
|
||||||
|
@Override
|
||||||
|
public byte[] getBlob(int columnIndex) {
|
||||||
|
checkPosition();
|
||||||
|
return mWindow.getBlob(mPos, columnIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getString(int columnIndex) {
|
||||||
|
checkPosition();
|
||||||
|
return mWindow.getString(mPos, columnIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) {
|
||||||
|
checkPosition();
|
||||||
|
mWindow.copyStringToBuffer(mPos, columnIndex, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public short getShort(int columnIndex) {
|
||||||
|
checkPosition();
|
||||||
|
return mWindow.getShort(mPos, columnIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getInt(int columnIndex) {
|
||||||
|
checkPosition();
|
||||||
|
return mWindow.getInt(mPos, columnIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getLong(int columnIndex) {
|
||||||
|
checkPosition();
|
||||||
|
return mWindow.getLong(mPos, columnIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getFloat(int columnIndex) {
|
||||||
|
checkPosition();
|
||||||
|
return mWindow.getFloat(mPos, columnIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getDouble(int columnIndex) {
|
||||||
|
checkPosition();
|
||||||
|
return mWindow.getDouble(mPos, columnIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNull(int columnIndex) {
|
||||||
|
checkPosition();
|
||||||
|
return mWindow.getType(mPos, columnIndex) == Cursor.FIELD_TYPE_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use {@link #getType}
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public boolean isBlob(int columnIndex) {
|
||||||
|
return getType(columnIndex) == Cursor.FIELD_TYPE_BLOB;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use {@link #getType}
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public boolean isString(int columnIndex) {
|
||||||
|
return getType(columnIndex) == Cursor.FIELD_TYPE_STRING;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use {@link #getType}
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public boolean isLong(int columnIndex) {
|
||||||
|
return getType(columnIndex) == Cursor.FIELD_TYPE_INTEGER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use {@link #getType}
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public boolean isFloat(int columnIndex) {
|
||||||
|
return getType(columnIndex) == Cursor.FIELD_TYPE_FLOAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getType(int columnIndex) {
|
||||||
|
checkPosition();
|
||||||
|
return mWindow.getType(mPos, columnIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void checkPosition() {
|
||||||
|
super.checkPosition();
|
||||||
|
|
||||||
|
if (mWindow == null) {
|
||||||
|
throw new /*StaleDataException*/RuntimeException("Attempting to access a closed CursorWindow." +
|
||||||
|
"Most probable cause: cursor is deactivated prior to calling this method.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CursorWindow getWindow() {
|
||||||
|
return mWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a new cursor window for the cursor to use.
|
||||||
|
* <p>
|
||||||
|
* The cursor takes ownership of the provided cursor window; the cursor window
|
||||||
|
* will be closed when the cursor is closed or when the cursor adopts a new
|
||||||
|
* cursor window.
|
||||||
|
* </p><p>
|
||||||
|
* If the cursor previously had a cursor window, then it is closed when the
|
||||||
|
* new cursor window is assigned.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param window The new cursor window, typically a remote cursor window.
|
||||||
|
*/
|
||||||
|
public void setWindow(CursorWindow window) {
|
||||||
|
if (window != mWindow) {
|
||||||
|
closeWindow();
|
||||||
|
mWindow = window;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the cursor has an associated cursor window.
|
||||||
|
*
|
||||||
|
* @return True if the cursor has an associated cursor window.
|
||||||
|
*/
|
||||||
|
public boolean hasWindow() {
|
||||||
|
return mWindow != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the cursor window and sets {@link #mWindow} to null.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
protected void closeWindow() {
|
||||||
|
if (mWindow != null) {
|
||||||
|
mWindow.close();
|
||||||
|
mWindow = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If there is a window, clear it.
|
||||||
|
* Otherwise, creates a new window.
|
||||||
|
*
|
||||||
|
* @param name The window name.
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
protected void clearOrCreateWindow(String name) {
|
||||||
|
if (mWindow == null) {
|
||||||
|
mWindow = new CursorWindow(name);
|
||||||
|
} else {
|
||||||
|
mWindow.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @hide */
|
||||||
|
@Override
|
||||||
|
protected void onDeactivateOrClose() {
|
||||||
|
super.onDeactivateOrClose();
|
||||||
|
closeWindow();
|
||||||
|
}
|
||||||
|
}
|
||||||
33
src/api-impl/android/database/CharArrayBuffer.java
Normal file
33
src/api-impl/android/database/CharArrayBuffer.java
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2008 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package android.database;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is used for {@link Cursor#copyStringToBuffer}
|
||||||
|
*/
|
||||||
|
public final class CharArrayBuffer {
|
||||||
|
public CharArrayBuffer(int size) {
|
||||||
|
data = new char[size];
|
||||||
|
}
|
||||||
|
|
||||||
|
public CharArrayBuffer(char[] buf) {
|
||||||
|
data = buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
public char[] data; // In and out parameter
|
||||||
|
public int sizeCopied; // Out parameter
|
||||||
|
}
|
||||||
91
src/api-impl/android/database/ContentObservable.java
Normal file
91
src/api-impl/android/database/ContentObservable.java
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2007 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package android.database;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A specialization of {@link Observable} for {@link ContentObserver}
|
||||||
|
* that provides methods for sending notifications to a list of
|
||||||
|
* {@link ContentObserver} objects.
|
||||||
|
*/
|
||||||
|
public class ContentObservable extends Observable<ContentObserver> {
|
||||||
|
// Even though the generic method defined in Observable would be perfectly
|
||||||
|
// fine on its own, we can't delete this overridden method because it would
|
||||||
|
// potentially break binary compatibility with existing applications.
|
||||||
|
@Override
|
||||||
|
public void registerObserver(ContentObserver observer) {
|
||||||
|
super.registerObserver(observer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invokes {@link ContentObserver#dispatchChange(boolean)} on each observer.
|
||||||
|
* <p>
|
||||||
|
* If <code>selfChange</code> is true, only delivers the notification
|
||||||
|
* to the observer if it has indicated that it wants to receive self-change
|
||||||
|
* notifications by implementing {@link ContentObserver#deliverSelfNotifications}
|
||||||
|
* to return true.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param selfChange True if this is a self-change notification.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link #dispatchChange(boolean, Uri)} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public void dispatchChange(boolean selfChange) {
|
||||||
|
dispatchChange(selfChange, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invokes {@link ContentObserver#dispatchChange(boolean, Uri)} on each observer.
|
||||||
|
* Includes the changed content Uri when available.
|
||||||
|
* <p>
|
||||||
|
* If <code>selfChange</code> is true, only delivers the notification
|
||||||
|
* to the observer if it has indicated that it wants to receive self-change
|
||||||
|
* notifications by implementing {@link ContentObserver#deliverSelfNotifications}
|
||||||
|
* to return true.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param selfChange True if this is a self-change notification.
|
||||||
|
* @param uri The Uri of the changed content, or null if unknown.
|
||||||
|
*/
|
||||||
|
public void dispatchChange(boolean selfChange, Uri uri) {
|
||||||
|
synchronized(mObservers) {
|
||||||
|
for (ContentObserver observer : mObservers) {
|
||||||
|
if (!selfChange || observer.deliverSelfNotifications()) {
|
||||||
|
observer.dispatchChange(selfChange, uri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invokes {@link ContentObserver#onChange} on each observer.
|
||||||
|
*
|
||||||
|
* @param selfChange True if this is a self-change notification.
|
||||||
|
*
|
||||||
|
* @deprecated Use {@link #dispatchChange} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public void notifyChange(boolean selfChange) {
|
||||||
|
synchronized(mObservers) {
|
||||||
|
for (ContentObserver observer : mObservers) {
|
||||||
|
observer.onChange(selfChange, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,251 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2007 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.
|
||||||
|
*/
|
||||||
|
|
||||||
package android.database;
|
package android.database;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.os.UserHandle;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
/**
|
||||||
|
* Receives call backs for changes to content.
|
||||||
|
* Must be implemented by objects which are added to a {@link ContentObservable}.
|
||||||
|
*/
|
||||||
|
public abstract class ContentObserver {
|
||||||
|
/**
|
||||||
|
* Starting in {@link android.os.Build.VERSION_CODES#R}, there is a new
|
||||||
|
* public API overload {@link #onChange(boolean, Uri, int)} that delivers a
|
||||||
|
* {@code int flags} argument.
|
||||||
|
* <p>
|
||||||
|
* Some apps may be relying on a previous hidden API that delivered a
|
||||||
|
* {@code int userId} argument, and this change is used to control delivery
|
||||||
|
* of the new {@code int flags} argument in its place.
|
||||||
|
*/
|
||||||
|
private static final long ADD_CONTENT_OBSERVER_FLAGS = 150939131L;
|
||||||
|
private final Object mLock = new Object();
|
||||||
|
Handler mHandler;
|
||||||
|
|
||||||
public class ContentObserver {
|
/**
|
||||||
public ContentObserver() {
|
* Creates a content observer.
|
||||||
}
|
*
|
||||||
|
* @param handler The handler to run {@link #onChange} on, or null if none.
|
||||||
|
*/
|
||||||
public ContentObserver(Handler handler) {
|
public ContentObserver(Handler handler) {
|
||||||
|
mHandler = handler;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* Returns true if this observer is interested receiving self-change notifications.
|
||||||
|
*
|
||||||
|
* Subclasses should override this method to indicate whether the observer
|
||||||
|
* is interested in receiving notifications for changes that it made to the
|
||||||
|
* content itself.
|
||||||
|
*
|
||||||
|
* @return True if self-change notifications should be delivered to the observer.
|
||||||
|
*/
|
||||||
|
public boolean deliverSelfNotifications() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* This method is called when a content change occurs.
|
||||||
|
* <p>
|
||||||
|
* Subclasses should override this method to handle content changes.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param selfChange True if this is a self-change notification.
|
||||||
|
*/
|
||||||
|
public void onChange(boolean selfChange) {
|
||||||
|
// Do nothing. Subclass should override.
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* This method is called when a content change occurs.
|
||||||
|
* Includes the changed content Uri when available.
|
||||||
|
* <p>
|
||||||
|
* Subclasses should override this method to handle content changes. To
|
||||||
|
* ensure correct operation on older versions of the framework that did not
|
||||||
|
* provide richer arguments, applications should implement all overloads.
|
||||||
|
* <p>
|
||||||
|
* Example implementation:
|
||||||
|
* <pre><code>
|
||||||
|
* // Implement the onChange(boolean) method to delegate the change notification to
|
||||||
|
* // the onChange(boolean, Uri) method to ensure correct operation on older versions
|
||||||
|
* // of the framework that did not have the onChange(boolean, Uri) method.
|
||||||
|
* {@literal @Override}
|
||||||
|
* public void onChange(boolean selfChange) {
|
||||||
|
* onChange(selfChange, null);
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* // Implement the onChange(boolean, Uri) method to take advantage of the new Uri argument.
|
||||||
|
* {@literal @Override}
|
||||||
|
* public void onChange(boolean selfChange, Uri uri) {
|
||||||
|
* // Handle change.
|
||||||
|
* }
|
||||||
|
* </code></pre>
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param selfChange True if this is a self-change notification.
|
||||||
|
* @param uri The Uri of the changed content.
|
||||||
|
*/
|
||||||
|
public void onChange(boolean selfChange, Uri uri) {
|
||||||
|
onChange(selfChange);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* This method is called when a content change occurs. Includes the changed
|
||||||
|
* content Uri when available.
|
||||||
|
* <p>
|
||||||
|
* Subclasses should override this method to handle content changes. To
|
||||||
|
* ensure correct operation on older versions of the framework that did not
|
||||||
|
* provide richer arguments, applications should implement all overloads.
|
||||||
|
*
|
||||||
|
* @param selfChange True if this is a self-change notification.
|
||||||
|
* @param uri The Uri of the changed content.
|
||||||
|
* @param flags Flags indicating details about this change.
|
||||||
|
*/
|
||||||
|
public void onChange(boolean selfChange, Uri uri, int flags) {
|
||||||
|
onChange(selfChange, uri);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* This method is called when a content change occurs. Includes the changed
|
||||||
|
* content Uris when available.
|
||||||
|
* <p>
|
||||||
|
* Subclasses should override this method to handle content changes. To
|
||||||
|
* ensure correct operation on older versions of the framework that did not
|
||||||
|
* provide richer arguments, applications should implement all overloads.
|
||||||
|
*
|
||||||
|
* @param selfChange True if this is a self-change notification.
|
||||||
|
* @param uris The Uris of the changed content.
|
||||||
|
* @param flags Flags indicating details about this change.
|
||||||
|
*/
|
||||||
|
public void onChange(boolean selfChange, Collection<Uri> uris,
|
||||||
|
int flags) {
|
||||||
|
for (Uri uri : uris) {
|
||||||
|
onChange(selfChange, uri, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* This method is called when a content change occurs. Includes the changed
|
||||||
|
* content Uris when available.
|
||||||
|
* <p>
|
||||||
|
* Subclasses should override this method to handle content changes. To
|
||||||
|
* ensure correct operation on older versions of the framework that did not
|
||||||
|
* provide richer arguments, applications should implement all overloads.
|
||||||
|
*
|
||||||
|
* @param selfChange True if this is a self-change notification.
|
||||||
|
* @param uris The Uris of the changed content.
|
||||||
|
* @param flags Flags indicating details about this change.
|
||||||
|
* @param user The corresponding {@link UserHandle} for the current notification.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public void onChange(boolean selfChange, Collection<Uri> uris,
|
||||||
|
int flags, UserHandle user) {
|
||||||
|
onChange(selfChange, uris, user.getIdentifier());
|
||||||
|
}
|
||||||
|
/** @hide */
|
||||||
|
public void onChange(boolean selfChange, Collection<Uri> uris,
|
||||||
|
int flags, int userId) {
|
||||||
|
// There are dozens of people relying on the hidden API inside the
|
||||||
|
// system UID, so hard-code the old behavior for all of them; for
|
||||||
|
// everyone else we gate based on a specific change
|
||||||
|
// if (!CompatChanges.isChangeEnabled(ADD_CONTENT_OBSERVER_FLAGS)
|
||||||
|
// || android.os.Process.myUid() == android.os.Process.SYSTEM_UID) {
|
||||||
|
// // Deliver userId through argument to preserve hidden API behavior
|
||||||
|
// onChange(selfChange, uris, flags, UserHandle.of(userId));
|
||||||
|
// } else {
|
||||||
|
onChange(selfChange, uris, flags);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Dispatches a change notification to the observer.
|
||||||
|
* <p>
|
||||||
|
* If a {@link Handler} was supplied to the {@link ContentObserver}
|
||||||
|
* constructor, then a call to the {@link #onChange} method is posted to the
|
||||||
|
* handler's message queue. Otherwise, the {@link #onChange} method is
|
||||||
|
* invoked immediately on this thread.
|
||||||
|
*
|
||||||
|
* @deprecated Callers should migrate towards using a richer overload that
|
||||||
|
* provides more details about the change, such as
|
||||||
|
* {@link #dispatchChange(boolean, Collection, int)}.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public final void dispatchChange(boolean selfChange) {
|
||||||
|
dispatchChange(selfChange, null);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Dispatches a change notification to the observer. Includes the changed
|
||||||
|
* content Uri when available.
|
||||||
|
* <p>
|
||||||
|
* If a {@link Handler} was supplied to the {@link ContentObserver}
|
||||||
|
* constructor, then a call to the {@link #onChange} method is posted to the
|
||||||
|
* handler's message queue. Otherwise, the {@link #onChange} method is
|
||||||
|
* invoked immediately on this thread.
|
||||||
|
*
|
||||||
|
* @param selfChange True if this is a self-change notification.
|
||||||
|
* @param uri The Uri of the changed content.
|
||||||
|
*/
|
||||||
|
public final void dispatchChange(boolean selfChange, Uri uri) {
|
||||||
|
dispatchChange(selfChange, uri, 0);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Dispatches a change notification to the observer. Includes the changed
|
||||||
|
* content Uri when available.
|
||||||
|
* <p>
|
||||||
|
* If a {@link Handler} was supplied to the {@link ContentObserver}
|
||||||
|
* constructor, then a call to the {@link #onChange} method is posted to the
|
||||||
|
* handler's message queue. Otherwise, the {@link #onChange} method is
|
||||||
|
* invoked immediately on this thread.
|
||||||
|
*
|
||||||
|
* @param selfChange True if this is a self-change notification.
|
||||||
|
* @param uri The Uri of the changed content.
|
||||||
|
* @param flags Flags indicating details about this change.
|
||||||
|
*/
|
||||||
|
public final void dispatchChange(boolean selfChange, Uri uri,
|
||||||
|
int flags) {
|
||||||
|
dispatchChange(selfChange, Arrays.asList(uri), flags);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Dispatches a change notification to the observer. Includes the changed
|
||||||
|
* content Uris when available.
|
||||||
|
* <p>
|
||||||
|
* If a {@link Handler} was supplied to the {@link ContentObserver}
|
||||||
|
* constructor, then a call to the {@link #onChange} method is posted to the
|
||||||
|
* handler's message queue. Otherwise, the {@link #onChange} method is
|
||||||
|
* invoked immediately on this thread.
|
||||||
|
*
|
||||||
|
* @param selfChange True if this is a self-change notification.
|
||||||
|
* @param uris The Uri of the changed content.
|
||||||
|
* @param flags Flags indicating details about this change.
|
||||||
|
*/
|
||||||
|
public final void dispatchChange(boolean selfChange, Collection<Uri> uris,
|
||||||
|
int flags) {
|
||||||
|
dispatchChange(selfChange, uris, flags, UserHandle.getCallingUserId());
|
||||||
|
}
|
||||||
|
/** @hide */
|
||||||
|
public final void dispatchChange(final boolean selfChange, final Collection<Uri> uris,
|
||||||
|
final int flags, final int userId) {
|
||||||
|
if (mHandler == null) {
|
||||||
|
onChange(selfChange, uris, flags, userId);
|
||||||
|
} else {
|
||||||
|
mHandler.post(new Runnable(){
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
onChange(selfChange, uris, flags, userId);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
78
src/api-impl/android/database/CrossProcessCursor.java
Normal file
78
src/api-impl/android/database/CrossProcessCursor.java
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2008 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package android.database;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A cross process cursor is an extension of a {@link Cursor} that also supports
|
||||||
|
* usage from remote processes.
|
||||||
|
* <p>
|
||||||
|
* The contents of a cross process cursor are marshalled to the remote process by
|
||||||
|
* filling {@link CursorWindow} objects using {@link #fillWindow}. As an optimization,
|
||||||
|
* the cursor can provide a pre-filled window to use via {@link #getWindow} thereby
|
||||||
|
* obviating the need to copy the data to yet another cursor window.
|
||||||
|
*/
|
||||||
|
public interface CrossProcessCursor extends Cursor {
|
||||||
|
/**
|
||||||
|
* Returns a pre-filled window that contains the data within this cursor.
|
||||||
|
* <p>
|
||||||
|
* In particular, the window contains the row indicated by {@link Cursor#getPosition}.
|
||||||
|
* The window's contents are automatically scrolled whenever the current
|
||||||
|
* row moved outside the range covered by the window.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @return The pre-filled window, or null if none.
|
||||||
|
*/
|
||||||
|
CursorWindow getWindow();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copies cursor data into the window.
|
||||||
|
* <p>
|
||||||
|
* Clears the window and fills it with data beginning at the requested
|
||||||
|
* row position until all of the data in the cursor is exhausted
|
||||||
|
* or the window runs out of space.
|
||||||
|
* </p><p>
|
||||||
|
* The filled window uses the same row indices as the original cursor.
|
||||||
|
* For example, if you fill a window starting from row 5 from the cursor,
|
||||||
|
* you can query the contents of row 5 from the window just by asking it
|
||||||
|
* for row 5 because there is a direct correspondence between the row indices
|
||||||
|
* used by the cursor and the window.
|
||||||
|
* </p><p>
|
||||||
|
* The current position of the cursor, as returned by {@link #getPosition},
|
||||||
|
* is not changed by this method.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param position The zero-based index of the first row to copy into the window.
|
||||||
|
* @param window The window to fill.
|
||||||
|
*/
|
||||||
|
void fillWindow(int position, CursorWindow window);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is called every time the cursor is successfully scrolled
|
||||||
|
* to a new position, giving the subclass a chance to update any state it
|
||||||
|
* may have. If it returns false the move function will also do so and the
|
||||||
|
* cursor will scroll to the beforeFirst position.
|
||||||
|
* <p>
|
||||||
|
* This function should be called by methods such as {@link #moveToPosition(int)},
|
||||||
|
* so it will typically not be called from outside of the cursor class itself.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param oldPosition The position that we're moving from.
|
||||||
|
* @param newPosition The position that we're moving to.
|
||||||
|
* @return True if the move is successful, false otherwise.
|
||||||
|
*/
|
||||||
|
boolean onMove(int oldPosition, int newPosition);
|
||||||
|
}
|
||||||
@@ -17,13 +17,10 @@
|
|||||||
package android.database;
|
package android.database;
|
||||||
|
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.database.ContentObserver;
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import java.io.Closeable;
|
import java.io.Closeable;
|
||||||
|
|
||||||
class CharArrayBuffer {}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This interface provides random read-write access to the result set returned
|
* This interface provides random read-write access to the result set returned
|
||||||
* by a database query.
|
* by a database query.
|
||||||
@@ -80,7 +77,7 @@ public interface Cursor extends Closeable {
|
|||||||
*
|
*
|
||||||
* @return the current cursor position.
|
* @return the current cursor position.
|
||||||
*/
|
*/
|
||||||
// int getPosition();
|
int getPosition();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move the cursor by a relative amount, forward or backward, from the
|
* Move the cursor by a relative amount, forward or backward, from the
|
||||||
@@ -97,7 +94,7 @@ public interface Cursor extends Closeable {
|
|||||||
* @param offset the offset to be applied from the current position.
|
* @param offset the offset to be applied from the current position.
|
||||||
* @return whether the requested move fully succeeded.
|
* @return whether the requested move fully succeeded.
|
||||||
*/
|
*/
|
||||||
// boolean move(int offset);
|
boolean move(int offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move the cursor to an absolute position. The valid
|
* Move the cursor to an absolute position. The valid
|
||||||
@@ -109,7 +106,7 @@ public interface Cursor extends Closeable {
|
|||||||
* @param position the zero-based position to move to.
|
* @param position the zero-based position to move to.
|
||||||
* @return whether the requested move fully succeeded.
|
* @return whether the requested move fully succeeded.
|
||||||
*/
|
*/
|
||||||
// boolean moveToPosition(int position);
|
boolean moveToPosition(int position);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move the cursor to the first row.
|
* Move the cursor to the first row.
|
||||||
@@ -127,7 +124,7 @@ public interface Cursor extends Closeable {
|
|||||||
*
|
*
|
||||||
* @return whether the move succeeded.
|
* @return whether the move succeeded.
|
||||||
*/
|
*/
|
||||||
// boolean moveToLast();
|
boolean moveToLast();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Move the cursor to the next row.
|
* Move the cursor to the next row.
|
||||||
@@ -147,21 +144,21 @@ public interface Cursor extends Closeable {
|
|||||||
*
|
*
|
||||||
* @return whether the move succeeded.
|
* @return whether the move succeeded.
|
||||||
*/
|
*/
|
||||||
// boolean moveToPrevious();
|
boolean moveToPrevious();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether the cursor is pointing to the first row.
|
* Returns whether the cursor is pointing to the first row.
|
||||||
*
|
*
|
||||||
* @return whether the cursor is pointing at the first entry.
|
* @return whether the cursor is pointing at the first entry.
|
||||||
*/
|
*/
|
||||||
// boolean isFirst();
|
boolean isFirst();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether the cursor is pointing to the last row.
|
* Returns whether the cursor is pointing to the last row.
|
||||||
*
|
*
|
||||||
* @return whether the cursor is pointing at the last entry.
|
* @return whether the cursor is pointing at the last entry.
|
||||||
*/
|
*/
|
||||||
// boolean isLast();
|
boolean isLast();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether the cursor is pointing to the position before the first
|
* Returns whether the cursor is pointing to the position before the first
|
||||||
@@ -169,7 +166,7 @@ public interface Cursor extends Closeable {
|
|||||||
*
|
*
|
||||||
* @return whether the cursor is before the first result.
|
* @return whether the cursor is before the first result.
|
||||||
*/
|
*/
|
||||||
// boolean isBeforeFirst();
|
boolean isBeforeFirst();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether the cursor is pointing to the position after the last
|
* Returns whether the cursor is pointing to the position after the last
|
||||||
@@ -202,7 +199,7 @@ public interface Cursor extends Closeable {
|
|||||||
* @see #getColumnIndex(String)
|
* @see #getColumnIndex(String)
|
||||||
* @throws IllegalArgumentException if the column does not exist
|
* @throws IllegalArgumentException if the column does not exist
|
||||||
*/
|
*/
|
||||||
// int getColumnIndexOrThrow(String columnName) throws IllegalArgumentException;
|
int getColumnIndexOrThrow(String columnName) throws IllegalArgumentException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the column name at the given zero-based column index.
|
* Returns the column name at the given zero-based column index.
|
||||||
@@ -210,7 +207,7 @@ public interface Cursor extends Closeable {
|
|||||||
* @param columnIndex the zero-based index of the target column.
|
* @param columnIndex the zero-based index of the target column.
|
||||||
* @return the column name for the given column index.
|
* @return the column name for the given column index.
|
||||||
*/
|
*/
|
||||||
// String getColumnName(int columnIndex);
|
String getColumnName(int columnIndex);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a string array holding the names of all of the columns in the
|
* Returns a string array holding the names of all of the columns in the
|
||||||
@@ -218,13 +215,13 @@ public interface Cursor extends Closeable {
|
|||||||
*
|
*
|
||||||
* @return the names of the columns returned in this query.
|
* @return the names of the columns returned in this query.
|
||||||
*/
|
*/
|
||||||
// String[] getColumnNames();
|
String[] getColumnNames();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return total number of columns
|
* Return total number of columns
|
||||||
* @return number of columns
|
* @return number of columns
|
||||||
*/
|
*/
|
||||||
// int getColumnCount();
|
int getColumnCount();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the value of the requested column as a byte array.
|
* Returns the value of the requested column as a byte array.
|
||||||
@@ -236,7 +233,7 @@ public interface Cursor extends Closeable {
|
|||||||
* @param columnIndex the zero-based index of the target column.
|
* @param columnIndex the zero-based index of the target column.
|
||||||
* @return the value of that column as a byte array.
|
* @return the value of that column as a byte array.
|
||||||
*/
|
*/
|
||||||
// byte[] getBlob(int columnIndex);
|
byte[] getBlob(int columnIndex);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the value of the requested column as a String.
|
* Returns the value of the requested column as a String.
|
||||||
@@ -258,7 +255,7 @@ public interface Cursor extends Closeable {
|
|||||||
* if the target column is null, return buffer
|
* if the target column is null, return buffer
|
||||||
* @param buffer the buffer to copy the text into.
|
* @param buffer the buffer to copy the text into.
|
||||||
*/
|
*/
|
||||||
// void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer);
|
void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the value of the requested column as a short.
|
* Returns the value of the requested column as a short.
|
||||||
@@ -271,7 +268,7 @@ public interface Cursor extends Closeable {
|
|||||||
* @param columnIndex the zero-based index of the target column.
|
* @param columnIndex the zero-based index of the target column.
|
||||||
* @return the value of that column as a short.
|
* @return the value of that column as a short.
|
||||||
*/
|
*/
|
||||||
// short getShort(int columnIndex);
|
short getShort(int columnIndex);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the value of the requested column as an int.
|
* Returns the value of the requested column as an int.
|
||||||
@@ -310,7 +307,7 @@ public interface Cursor extends Closeable {
|
|||||||
* @param columnIndex the zero-based index of the target column.
|
* @param columnIndex the zero-based index of the target column.
|
||||||
* @return the value of that column as a float.
|
* @return the value of that column as a float.
|
||||||
*/
|
*/
|
||||||
// float getFloat(int columnIndex);
|
float getFloat(int columnIndex);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the value of the requested column as a double.
|
* Returns the value of the requested column as a double.
|
||||||
@@ -323,7 +320,7 @@ public interface Cursor extends Closeable {
|
|||||||
* @param columnIndex the zero-based index of the target column.
|
* @param columnIndex the zero-based index of the target column.
|
||||||
* @return the value of that column as a double.
|
* @return the value of that column as a double.
|
||||||
*/
|
*/
|
||||||
// double getDouble(int columnIndex);
|
double getDouble(int columnIndex);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns data type of the given column's value.
|
* Returns data type of the given column's value.
|
||||||
@@ -344,7 +341,7 @@ public interface Cursor extends Closeable {
|
|||||||
* @param columnIndex the zero-based index of the target column.
|
* @param columnIndex the zero-based index of the target column.
|
||||||
* @return column value type
|
* @return column value type
|
||||||
*/
|
*/
|
||||||
// int getType(int columnIndex);
|
int getType(int columnIndex);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns <code>true</code> if the value in the indicated column is null.
|
* Returns <code>true</code> if the value in the indicated column is null.
|
||||||
@@ -352,7 +349,7 @@ public interface Cursor extends Closeable {
|
|||||||
* @param columnIndex the zero-based index of the target column.
|
* @param columnIndex the zero-based index of the target column.
|
||||||
* @return whether the column value is null.
|
* @return whether the column value is null.
|
||||||
*/
|
*/
|
||||||
// boolean isNull(int columnIndex);
|
boolean isNull(int columnIndex);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deactivates the Cursor, making all calls on it fail until {@link #requery} is called.
|
* Deactivates the Cursor, making all calls on it fail until {@link #requery} is called.
|
||||||
@@ -390,7 +387,7 @@ public interface Cursor extends Closeable {
|
|||||||
* return true if the cursor is closed
|
* return true if the cursor is closed
|
||||||
* @return true if the cursor is closed.
|
* @return true if the cursor is closed.
|
||||||
*/
|
*/
|
||||||
// boolean isClosed();
|
boolean isClosed();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register an observer that is called when changes happen to the content backing this cursor.
|
* Register an observer that is called when changes happen to the content backing this cursor.
|
||||||
@@ -399,7 +396,7 @@ public interface Cursor extends Closeable {
|
|||||||
* @param observer the object that gets notified when the content backing the cursor changes.
|
* @param observer the object that gets notified when the content backing the cursor changes.
|
||||||
* @see #unregisterContentObserver(ContentObserver)
|
* @see #unregisterContentObserver(ContentObserver)
|
||||||
*/
|
*/
|
||||||
// void registerContentObserver(ContentObserver observer);
|
void registerContentObserver(ContentObserver observer);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unregister an observer that has previously been registered with this
|
* Unregister an observer that has previously been registered with this
|
||||||
@@ -408,7 +405,7 @@ public interface Cursor extends Closeable {
|
|||||||
* @param observer the object to unregister.
|
* @param observer the object to unregister.
|
||||||
* @see #registerContentObserver(ContentObserver)
|
* @see #registerContentObserver(ContentObserver)
|
||||||
*/
|
*/
|
||||||
// void unregisterContentObserver(ContentObserver observer);
|
void unregisterContentObserver(ContentObserver observer);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register an observer that is called when changes happen to the contents
|
* Register an observer that is called when changes happen to the contents
|
||||||
@@ -418,7 +415,7 @@ public interface Cursor extends Closeable {
|
|||||||
* @param observer the object that gets notified when the cursors data set changes.
|
* @param observer the object that gets notified when the cursors data set changes.
|
||||||
* @see #unregisterDataSetObserver(DataSetObserver)
|
* @see #unregisterDataSetObserver(DataSetObserver)
|
||||||
*/
|
*/
|
||||||
// void registerDataSetObserver(DataSetObserver observer);
|
void registerDataSetObserver(DataSetObserver observer);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unregister an observer that has previously been registered with this
|
* Unregister an observer that has previously been registered with this
|
||||||
@@ -427,7 +424,7 @@ public interface Cursor extends Closeable {
|
|||||||
* @param observer the object to unregister.
|
* @param observer the object to unregister.
|
||||||
* @see #registerDataSetObserver(DataSetObserver)
|
* @see #registerDataSetObserver(DataSetObserver)
|
||||||
*/
|
*/
|
||||||
// void unregisterDataSetObserver(DataSetObserver observer);
|
void unregisterDataSetObserver(DataSetObserver observer);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register to watch a content URI for changes. This can be the URI of a specific data row (for
|
* Register to watch a content URI for changes. This can be the URI of a specific data row (for
|
||||||
@@ -437,7 +434,7 @@ public interface Cursor extends Closeable {
|
|||||||
* this resolver will be notified.
|
* this resolver will be notified.
|
||||||
* @param uri The content URI to watch.
|
* @param uri The content URI to watch.
|
||||||
*/
|
*/
|
||||||
// void setNotificationUri(ContentResolver cr, Uri uri);
|
void setNotificationUri(ContentResolver cr, Uri uri);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the URI at which notifications of changes in this Cursor's data
|
* Return the URI at which notifications of changes in this Cursor's data
|
||||||
@@ -447,13 +444,13 @@ public interface Cursor extends Closeable {
|
|||||||
* ContentResolver.registerContentObserver} to find out about changes to this Cursor's
|
* ContentResolver.registerContentObserver} to find out about changes to this Cursor's
|
||||||
* data. May be null if no notification URI has been set.
|
* data. May be null if no notification URI has been set.
|
||||||
*/
|
*/
|
||||||
// Uri getNotificationUri();
|
Uri getNotificationUri();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* onMove() will only be called across processes if this method returns true.
|
* onMove() will only be called across processes if this method returns true.
|
||||||
* @return whether all cursor movement should result in a call to onMove().
|
* @return whether all cursor movement should result in a call to onMove().
|
||||||
*/
|
*/
|
||||||
// boolean getWantsAllOnMoveCalls();
|
boolean getWantsAllOnMoveCalls();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a bundle of extra values. This is an optional way for cursors to provide out-of-band
|
* Returns a bundle of extra values. This is an optional way for cursors to provide out-of-band
|
||||||
@@ -464,7 +461,7 @@ public interface Cursor extends Closeable {
|
|||||||
* @return cursor-defined values, or {@link android.os.Bundle#EMPTY Bundle.EMPTY} if there
|
* @return cursor-defined values, or {@link android.os.Bundle#EMPTY Bundle.EMPTY} if there
|
||||||
* are no values. Never <code>null</code>.
|
* are no values. Never <code>null</code>.
|
||||||
*/
|
*/
|
||||||
// Bundle getExtras();
|
Bundle getExtras();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is an out-of-band way for the the user of a cursor to communicate with the cursor. The
|
* This is an out-of-band way for the the user of a cursor to communicate with the cursor. The
|
||||||
@@ -477,5 +474,5 @@ public interface Cursor extends Closeable {
|
|||||||
* @return extra values, or {@link android.os.Bundle#EMPTY Bundle.EMPTY}.
|
* @return extra values, or {@link android.os.Bundle#EMPTY Bundle.EMPTY}.
|
||||||
* Never <code>null</code>.
|
* Never <code>null</code>.
|
||||||
*/
|
*/
|
||||||
// Bundle respond(Bundle extras);
|
Bundle respond(Bundle extras);
|
||||||
}
|
}
|
||||||
|
|||||||
671
src/api-impl/android/database/CursorWindow.java
Normal file
671
src/api-impl/android/database/CursorWindow.java
Normal file
File diff suppressed because it is too large
Load Diff
1313
src/api-impl/android/database/DatabaseUtils.java
Normal file
1313
src/api-impl/android/database/DatabaseUtils.java
Normal file
File diff suppressed because it is too large
Load Diff
117
src/api-impl/android/database/DefaultDatabaseErrorHandler.java
Normal file
117
src/api-impl/android/database/DefaultDatabaseErrorHandler.java
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010 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 android.database;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
import android.database.sqlite.SQLiteException;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default class used to define the action to take when database corruption is reported
|
||||||
|
* by sqlite.
|
||||||
|
* <p>
|
||||||
|
* An application can specify an implementation of {@link DatabaseErrorHandler} on the
|
||||||
|
* following:
|
||||||
|
* <ul>
|
||||||
|
* <li>{@link SQLiteDatabase#openOrCreateDatabase(String,
|
||||||
|
* android.database.sqlite.SQLiteDatabase.CursorFactory, DatabaseErrorHandler)}</li>
|
||||||
|
* <li>{@link SQLiteDatabase#openDatabase(String,
|
||||||
|
* android.database.sqlite.SQLiteDatabase.CursorFactory, int, DatabaseErrorHandler)}</li>
|
||||||
|
* </ul>
|
||||||
|
* The specified {@link DatabaseErrorHandler} is used to handle database corruption errors, if they
|
||||||
|
* occur.
|
||||||
|
* <p>
|
||||||
|
* If null is specified for the DatabaseErrorHandler param in the above calls, this class is used
|
||||||
|
* as the default {@link DatabaseErrorHandler}.
|
||||||
|
*/
|
||||||
|
public final class DefaultDatabaseErrorHandler implements DatabaseErrorHandler {
|
||||||
|
|
||||||
|
private static final String TAG = "DefaultDatabaseErrorHandler";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* defines the default method to be invoked when database corruption is detected.
|
||||||
|
* @param dbObj the {@link SQLiteDatabase} object representing the database on which corruption
|
||||||
|
* is detected.
|
||||||
|
*/
|
||||||
|
public void onCorruption(SQLiteDatabase dbObj) {
|
||||||
|
Log.e(TAG, "Corruption reported by sqlite on database: " + dbObj.getPath());
|
||||||
|
|
||||||
|
// If this is a SEE build, do not delete any database files.
|
||||||
|
// It may be that the user has specified an incorrect password.
|
||||||
|
if( SQLiteDatabase.hasCodec() ) return;
|
||||||
|
|
||||||
|
// is the corruption detected even before database could be 'opened'?
|
||||||
|
if (!dbObj.isOpen()) {
|
||||||
|
// database files are not even openable. delete this database file.
|
||||||
|
// NOTE if the database has attached databases, then any of them could be corrupt.
|
||||||
|
// and not deleting all of them could cause corrupted database file to remain and
|
||||||
|
// make the application crash on database open operation. To avoid this problem,
|
||||||
|
// the application should provide its own {@link DatabaseErrorHandler} impl class
|
||||||
|
// to delete ALL files of the database (including the attached databases).
|
||||||
|
deleteDatabaseFile(dbObj.getPath());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Pair<String, String>> attachedDbs = null;
|
||||||
|
try {
|
||||||
|
// Close the database, which will cause subsequent operations to fail.
|
||||||
|
// before that, get the attached database list first.
|
||||||
|
try {
|
||||||
|
attachedDbs = dbObj.getAttachedDbs();
|
||||||
|
} catch (SQLiteException e) {
|
||||||
|
/* ignore */
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
dbObj.close();
|
||||||
|
} catch (SQLiteException e) {
|
||||||
|
/* ignore */
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
// Delete all files of this corrupt database and/or attached databases
|
||||||
|
if (attachedDbs != null) {
|
||||||
|
for (Pair<String, String> p : attachedDbs) {
|
||||||
|
deleteDatabaseFile(p.second);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// attachedDbs = null is possible when the database is so corrupt that even
|
||||||
|
// "PRAGMA database_list;" also fails. delete the main database file
|
||||||
|
deleteDatabaseFile(dbObj.getPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void deleteDatabaseFile(String fileName) {
|
||||||
|
if (fileName.equalsIgnoreCase(":memory:") || fileName.trim().length() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Log.e(TAG, "deleting the database file: " + fileName);
|
||||||
|
try {
|
||||||
|
SQLiteDatabase.deleteDatabase(new File(fileName));
|
||||||
|
} catch (Exception e) {
|
||||||
|
/* print warning and ignore exception */
|
||||||
|
Log.w(TAG, "delete failed: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
37
src/api-impl/android/database/SQLException.java
Normal file
37
src/api-impl/android/database/SQLException.java
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.database;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An exception that indicates there was an error with SQL parsing or execution.
|
||||||
|
*/
|
||||||
|
public class SQLException extends RuntimeException {
|
||||||
|
public SQLException() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public SQLException(String error) {
|
||||||
|
super(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SQLException(String error, Throwable cause) {
|
||||||
|
super(error, cause);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.database.sqlite;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An exception that indicates that garbage-collector is finalizing a database object
|
||||||
|
* that is not explicitly closed
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public class DatabaseObjectNotClosedException extends RuntimeException {
|
||||||
|
private static final String s = "Application did not close the cursor or database object " +
|
||||||
|
"that was opened here";
|
||||||
|
|
||||||
|
public DatabaseObjectNotClosedException() {
|
||||||
|
super(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2008 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 android.database.sqlite;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An exception that indicates that the SQLite program was aborted.
|
||||||
|
* This can happen either through a call to ABORT in a trigger,
|
||||||
|
* or as the result of using the ABORT conflict clause.
|
||||||
|
*/
|
||||||
|
public class SQLiteAbortException extends SQLiteException {
|
||||||
|
public SQLiteAbortException() {}
|
||||||
|
|
||||||
|
public SQLiteAbortException(String error) {
|
||||||
|
super(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010 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 android.database.sqlite;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This exception class is used when sqlite can't access the database file
|
||||||
|
* due to lack of permissions on the file.
|
||||||
|
*/
|
||||||
|
public class SQLiteAccessPermException extends SQLiteException {
|
||||||
|
public SQLiteAccessPermException() {}
|
||||||
|
|
||||||
|
public SQLiteAccessPermException(String error) {
|
||||||
|
super(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user