mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-16 13:08:15 +02:00
LCL-Android-Example: Starts implementing exception handling in the sqlite code
git-svn-id: trunk@39433 -
This commit is contained in:
parent
7c245e0995
commit
8100d1d064
@ -47,6 +47,7 @@ type
|
|||||||
TSqliteJNIDataset = class(TCustomSqliteDataset)
|
TSqliteJNIDataset = class(TCustomSqliteDataset)
|
||||||
private
|
private
|
||||||
FLastInsertRowId: Int64;
|
FLastInsertRowId: Int64;
|
||||||
|
FReturnString: string;
|
||||||
// Java Classes
|
// Java Classes
|
||||||
FSqliteClosableClass, FSQLiteDatabaseClass, FDBCursorClass: JClass;
|
FSqliteClosableClass, FSQLiteDatabaseClass, FDBCursorClass: JClass;
|
||||||
// Java Methods
|
// Java Methods
|
||||||
@ -70,6 +71,7 @@ type
|
|||||||
function InternalGetHandle: Pointer; override;
|
function InternalGetHandle: Pointer; override;
|
||||||
procedure RetrieveFieldDefs; override;
|
procedure RetrieveFieldDefs; override;
|
||||||
function SqliteExec(ASQL: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer; override;
|
function SqliteExec(ASQL: PChar; ACallback: TSqliteCdeclCallback; Data: Pointer): Integer; override;
|
||||||
|
procedure PrepareReturnString;
|
||||||
public
|
public
|
||||||
procedure ExecuteDirect(const ASQL: String); override;
|
procedure ExecuteDirect(const ASQL: String); override;
|
||||||
function QuickQuery(const ASQL: String; const AStrList: TStrings; FillObjects: Boolean): String; override;
|
function QuickQuery(const ASQL: String; const AStrList: TStrings; FillObjects: Boolean): String; override;
|
||||||
@ -178,6 +180,42 @@ begin
|
|||||||
javaEnvRef^^.DeleteLocalRef(javaEnvRef, lJavaString);
|
javaEnvRef^^.DeleteLocalRef(javaEnvRef, lJavaString);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TSqliteJNIDataset.PrepareReturnString;
|
||||||
|
var
|
||||||
|
exceptionObj: jthrowable;
|
||||||
|
javaLangClass: jclass;
|
||||||
|
javaLangClass_getName: JMethodID;
|
||||||
|
lJavaString: JString;
|
||||||
|
lNativeString: PChar;
|
||||||
|
begin
|
||||||
|
FReturnString := '';
|
||||||
|
// There seams to be no way to get any information about the exception in JNI =(
|
||||||
|
//DebugLn('[TSqliteJNIDataset.PrepareReturnString] START');
|
||||||
|
|
||||||
|
if javaEnvRef^^.ExceptionCheck(javaEnvRef) = JNI_FALSE then
|
||||||
|
begin
|
||||||
|
DebugLn('[TSqliteJNIDataset.PrepareReturnString] No exception found');
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
exceptionObj := javaEnvRef^^.ExceptionOccurred(javaEnvRef);
|
||||||
|
javaEnvRef^^.ExceptionDescribe(javaEnvRef);
|
||||||
|
javaEnvRef^^.ExceptionClear(javaEnvRef);
|
||||||
|
{DebugLn('[TSqliteJNIDataset.PrepareReturnString] A exceptionObj='+IntToHex(Cardinal(exceptionObj), 8));
|
||||||
|
javaLangClass := javaEnvRef^^.FindClass(javaEnvRef, 'java/lang/Class');
|
||||||
|
javaLangClass_getName := javaEnvRef^^.GetMethodID(javaEnvRef, javaLangClass, 'getName', '()Ljava/lang/String;');
|
||||||
|
DebugLn('[TSqliteJNIDataset.PrepareReturnString] B');
|
||||||
|
lJavaString := javaEnvRef^^.CallObjectMethod(javaEnvRef, exceptionObj, javaLangClass_getName); // <--- crashes here
|
||||||
|
DebugLn('[TSqliteJNIDataset.PrepareReturnString] C lJavaString='+IntToHex(Cardinal(lJavaString), 8));
|
||||||
|
lNativeString := javaEnvRef^^.GetStringUTFChars(javaEnvRef, lJavaString, nil);
|
||||||
|
DebugLn('[TSqliteJNIDataset.PrepareReturnString] D');
|
||||||
|
FReturnString := StrPas(lNativeString);
|
||||||
|
javaEnvRef^^.ReleaseStringUTFChars(javaEnvRef, lJavaString, lNativeString);
|
||||||
|
javaEnvRef^^.DeleteLocalRef(javaEnvRef, lJavaString);
|
||||||
|
javaEnvRef^^.DeleteLocalRef(javaEnvRef, exceptionObj);
|
||||||
|
DebugLn('[TSqliteJNIDataset.PrepareReturnString] FReturnString=' + FReturnString);}
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TSqliteJNIDataset.InternalCloseHandle;
|
procedure TSqliteJNIDataset.InternalCloseHandle;
|
||||||
begin
|
begin
|
||||||
DebugLn('[TSqliteJNIDataset.InternalCloseHandle]');
|
DebugLn('[TSqliteJNIDataset.InternalCloseHandle]');
|
||||||
@ -230,6 +268,10 @@ begin
|
|||||||
FAutoIncFieldNo := -1;
|
FAutoIncFieldNo := -1;
|
||||||
FieldDefs.Clear;
|
FieldDefs.Clear;
|
||||||
|
|
||||||
|
//FReturnCode := sqlite3_prepare(FSqliteHandle, PChar(FEffectiveSQL), -1, @vm, nil);
|
||||||
|
//if FReturnCode <> SQLITE_OK then
|
||||||
|
// DatabaseError(ReturnString, Self);
|
||||||
|
//
|
||||||
// Cursor c = db.query(tableName, null, null, null, null, null, null);
|
// Cursor c = db.query(tableName, null, null, null, null, null, null);
|
||||||
// public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
|
// public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
|
||||||
lParams[0].l :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(TableName));
|
lParams[0].l :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(TableName));
|
||||||
@ -247,10 +289,14 @@ begin
|
|||||||
DebugLn('[TSqliteJNIDataset.RetrieveFieldDefs] dbCursor = nil');
|
DebugLn('[TSqliteJNIDataset.RetrieveFieldDefs] dbCursor = nil');
|
||||||
Exit;
|
Exit;
|
||||||
end;
|
end;
|
||||||
|
if javaEnvRef^^.ExceptionCheck(javaEnvRef) = JNI_TRUE then
|
||||||
|
begin
|
||||||
|
PrepareReturnString();
|
||||||
|
DebugLn('[TSqliteJNIDataset.RetrieveFieldDefs] Java Exceptiong calling AndroidDB.query ' + ReturnString);
|
||||||
|
DatabaseError(ReturnString, Self);
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
//FReturnCode := sqlite3_prepare(FSqliteHandle, PChar(FEffectiveSQL), -1, @vm, nil);
|
|
||||||
//if FReturnCode <> SQLITE_OK then
|
|
||||||
// DatabaseError(ReturnString, Self);
|
|
||||||
//sqlite3_step(vm);
|
//sqlite3_step(vm);
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -547,8 +593,7 @@ end;
|
|||||||
|
|
||||||
function TSqliteJNIDataset.ReturnString: String;
|
function TSqliteJNIDataset.ReturnString: String;
|
||||||
begin
|
begin
|
||||||
DebugLn('[TSqliteJNIDataset.ReturnString]');
|
Result := FReturnString;
|
||||||
//f/Result := SqliteCode2Str(FReturnCode) + ' - ' + sqlite3_errmsg(FSqliteHandle);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class function TSqliteJNIDataset.SqliteVersion: String;
|
class function TSqliteJNIDataset.SqliteVersion: String;
|
||||||
|
Loading…
Reference in New Issue
Block a user