I am trying to fetch one User (row) from users table in SQLite in Flutter. I am using sqflite package for that. But, the fetchedUser Map is empty as a result of query and I am getting errors:
- asynchronous suspension
- Unsupported operation: read-only
I read somewhere that I need to put List of results in another List, because raw data can contain some constraints..but that fails also. Here is the all relevant code:
Future<Database> createDatabaseAndUserTable() async {
Database database;
try {
database = await openDatabase(
join(await getDatabasesPath(), 'sqflite_database_rt.db'),
version: 2,
onCreate: (db, version) async {
return await db.execute(
'CREATE TABLE users(uid Text PRIMARY KEY, email TEXT,'
' '
'enteredRoom TEXT, profileImage TEXT, name TEXT, surname TEXT, username TEXT, isAdmin INTEGER)',
);
},
);
return database;
} catch (e) {
throw Exception(e);
}
}
Future<Map<String, dynamic>> getOneEntitySQLite(
Database database,
String id,
) async {
try {
final List<Map<String, dynamic>> results = await database.query(
'users',
where: 'uid = ?',
whereArgs: [id],
limit: 1,
);
logger.i("User from local fetched!");
//List<Map<String, dynamic>> mutableResults = List.from(results);
Map<String, dynamic> userMap = results.first;
if (results.first['isAdmin'] == 1) {
userMap['isAdmin'] = true;
} else {
userMap['isAdmin'] = false;
}
return userMap;
} catch (e) {
logger.e(e);
return {};
}
}
late Database database;//This is my database reference that I get in ElevatedButton
UserEntity? userFromLocalDatabase;//User that I want to fetch
ElevatedButton(
onPressed: () async {
try {
//await getDatabaseReference();
database = await iProfileRepository.createDatabaseAndUserTable();
Map<String, dynamic> fetchedUser = await iProfileRepository
.getOneEntitySQLite(database, auth.currentUser!.uid);
logger.i("FETCHED USER IS: $fetchedUser");
UserEntity userEntity = UserEntity.fromMap(fetchedUser);
setState(() {
userFromLocalDatabase = userEntity;
});
} catch (e) {
logger.e("Error reading single user $e");
}
},
child: Text("Fetch one user", style: TextStyle(color: Colors.black)),
),
class UserEntity {
String uid;
String email;
String? enteredRoom = "none";
String profileImage;
String name;
String surname;
String? username = "";
bool? isAdmin = false;
UserEntity({
required this.uid,
required this.email,
this.enteredRoom,
required this.profileImage,
required this.name,
required this.surname,
this.username,
this.isAdmin,
});
Map<String, dynamic> toMap() {
return {
'uid': uid,
'email': email,
'enteredRoom': enteredRoom,
'profileImage': profileImage,
'name': name,
'surname': surname,
'username': username,
'isAdmin': isAdmin,
};
}
factory UserEntity.fromMap(Map<String, dynamic> user) {
return UserEntity(
uid: user['uid'].toString(),
email: user['email'].toString(),
enteredRoom: user['enteredRoom'].toString(),
profileImage: user['profileImage'].toString(),
name: user['name'].toString(),
surname: user['surname'].toString(),
isAdmin: user['isAdmin'],
);
}
@override
String toString() {
return 'User{uid: $uid, email: $email, enteredRoom: $enteredRoom,'
' '
'profileImage: $profileImage, name: $name, surname: $surname,'
' '
'username: $username, isAdmin: $isAdmin }';
}
}
Problem is that fetchedUser that I log is empty Map. Can someone explain me why that is happening?