LCL-Android-Example: Starts implementing the linked list creation in the sqlite dataset

git-svn-id: trunk@39432 -
This commit is contained in:
sekelsenmat 2012-12-02 14:19:50 +00:00
parent 8713e20438
commit 7c245e0995

View File

@ -53,8 +53,12 @@ type
FSqliteClosable_releaseReference: JMethodID; FSqliteClosable_releaseReference: JMethodID;
FSqliteDatabase_ExecSQLMethod, FSqliteDatabase_openOrCreateDatabase, FSqliteDatabase_ExecSQLMethod, FSqliteDatabase_openOrCreateDatabase,
FSqliteDatabase_getVersion, FSqliteDatabase_query, FSqliteDatabase_getVersion, FSqliteDatabase_query,
FSqliteDatabase_execSQL: JMethodID; FSqliteDatabase_execSQL, FSqliteDatabase_rawQuery: JMethodID;
FDBCursor_getColumnCount, FDBCursor_getColumnName, FDBCursor_getType: JMethodID; FDBCursor_getColumnCount, FDBCursor_getColumnName, FDBCursor_getType,
FDBCursor_close, FDBCursor_getCount, FDBCursor_getDouble,
FDBCursor_getLong, FDBCursor_getPosition, FDBCursor_getString,
FDBCursor_moveToFirst, FDBCursor_moveToNext, FDBCursor_moveToPosition,
FDBCursor_moveToPrevious: JMethodID;
// Java Objects // Java Objects
AndroidDB: jobject; // SQLiteDatabase AndroidDB: jobject; // SQLiteDatabase
procedure FindJavaClassesAndMethods; procedure FindJavaClassesAndMethods;
@ -214,11 +218,11 @@ var
vm: Pointer; vm: Pointer;
ColumnName: string; ColumnName: string;
i, ColumnCount, DataSize: Integer; i, ColumnCount, DataSize: Integer;
AType: TFieldType;
//
lColumnType: JInt; lColumnType: JInt;
lJavaString: JString; lJavaString: JString;
AType: TFieldType;
lNativeString: PChar; lNativeString: PChar;
//
dbCursor: JObject; dbCursor: JObject;
lParams: array[0..7] of JValue; lParams: array[0..7] of JValue;
begin begin
@ -334,6 +338,7 @@ begin
{$endif} {$endif}
end; end;
//sqlite3_finalize(vm); //sqlite3_finalize(vm);
javaEnvRef^^.CallVoidMethod(javaEnvRef, dbCursor, FDBCursor_close);
end; end;
function TSqliteJNIDataset.GetRowsAffected: Integer; function TSqliteJNIDataset.GetRowsAffected: Integer;
@ -390,6 +395,9 @@ begin
// void execSQL(String sql) // void execSQL(String sql)
FSqliteDatabase_execSQL := javaEnvRef^^.GetMethodID(javaEnvRef, FSQLiteDatabaseClass, 'execSQL', FSqliteDatabase_execSQL := javaEnvRef^^.GetMethodID(javaEnvRef, FSQLiteDatabaseClass, 'execSQL',
'(Ljava/lang/String;)V'); '(Ljava/lang/String;)V');
// public Cursor rawQuery (String sql, String[] selectionArgs)
FSqliteDatabase_rawQuery := javaEnvRef^^.GetMethodID(javaEnvRef, FSQLiteDatabaseClass, 'rawQuery',
'(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;');
// //
// Methods from FDBClosable // Methods from FDBClosable
// //
@ -409,50 +417,111 @@ begin
FDBCursor_getType := javaEnvRef^^.GetMethodID(javaEnvRef, FDBCursorClass, 'getType', FDBCursor_getType := javaEnvRef^^.GetMethodID(javaEnvRef, FDBCursorClass, 'getType',
'(I)I'); '(I)I');
end; end;
// abstract void close()
FDBCursor_close := javaEnvRef^^.GetMethodID(javaEnvRef, FDBCursorClass, 'close',
'()V');
// public abstract int getCount ()
FDBCursor_getCount := javaEnvRef^^.GetMethodID(javaEnvRef, FDBCursorClass, 'getCount',
'()I');
// public abstract double getDouble (int columnIndex)
FDBCursor_getDouble := javaEnvRef^^.GetMethodID(javaEnvRef, FDBCursorClass, 'getDouble',
'(I)D');
// public abstract long getLong (int columnIndex)
FDBCursor_getLong := javaEnvRef^^.GetMethodID(javaEnvRef, FDBCursorClass, 'getLong',
'(I)J');
// public abstract int getPosition ()
FDBCursor_getPosition := javaEnvRef^^.GetMethodID(javaEnvRef, FDBCursorClass, 'getPosition',
'()I');
// public abstract String getString (int columnIndex)
FDBCursor_getString := javaEnvRef^^.GetMethodID(javaEnvRef, FDBCursorClass, 'getString',
'(I)Ljava/lang/String;');
// public abstract boolean moveToFirst ()
FDBCursor_moveToFirst := javaEnvRef^^.GetMethodID(javaEnvRef, FDBCursorClass, 'moveToFirst',
'()Z');
// public abstract boolean moveToNext ()
FDBCursor_moveToNext := javaEnvRef^^.GetMethodID(javaEnvRef, FDBCursorClass, 'moveToNext',
'()Z');
// public abstract boolean moveToPosition (int position)
FDBCursor_moveToPosition := javaEnvRef^^.GetMethodID(javaEnvRef, FDBCursorClass, 'moveToPosition',
'(I)Z');
// public abstract boolean moveToPrevious ()
FDBCursor_moveToPrevious := javaEnvRef^^.GetMethodID(javaEnvRef, FDBCursorClass, 'moveToPrevious',
'()Z');
end; end;
procedure TSqliteJNIDataset.BuildLinkedList; procedure TSqliteJNIDataset.BuildLinkedList;
var var
TempItem: PDataRecord; TempItem: PDataRecord;
vm: Pointer; Counter, ColumnCount, TrueRowCount: Integer;
Counter, ColumnCount: Integer; lIsAfterLastRow: Boolean;
//
lJavaString: JString;
lNativeString: PChar;
dbCursor: JObject;
lParams: array[0..7] of JValue;
begin begin
DebugLn('[TSqliteJNIDataset.BuildLinkedList]'); DebugLn('[TSqliteJNIDataset.BuildLinkedList] FEffectiveSQL='+FEffectiveSQL);
{ //Get AutoInc Field initial value { //Get AutoInc Field initial value
if FAutoIncFieldNo <> -1 then if FAutoIncFieldNo <> -1 then
sqlite3_exec(FSqliteHandle, PChar('Select Max(' + FieldDefs[FAutoIncFieldNo].Name + sqlite3_exec(FSqliteHandle, PChar('Select Max(' + FieldDefs[FAutoIncFieldNo].Name +
') from ' + FTableName), @GetAutoIncValue, @FNextAutoInc, nil); ') from ' + FTableName), @GetAutoIncValue, @FNextAutoInc, nil);}
FReturnCode := sqlite3_prepare(FSqliteHandle, PChar(FEffectiveSQL), -1, @vm, nil); //FReturnCode := sqlite3_prepare(FSqliteHandle, PChar(FEffectiveSQL), -1, @vm, nil);
if FReturnCode <> SQLITE_OK then //if FReturnCode <> SQLITE_OK then
DatabaseError(ReturnString, Self); // DatabaseError(ReturnString, Self);
//
// public Cursor rawQuery (String sql, String[] selectionArgs)
lParams[0].l := javaEnvRef^^.NewStringUTF(javaEnvRef, PChar(FEffectiveSQL));
lParams[1].l := nil;
dbCursor := javaEnvRef^^.CallObjectMethodA(javaEnvRef, AndroidDB, FSqliteDatabase_rawQuery, @lParams[0]);
javaEnvRef^^.DeleteLocalRef(javaEnvRef, lParams[0].l);
FDataAllocated := True; FDataAllocated := True;
TempItem := FBeginItem; TempItem := FBeginItem;
FRecordCount := 0; FRecordCount := 0;
ColumnCount := sqlite3_column_count(vm); ColumnCount := javaEnvRef^^.CallIntMethod(javaEnvRef, dbCursor, FDBCursor_getColumnCount);
TrueRowCount := javaEnvRef^^.CallIntMethod(javaEnvRef, dbCursor, FDBCursor_getCount);
FRowCount := ColumnCount; FRowCount := ColumnCount;
//add extra rows for calculated fields //add extra rows for calculated fields
if FCalcFieldList <> nil then if FCalcFieldList <> nil then
Inc(FRowCount, FCalcFieldList.Count); Inc(FRowCount, FCalcFieldList.Count);
FRowBufferSize := (SizeOf(PPChar) * FRowCount); FRowBufferSize := (SizeOf(PPChar) * FRowCount);
FReturnCode := sqlite3_step(vm); //FReturnCode := sqlite3_step(vm);
while FReturnCode = SQLITE_ROW do //while FReturnCode = SQLITE_ROW do
//begin
//
// public abstract boolean moveToNext ()
DebugLn(Format('[TSqliteJNIDataset.BuildLinkedList] ColCount=%d RowCount=%d', [ColumnCount, TrueRowCount]));
if TrueRowCount > 0 then
begin begin
Inc(FRecordCount); lIsAfterLastRow := javaEnvRef^^.CallBooleanMethod(javaEnvRef, dbCursor, FDBCursor_moveToNext) = JNI_TRUE;
New(TempItem^.Next); while not lIsAfterLastRow do
TempItem^.Next^.Previous := TempItem; begin
TempItem := TempItem^.Next; Inc(FRecordCount);
GetMem(TempItem^.Row, FRowBufferSize); New(TempItem^.Next);
for Counter := 0 to ColumnCount - 1 do TempItem^.Next^.Previous := TempItem;
TempItem^.Row[Counter] := StrNew(sqlite3_column_text(vm, Counter)); TempItem := TempItem^.Next;
//initialize calculated fields with nil GetMem(TempItem^.Row, FRowBufferSize);
for Counter := ColumnCount to FRowCount - 1 do for Counter := 0 to ColumnCount - 1 do
TempItem^.Row[Counter] := nil; begin
FReturnCode := sqlite3_step(vm); // TempItem^.Row[Counter] := StrNew(sqlite3_column_text(vm, Counter));
// public abstract String getString (int columnIndex)
lJavaString := javaEnvRef^^.CallObjectMethod(javaEnvRef, dbCursor, FDBCursor_getString);
lNativeString := javaEnvRef^^.GetStringUTFChars(javaEnvRef, lJavaString, nil);
TempItem^.Row[Counter] := StrNew(lNativeString);
javaEnvRef^^.ReleaseStringUTFChars(javaEnvRef, lJavaString, lNativeString);
javaEnvRef^^.DeleteLocalRef(javaEnvRef, lJavaString);
end;
//initialize calculated fields with nil
for Counter := ColumnCount to FRowCount - 1 do
TempItem^.Row[Counter] := nil;
//FReturnCode := sqlite3_step(vm);
lIsAfterLastRow := javaEnvRef^^.CallBooleanMethod(javaEnvRef, dbCursor, FDBCursor_moveToNext) = JNI_TRUE;
end;
end; end;
sqlite3_finalize(vm); //sqlite3_finalize(vm);
javaEnvRef^^.CallVoidMethod(javaEnvRef, dbCursor, FDBCursor_close);
// Attach EndItem // Attach EndItem
TempItem^.Next := FEndItem; TempItem^.Next := FEndItem;
@ -466,7 +535,7 @@ begin
GetMem(FBeginItem^.Row, FRowBufferSize); GetMem(FBeginItem^.Row, FRowBufferSize);
//Todo: see if is better to nullif using FillDWord //Todo: see if is better to nullif using FillDWord
for Counter := 0 to FRowCount - 1 do for Counter := 0 to FRowCount - 1 do
FBeginItem^.Row[Counter] := nil;} FBeginItem^.Row[Counter] := nil;
end; end;
function TSqliteJNIDataset.GetLastInsertRowId: Int64; function TSqliteJNIDataset.GetLastInsertRowId: Int64;