Using this class a lot and found the table sort (clicking the column header) quite slow, when the number of rows gets more than a few thousand.
Found that code like this makes it a lot faster:
SortCursor is the cursor supplied to LoadSQLDB.
strColumnDataTypes is a string array and comes from LoadSQLDB as well.
Maybe this could be added to the flexible table class.
RBS
Found that code like this makes it a lot faster:
B4X:
Sub ClearStringNull(strNull As String, strReplace As String) As String
If strNull <> Null Then
Return strNull
Else
Return strReplace
End If
End Sub
Public Sub SortTable(col As Int, bAscending As Boolean)
Dim i As Long
Dim lUB As Long
Dim DataSorted As List
lUB = Data.Size - 1
If mbFastSort Then 'this is a lot faster, about 25x
DataSorted.Initialize
For i = 0 To lUB
SortCursor.Position = i
'can get here:
'net.sqlcipher.StaleDataException: Access closed cursor
'to avoid this need to make sure that the cursor is not closed
'-------------------------------------------------------------
DataSorted.add(setSortPairString(i, ClearStringNull(SortCursor.GetString2(col), "")))
Next
DataSorted.SortType("strString", bAscending)
End If
ClearSelection
debug_counter = 0
If mbFastSort Then
For i = 0 To lUB
Dim tDS As SortString = DataSorted.Get(i)
'DataTemp is populated in LoadSQLDB4, so keep using
'the same original Data list with different sorts
'--------------------------------------------------
Data.Set(i, DataTemp.Get(tDS.IDX))
Next
Else
SelectionSort(col, bAscending)
End If
RefreshTable
End Sub
Sub setSortPairString(lIDX As Long, strValue As String) As SortString
Dim tSS As SortString
tSS.initialize
tSS.IDX = lIDX
tSS.strString = strValue
Return tSS
End Sub
Sub setSortPairLong(lIDX As Long, lValue As Long) As SortLong
Dim tL As SortLong
tL.initialize
tL.IDX = lIDX
tL.lLong = lValue
Return tL
End Sub
Sub setSortPairDouble(lIDX As Long, dValue As Double) As SortDouble
Dim tD As SortDouble
tD.initialize
tD.IDX = lIDX
tD.dDouble = dValue
Return tD
End Sub
Public Sub SortTableNum(col As Int, bAscending As Boolean)
Dim i As Long
Dim lUB As Long
Dim DataSorted As List
Dim strColumnDataType As String
'strColumnDataTypes is set in LoadSQLDB4
'---------------------------------------
strColumnDataType = strColumnDataTypes(col)
General.RunLog("SortTableNum, strColumnDataType: " & strColumnDataType)
lUB = Data.Size - 1
If mbFastSort Then 'this is a lot faster, about 25x
DataSorted.Initialize
If strColumnDataType = "I" Then
For i = 0 To lUB
SortCursor.Position = i
DataSorted.add(setSortPairLong(i, SortCursor.GetInt2(col)))
Next
DataSorted.SortType("lLong", bAscending)
Else
For i = 0 To lUB
SortCursor.Position = i
DataSorted.add(setSortPairDouble(i, SortCursor.GetDouble2(col)))
Next
'this will take a bit less than half of the total time of SortTableNum
'---------------------------------------------------------------------
DataSorted.SortType("dDouble", bAscending)
End If
End If
ClearSelection
debug_counter = 0
If mbFastSort Then
If strColumnDataType = "I" Then
For i = 0 To lUB
Dim tL As SortLong = DataSorted.Get(i)
'DataTemp is populated in LoadSQLDB4, so keep using
'the same original Data list with different sorts
'--------------------------------------------------
Data.Set(i, DataTemp.Get(tL.IDX))
Next
Else
'will be column type real - "R"
For i = 0 To lUB
Dim tD As SortDouble = DataSorted.Get(i)
'DataTemp is populated in LoadSQLDB4, so keep using
'the same original Data list with different sorts
'--------------------------------------------------
Data.Set(i, DataTemp.Get(tD.IDX))
Next
End If
Else
SelectionSortNum(col, bAscending)
End If
RefreshTable
End Sub
SortCursor is the cursor supplied to LoadSQLDB.
strColumnDataTypes is a string array and comes from LoadSQLDB as well.
Maybe this could be added to the flexible table class.
RBS