当前位置: 首页 > 知识库问答 >
问题:

Flutter iOS应用sqflite数据库数据在应用升级后丢失

沈俊晤
2023-03-14

我们有一个完全由Flutter构建的应用程序。当我们将应用程序升级发送到谷歌商店时,在Android设备中更新apk时sqflite数据库数据不会丢失。但在iOS设备中,用户将应用程序更新到新版本后,所有数据库数据都丢失了。

  class DatabaseHelper {
  static DatabaseHelper _databaseHelper; // Singletone DatabaseHelper
  static Database _database; // Singletone Database

  String wifiSystemTable = 'wifi_system_table';
  String colId = 'id';
  String colDataType = 'data_type';
  String colLocationName = 'location_name';
  String colBackground = 'background';
  String colLocationId = 'location_id';
  String colDeviceType = 'device_type';
  String colIp = 'ip';
  String colName1 = 'name1';
  String colName2 = 'name2';
  String colName3 = 'name3';
  String colRemotePort = 'remote_port';

  DatabaseHelper._createInstance(); // Named constractor to create instance of Database Helper

  factory DatabaseHelper() {
    if (_databaseHelper == null) {
      _databaseHelper = DatabaseHelper
          ._createInstance(); //This is execute only once, singletone object
    }
    return _databaseHelper;
  }

  Future<Database> get database async {
    if (_database == null) {
      _database = await initializeDatabase();
    }
    return _database;
  }

  Future<Database> initializeDatabase() async {
    //Get the directory path for both Android and IOS to store Database
    Directory directory = await getApplicationDocumentsDirectory();
    String path = p.join(directory.toString(), 'wifi.db');

    //Open/create the database at the given path
    var wifiSystemDatabase =
        await openDatabase(path, version: 1, onCreate: _createDb);
    return wifiSystemDatabase;
  }

  void _createDb(Database db, int newVersion) async {
    await db.execute(
        'CREATE TABLE $wifiSystemTable($colId INTEGER PRIMARY KEY, $colDataType INTEGER, $colLocationName TEXT, $colBackground TEXT, $colLocationId INTEGER, $colDeviceType INTEGER, $colIp TEXT, $colName1 TEXT, $colName2 TEXT, $colName3 TEXT, $colRemotePort TEXT)');
  }

谢谢

共有1个答案

龚宏壮
2023-03-14

我想你的数据库路径正在改变。试试这个。

  Future<Database> initializeDatabase() async {
    //Get the directory path for both Android and IOS to store Database
    String databasesPath = await getDatabasesPath();
    String path = p.join(databasesPath, 'wifi.db');
    //Open/create the database at the given path
    var wifiSystemDatabase = await openDatabase(path, version: 1, onCreate: _createDb);
    return wifiSystemDatabase;
  }

希望有帮助:)

 类似资料:
  • 问题内容: 我已经在Google Store中有一个应用程序。我正在使用具有3个表的内置数据库,并在应用程序首次启动时将其复制。现在,我想升级到该应用程序并添加另一个表。下面是我的代码。 我想问几个问题。上面的代码未升级。 现在,如果我是该应用程序的新用户,是否需要编辑旧数据库并制作另一个CKRecording表,并用放置在资产中的当前数据库替换该数据库,或者上述代码也适用于新用户? 问题答案:

  • 根据文档,来自的room实例应该保存的数据是persist。但还是迷路了。我的项目必须数据库 第一个数据库 @database(实体=[foodmodel::class],version=4,exportSchema=false)抽象类FoodDatabase:RoomDatabase(){ 第二数据库 抽象类MyFoodDatabase:RoomDatabase(){abstract val M

  • 我已经尝试了一切我知道但不能解决这个问题 运行输出 : 在调试模式下启动 moto g 40 融合上的利布\主.飞镖...正在运行 Gradle 任务“组装演示”...√ 已构建版本\app\outputs\flutter-apk\app-debug.apk.D/颤动定位服务(30742):正在创建服务。D/颤振定位服务(30742):绑定到位置服务。调试服务侦听 ws://127.0.0.1:5

  • 该API主要受Android ContentProvider的启发,其中典型的SQLite实现意味着在第一个请求时打开数据库一次,并保持其打开状态。 就我个人而言,我的Flutter应用程序中有一个全局参考数据库,以避免锁问题。如果多次调用,打开数据库应该是安全的。 如果引用丢失(并且数据库尚未关闭),只在小部件中保留引用可能会导致热重新加载问题。

  • 根据Hazelcast官方文档,从版本3.8开始支持滚动升级。 如果我的服务器版本是3.5,是否有办法创建一个成功的集群,其中新的盒子运行较新版本的Hazelcast? 天真地升级到3.6。*导致了两个不同的集群(旧的盒子仍然运行3.5,而另一个新的盒子运行3.6,显然没有数据,因为它永远无法与现有的盒子接触)。 我的部署过程如下: 创建一组新框 我的想法是在磁盘/数据库上存储快照,并在推出时从数

  • 我正在处理一个spring boot应用程序,我想把从2.9.10.2升级到2.10.2。下面是我的pom.xml片段和升级依赖项后得到的错误: pom.xml: null