Словари в python предоставляют произвольный доступ к своим элементам.
Поэтому любой словарь с «именами», хотя он может быть информативным с одной стороны (например, имена полей), «отменяет порядок» полей, что может быть нежелательным.
Лучший подход - собрать имена в отдельный список, а затем объединить их с результатами самостоятельно, если это необходимо.
try:
mycursor = self.memconn.cursor()
mycursor.execute('''SELECT * FROM maintbl;''')
#first get the names, because they will be lost after retrieval of rows
names = list(map(lambda x: x[0], mycursor.description))
manyrows = mycursor.fetchall()
return manyrows, names
Также помните, что имена во всех подходах - это имена, которые вы указали в запросе, а не имена в базе данных. Исключение составляет SELECT * FROM
Если ваша единственная задача - получить результаты с помощью словаря, то обязательно используйте conn.row_factory = sqlite3.Row
(уже указано в другом ответе).