mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-20 14:39:22 +02:00
LCL-Android example: Advances the sqlite code
git-svn-id: trunk@39428 -
This commit is contained in:
parent
d67e97dbd5
commit
37d52863c7
@ -47,11 +47,12 @@ type
|
|||||||
TSqliteJNIDataset = class(TCustomSqliteDataset)
|
TSqliteJNIDataset = class(TCustomSqliteDataset)
|
||||||
private
|
private
|
||||||
// Java Classes
|
// Java Classes
|
||||||
FSqliteClosableClass, FSQLiteDatabaseClass: JClass;
|
FSqliteClosableClass, FSQLiteDatabaseClass, FSQLiteCursor: JClass;
|
||||||
// Java Methods
|
// Java Methods
|
||||||
FSqliteClosable_Close: JMethodID;
|
FSqliteClosable_releaseReference: JMethodID;
|
||||||
FSqliteDatabase_ExecSQLMethod, FSqliteDatabase_openOrCreateDatabase,
|
FSqliteDatabase_ExecSQLMethod, FSqliteDatabase_openOrCreateDatabase,
|
||||||
FSqliteDatabase_getVersion: JMethodID;
|
FSqliteDatabase_getVersion, FSqliteDatabase_query: JMethodID;
|
||||||
|
FSqliteCursor_getColumnCount: JMethodID;
|
||||||
// Java Objects
|
// Java Objects
|
||||||
AndroidDB: jobject; // SQLiteDatabase
|
AndroidDB: jobject; // SQLiteDatabase
|
||||||
procedure FindJavaClassesAndMethods;
|
procedure FindJavaClassesAndMethods;
|
||||||
@ -84,7 +85,7 @@ db.execSQL("CREATE TABLE IF NOT EXISTS data (id INTEGER PRIMARY KEY, value VARCH
|
|||||||
Cursor dbResult = db.rawQuery("SELECT value FROM data", null);
|
Cursor dbResult = db.rawQuery("SELECT value FROM data", null);
|
||||||
// do sometning with cursors
|
// do sometning with cursors
|
||||||
dbResult.close();
|
dbResult.close();
|
||||||
db.close();
|
db.close(); // releaseReference(); is the same
|
||||||
}
|
}
|
||||||
|
|
||||||
function SqliteCode2Str(Code: Integer): String;
|
function SqliteCode2Str(Code: Integer): String;
|
||||||
@ -163,8 +164,8 @@ end;
|
|||||||
procedure TSqliteJNIDataset.InternalCloseHandle;
|
procedure TSqliteJNIDataset.InternalCloseHandle;
|
||||||
begin
|
begin
|
||||||
DebugLn('[TSqliteJNIDataset.InternalCloseHandle]');
|
DebugLn('[TSqliteJNIDataset.InternalCloseHandle]');
|
||||||
// void android.database.sqlite.SQLiteClosable->close()
|
// void android.database.sqlite.SQLiteClosable->releaseReference()
|
||||||
javaEnvRef^^.CallVoidMethod(javaEnvRef, AndroidDB, FSqliteClosable_close);
|
javaEnvRef^^.CallVoidMethod(javaEnvRef, AndroidDB, FSqliteClosable_releaseReference);
|
||||||
//javaEnvRef^^.DeleteLocalRef(javaEnvRef, AndroidDB);
|
//javaEnvRef^^.DeleteLocalRef(javaEnvRef, AndroidDB);
|
||||||
|
|
||||||
//f/sqlite3_close(FSqliteHandle);
|
//f/sqlite3_close(FSqliteHandle);
|
||||||
@ -189,10 +190,8 @@ begin
|
|||||||
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(FFileName));
|
lJavaString :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(FFileName));
|
||||||
lParams[0].l := lJavaString;
|
lParams[0].l := lJavaString;
|
||||||
lParams[1].l := nil;
|
lParams[1].l := nil;
|
||||||
|
|
||||||
// Call the method
|
// Call the method
|
||||||
AndroidDB := javaEnvRef^^.CallStaticObjectMethodA(javaEnvRef, FSqliteDatabaseClass, FSqliteDatabase_openOrCreateDatabase, @lParams[0]);
|
AndroidDB := javaEnvRef^^.CallStaticObjectMethodA(javaEnvRef, FSqliteDatabaseClass, FSqliteDatabase_openOrCreateDatabase, @lParams[0]);
|
||||||
|
|
||||||
// clean up
|
// clean up
|
||||||
javaEnvRef^^.DeleteLocalRef(javaEnvRef, lJavaString);
|
javaEnvRef^^.DeleteLocalRef(javaEnvRef, lJavaString);
|
||||||
end;
|
end;
|
||||||
@ -203,17 +202,46 @@ var
|
|||||||
ColumnStr: String;
|
ColumnStr: String;
|
||||||
i, ColumnCount, DataSize: Integer;
|
i, ColumnCount, DataSize: Integer;
|
||||||
AType: TFieldType;
|
AType: TFieldType;
|
||||||
|
//
|
||||||
|
dbCursor: JObject;
|
||||||
|
lParams: array[0..7] of JValue;
|
||||||
begin
|
begin
|
||||||
DebugLn('[TSqliteJNIDataset.RetrieveFieldDefs]');
|
DebugLn('[TSqliteJNIDataset.RetrieveFieldDefs]');
|
||||||
{ FAutoIncFieldNo := -1;
|
FAutoIncFieldNo := -1;
|
||||||
FieldDefs.Clear;
|
FieldDefs.Clear;
|
||||||
FReturnCode := sqlite3_prepare(FSqliteHandle, PChar(FEffectiveSQL), -1, @vm, nil);
|
|
||||||
if FReturnCode <> SQLITE_OK then
|
// Cursor c = db.query(tableName, null, null, null, null, null, null);
|
||||||
DatabaseError(ReturnString, Self);
|
// public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
|
||||||
sqlite3_step(vm);
|
lParams[0].l :=javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(TableName));
|
||||||
ColumnCount := sqlite3_column_count(vm);
|
lParams[1].l := nil;
|
||||||
|
lParams[2].l := nil;
|
||||||
|
lParams[3].l := nil;
|
||||||
|
lParams[4].l := nil;
|
||||||
|
lParams[5].l := nil;
|
||||||
|
lParams[6].l := nil;
|
||||||
|
lParams[7].l := nil;
|
||||||
|
dbCursor := javaEnvRef^^.CallObjectMethodA(javaEnvRef, AndroidDB, FSqliteDatabase_query, @lParams[0]);
|
||||||
|
|
||||||
|
if dbCursor = nil then
|
||||||
|
begin
|
||||||
|
DebugLn('[TSqliteJNIDataset.RetrieveFieldDefs] dbCursor = nil');
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// int num = c.getColumnCount();
|
||||||
|
// for (int i = 0; i < num; ++i)
|
||||||
|
{
|
||||||
|
String colname = c.getColumnName(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//FReturnCode := sqlite3_prepare(FSqliteHandle, PChar(FEffectiveSQL), -1, @vm, nil);
|
||||||
|
//if FReturnCode <> SQLITE_OK then
|
||||||
|
// DatabaseError(ReturnString, Self);
|
||||||
|
//sqlite3_step(vm);
|
||||||
|
//ColumnCount := sqlite3_column_count(vm);
|
||||||
//Prepare the array of pchar2sql functions
|
//Prepare the array of pchar2sql functions
|
||||||
SetLength(FGetSqlStr, ColumnCount);
|
{ SetLength(FGetSqlStr, ColumnCount);
|
||||||
for i := 0 to ColumnCount - 1 do
|
for i := 0 to ColumnCount - 1 do
|
||||||
begin
|
begin
|
||||||
DataSize := 0;
|
DataSize := 0;
|
||||||
@ -317,17 +345,26 @@ procedure TSqliteJNIDataset.FindJavaClassesAndMethods;
|
|||||||
begin
|
begin
|
||||||
FSQLiteDatabaseClass := javaEnvRef^^.FindClass(javaEnvRef, 'android/database/sqlite/SQLiteDatabase');
|
FSQLiteDatabaseClass := javaEnvRef^^.FindClass(javaEnvRef, 'android/database/sqlite/SQLiteDatabase');
|
||||||
FSQLiteClosableClass := javaEnvRef^^.FindClass(javaEnvRef, 'android/database/sqlite/SQLiteClosable');
|
FSQLiteClosableClass := javaEnvRef^^.FindClass(javaEnvRef, 'android/database/sqlite/SQLiteClosable');
|
||||||
|
FSQLiteCursor := javaEnvRef^^.FindClass(javaEnvRef, 'android/database/Cursor');
|
||||||
|
|
||||||
|
//
|
||||||
// Methods from SqliteDatabase
|
// Methods from SqliteDatabase
|
||||||
|
//
|
||||||
FSqliteDatabase_ExecSQLMethod := javaEnvRef^^.GetMethodID(javaEnvRef, FSQLiteDatabaseClass, 'execSQL',
|
FSqliteDatabase_ExecSQLMethod := javaEnvRef^^.GetMethodID(javaEnvRef, FSQLiteDatabaseClass, 'execSQL',
|
||||||
'(Ljava/lang/String;)V');
|
'(Ljava/lang/String;)V');
|
||||||
FSqliteDatabase_openOrCreateDatabase := javaEnvRef^^.GetStaticMethodID(javaEnvRef, FSQLiteDatabaseClass, 'openOrCreateDatabase',
|
FSqliteDatabase_openOrCreateDatabase := javaEnvRef^^.GetStaticMethodID(javaEnvRef, FSQLiteDatabaseClass, 'openOrCreateDatabase',
|
||||||
'(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase/CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;');
|
'(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;');
|
||||||
|
//DebugLn('[TSqliteJNIDataset.FindJavaClassesAndMethods] FSqliteDatabase_openOrCreateDatabase='+IntToHex(Cardinal(FSqliteDatabase_openOrCreateDatabase), 8));
|
||||||
FSqliteDatabase_getVersion := javaEnvRef^^.GetMethodID(javaEnvRef, FSQLiteDatabaseClass, 'getVersion',
|
FSqliteDatabase_getVersion := javaEnvRef^^.GetMethodID(javaEnvRef, FSQLiteDatabaseClass, 'getVersion',
|
||||||
'()I');
|
'()I');
|
||||||
// Methods from SqliteClosable
|
// public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
|
||||||
FSqliteClosable_Close := javaEnvRef^^.GetMethodID(javaEnvRef, FSQLiteClosableClass, 'close',
|
FSqliteDatabase_query := javaEnvRef^^.GetMethodID(javaEnvRef, FSQLiteDatabaseClass, 'query',
|
||||||
'()V');
|
'(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;');
|
||||||
|
//
|
||||||
|
// Methods from FSQLiteCursor
|
||||||
|
//
|
||||||
|
FSqliteCursor_getColumnCount := javaEnvRef^^.GetMethodID(javaEnvRef, FSQLiteCursor, 'getColumnCount',
|
||||||
|
'()I');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSqliteJNIDataset.BuildLinkedList;
|
procedure TSqliteJNIDataset.BuildLinkedList;
|
||||||
|
Loading…
Reference in New Issue
Block a user