📅  最后修改于: 2023-12-03 15:00:47.993000             🧑  作者: Mango
在许多应用程序中,我们需要向SQLite数据库中插入记录,并且需要为每个记录指定一个自动递增的唯一ID。这可以通过SQLite的自动递增ID主键来实现,这在Flutter中也是完全可能的。
我们可以通过以下步骤在Flutter中创建具有自动递增ID主键的SQLite表:
首先,我们需要为我们的Flutter应用程序添加sqlite依赖项。我们可以在我们的应用程序的pubspec.yaml
文件中添加以下行:
dependencies:
sqflite: any
我们需要运行flutter packages get
来获取sqflite依赖项。
接下来,我们需要打开数据库连接并创建表。我们可以使用以下代码:
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
final String tableName = 'person';
final String columnId = 'id';
final String columnName = "name";
final String columnAge = "age";
class Person {
int id;
String name;
int age;
Map<String, dynamic> toMap() {
var map = <String, dynamic>{
columnName: name,
columnAge: age
};
if (id != null) {
map[columnId] = id;
}
return map;
}
Person({this.id, this.name, this.age});
Person.fromMap(Map<String, dynamic> map) {
id = map[columnId];
name = map[columnName];
age = map[columnAge];
}
}
class DatabaseHelper {
static final _databaseName = "MyDatabase.db";
static final _databaseVersion = 1;
static final table = 'person';
static final columnId = '_id';
static final columnName = 'name';
static final columnAge = 'age';
DatabaseHelper._privateConstructor();
static final DatabaseHelper instance = DatabaseHelper._privateConstructor();
static Database _database;
Future<Database> get database async {
if (_database != null) return _database;
_database = await _initDatabase();
return _database;
}
_initDatabase() async {
String path = join(await getDatabasesPath(), _databaseName);
return await openDatabase(path,
version: _databaseVersion, onCreate: _onCreate);
}
Future _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE $table (
$columnId INTEGER PRIMARY KEY,
$columnName TEXT NOT NULL,
$columnAge INTEGER NOT NULL
)
''');
}
Future<int> insert(Person person) async {
Database db = await instance.database;
return await db.insert(table, person.toMap());
}
Future<List<Person>> queryAllItems() async {
Database db = await instance.database;
var res = await db.query('person');
List<Person> list =
res.isNotEmpty ? res.map((c) => Person.fromMap(c)).toList() : [];
return list;
}
Future<int> updateItem(Person person) async {
Database db = await instance.database;
return await db.update(table, person.toMap(),
where: '$columnId = ?', whereArgs: [person.id]);
}
Future<int> deleteItem(int id) async {
Database db = await instance.database;
return await db.delete(table, where: '$columnId = ?', whereArgs: [id]);
}
}
这将创建一个名为“person”的表,我们可以在其中包含以下列:
id
- 主键,一个自动递增的整数。name
- TEXT列来存储人名。age
- INTEGER列来存储年龄。我们可以使用以下代码插入数据:
_personInsert() async {
Person person = new Person(
name: 'Wally',
age: 25,
);
int res = await DatabaseHelper.instance.insert(person);
print('inserted row: $res');
}
我们可以使用以下代码来查询所有记录:
_personQueryAllItems() async {
List<Person> persons = await DatabaseHelper.instance.queryAllItems();
for (var p in persons) {
print(p.toMap());
}
}
这将返回以下类型的List<Person>
。
我们也可以使用以下代码来更新记录:
_personUpdate() async {
Person person = Person(
id: 1,
name: 'Lara',
age: 25,
);
int res = await DatabaseHelper.instance.updateItem(person);
print('updated row: $res');
}
注:这里person对象必须具有一个有效的ID,以便SQLite知道它需要更新哪个记录。
最后,我们可以使用以下代码删除记录:
_personDelete() async {
int res = await DatabaseHelper.instance.deleteItem(1);
print('deleted row: $res');
}
这将删除具有ID为1的记录。
在以上步骤中,我们看到如何在Flutter中创建具有自动递增ID主键的SQLite表,如何插入、查询、更新和删除记录。在实际应用中,我们可以根据实际需要进行更改。