LCL-Android-Sqlite: Fixes GetFieldDefs code for Android 3.0+

git-svn-id: trunk@39440 -
This commit is contained in:
sekelsenmat 2012-12-05 12:58:40 +00:00
parent 7028bcf779
commit cbb7efe4ae
2 changed files with 11 additions and 4 deletions

View File

@ -69,11 +69,11 @@
<CompilerOptions>
<Version Value="11"/>
<Target>
<Filename Value="android/libs/armeabi/liblclapp.so"/>
<Filename Value="android/libs/armeabi/liblclapp"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<Libraries Value="C:/Programas/android-ndk-r7b/platforms/android-8/arch-arm/usr/lib/"/>
<Libraries Value="C:/Programas/android-ndk-r7b/platforms/android-8/arch-arm/usr/lib/;C:/Programas/android-ndk-r8/platforms/android-8/arch-arm/usr/lib/"/>
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>

View File

@ -255,7 +255,7 @@ procedure TSqliteJNIDataset.RetrieveFieldDefs;
var
vm: Pointer;
ColumnName: string;
i, ColumnCount, DataSize: Integer;
i, ColumnCount, RowCount, DataSize: Integer;
AType: TFieldType;
//
lColumnType: JInt;
@ -306,10 +306,13 @@ begin
// abstract String getColumnName(int columnIndex)
// int ColumnCount = c.getColumnCount();
ColumnCount := javaEnvRef^^.CallIntMethod(javaEnvRef, dbCursor, FDBCursor_getColumnCount);
RowCount := javaEnvRef^^.CallIntMethod(javaEnvRef, dbCursor, FDBCursor_getCount);
//DebugLn(Format('[TSqliteJNIDataset.RetrieveFieldDefs] ColumnCount=%d RowCount=%d', [ColumnCount, RowCount]));
//Prepare the array of pchar2sql functions
SetLength(FGetSqlStr, ColumnCount);
for i := 0 to ColumnCount - 1 do
begin
//DebugLn('[TSqliteJNIDataset.RetrieveFieldDefs] for i='+IntToStr(i));
//
// First get the column name
//
@ -320,6 +323,7 @@ begin
ColumnName := lNativeString;
javaEnvRef^^.ReleaseStringUTFChars(javaEnvRef, lJavaString, lNativeString);
javaEnvRef^^.DeleteLocalRef(javaEnvRef, lJavaString);
//DebugLn('[TSqliteJNIDataset.RetrieveFieldDefs] ColumnName='+ColumnName);
//
// Now obtain the data size and type
@ -327,17 +331,20 @@ begin
DataSize := 0;
// Before Android 3.0 there is no way to know the type of the field, so just suppose it is string
if android_os_Build_VERSION_SDK_INT < 11 then
if (android_os_Build_VERSION_SDK_INT < 11) or (RowCount <= 0) then
begin
AType := ftString;
DataSize := DefaultStringSize;
end
else
// In Android 3.0 we can use Cursor.getType
// but it throws a CursorIndexOutOfBoundsException if the cursor is in position -1
// so if the database has no rows, getType doesn't work o.O
begin
// public abstract int getType (int columnIndex) // Added in API level 11
lParams[0].i := i;
lColumnType := javaEnvRef^^.CallIntMethodA(javaEnvRef, dbCursor, FDBCursor_getType, @lParams[0]);
//DebugLn('[TSqliteJNIDataset.RetrieveFieldDefs] dbCursor.getType()='+IntToStr(lColumnType));
case lColumnType of
FIELD_TYPE_BLOB: