测试 Flutter 本地 sqflite 数据库 onUpgrade,应用更新后无数据显示
Testing Flutter local sqflite database onUpgrade and no data shown after app update
我想更新一个已经在 Google Play 上发布的应用程序,但之前我想测试并查看本地 sqlite 数据库是否会在更新后保留所有数据,因为它存储了用户添加的数据内容。
首先,我在旧版本的数据库中添加了一些内容,然后更新了 it.When 我通过内部测试更新了应用程序,它没有显示任何数据,就好像它会创建一个空的新数据库一样。
- 有没有可能数据库路径变了?如何查看?
- 会不会是老数据库被覆盖了?
还有什么我应该注意的吗?因为我只向数据库添加了几个列,并且没有更改任何有关数据库初始化和数据库路径的代码。
使用的软件包:sqflite: 2.0.0+3
和 path: 1.8.0
来自数据库的 dart 文件的代码片段:
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:sqflite/sqlite_api.dart';
class DatabaseHelper{
/// ------- name variables ----------------
static final _dbName = 'userTasks.db';
static final _dbVersion = 2;
static final _tableName = 'myTasks';
/// ------- table column Names -------------
static final columnID = 'id';
static final columnName = 'name';
static final columnContent = 'content';
static final columnType = 'type';
static final columnDescription = 'description';
static final columnFavorite = 'favorite';
/// -------- DataBase initialization ---------
DatabaseHelper._privateConstructor();
static final DatabaseHelper instance = DatabaseHelper._privateConstructor();
static Database _database;
Future<Database> get database async{
if(_database !=null) return _database;
_database = await _initiateDatabase();
return _database;
}
_initiateDatabase () async{
Directory directory = await getApplicationDocumentsDirectory();
String path = join(directory.path,_dbName);
return await openDatabase(path, version: _dbVersion, onCreate: _onCreate, onUpgrade: _onUpgrade);
}
/// --------------- _onCreate() getting called on fresh install(no previous DB) -----------------
Future _onCreate(Database db, int version){
db.execute(
'''
CREATE TABLE $_tableName(
$columnID INTEGER PRIMARY KEY,
$columnName TEXT,
$columnContent TEXT NOT NULL,
$columnType TEXT NOT NULL,
$columnDescription TEXT NOT NULL,
$columnFavorite INTEGER)
'''
);
}
/// --------------- _onUpgrade() getting called on _dbVersion versionChange -----------------
Future _onUpgrade(Database db, int oldVersion, int newVersion) {
db.execute(''' ALTER TABLE $_tableName ADD COLUMN $columnDescription TEXT''');
db.execute(''' ALTER TABLE $_tableName ADD COLUMN $columnFavorite INTEGER DEFAULT 0 ''');
}
提前致谢!
我不确定 getApplicationDocumentsDirectory
,但如果您使用 getDatabasesPath
或只是一个没有路径的名称,并且如果您在 (https://developer.android.com/guide/topics/data/autobackup) 上有自动备份,它应该可以工作。
第一个测试可以在没有 google 播放的情况下完成,只需保留您发布的每个 apk(即使您使用 bundle,也构建并保留一个 apk 总是好的)以便您可以测试2 个版本之间的正确迁移。
您可以更改数据库版本并刷新应用程序
看看 android:allowBackup="false" android:fullBackupOnly="false"
https://developer.android.com/guide/topics/manifest/application-element
并查看这个
Flutter how to backup and restore sqflite database?
我想更新一个已经在 Google Play 上发布的应用程序,但之前我想测试并查看本地 sqlite 数据库是否会在更新后保留所有数据,因为它存储了用户添加的数据内容。
首先,我在旧版本的数据库中添加了一些内容,然后更新了 it.When 我通过内部测试更新了应用程序,它没有显示任何数据,就好像它会创建一个空的新数据库一样。
- 有没有可能数据库路径变了?如何查看?
- 会不会是老数据库被覆盖了?
还有什么我应该注意的吗?因为我只向数据库添加了几个列,并且没有更改任何有关数据库初始化和数据库路径的代码。
使用的软件包:sqflite: 2.0.0+3
和 path: 1.8.0
来自数据库的 dart 文件的代码片段:
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'package:sqflite/sqlite_api.dart';
class DatabaseHelper{
/// ------- name variables ----------------
static final _dbName = 'userTasks.db';
static final _dbVersion = 2;
static final _tableName = 'myTasks';
/// ------- table column Names -------------
static final columnID = 'id';
static final columnName = 'name';
static final columnContent = 'content';
static final columnType = 'type';
static final columnDescription = 'description';
static final columnFavorite = 'favorite';
/// -------- DataBase initialization ---------
DatabaseHelper._privateConstructor();
static final DatabaseHelper instance = DatabaseHelper._privateConstructor();
static Database _database;
Future<Database> get database async{
if(_database !=null) return _database;
_database = await _initiateDatabase();
return _database;
}
_initiateDatabase () async{
Directory directory = await getApplicationDocumentsDirectory();
String path = join(directory.path,_dbName);
return await openDatabase(path, version: _dbVersion, onCreate: _onCreate, onUpgrade: _onUpgrade);
}
/// --------------- _onCreate() getting called on fresh install(no previous DB) -----------------
Future _onCreate(Database db, int version){
db.execute(
'''
CREATE TABLE $_tableName(
$columnID INTEGER PRIMARY KEY,
$columnName TEXT,
$columnContent TEXT NOT NULL,
$columnType TEXT NOT NULL,
$columnDescription TEXT NOT NULL,
$columnFavorite INTEGER)
'''
);
}
/// --------------- _onUpgrade() getting called on _dbVersion versionChange -----------------
Future _onUpgrade(Database db, int oldVersion, int newVersion) {
db.execute(''' ALTER TABLE $_tableName ADD COLUMN $columnDescription TEXT''');
db.execute(''' ALTER TABLE $_tableName ADD COLUMN $columnFavorite INTEGER DEFAULT 0 ''');
}
提前致谢!
我不确定 getApplicationDocumentsDirectory
,但如果您使用 getDatabasesPath
或只是一个没有路径的名称,并且如果您在 (https://developer.android.com/guide/topics/data/autobackup) 上有自动备份,它应该可以工作。
第一个测试可以在没有 google 播放的情况下完成,只需保留您发布的每个 apk(即使您使用 bundle,也构建并保留一个 apk 总是好的)以便您可以测试2 个版本之间的正确迁移。
您可以更改数据库版本并刷新应用程序
看看 android:allowBackup="false" android:fullBackupOnly="false" https://developer.android.com/guide/topics/manifest/application-element
并查看这个
Flutter how to backup and restore sqflite database?