• 许童童
    2019-08-24
    思考题:
    1.文件用来存储图片,视频类的大文件,SharedPreferences 用来存储一些键值对,比如记住用户名,数据库用来存储类似表格有关系的数据行。
    2.
    //1.1 版本数据库创建代码
    final Future<Database> database = openDatabase(
      join(await getDatabasesPath(), 'students_database.db'),
      onCreate: (db, version)=> {
        if (version == '1.0') {
          db.execute("ALTER TABLE students ADD age INTEGER)"),
        } else {
          db.execute("CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER, age INTEGER)"),
        }
      }
      version: 1,
    );

    //1.2 版本数据库创建代码
    final Future<Database> database = openDatabase(
      join(await getDatabasesPath(), 'students_database.db'),
      onCreate: (db, version)=> {
        if (version == '1.0') {
          db.execute("ALTER TABLE students ADD age INTEGER)"),
        } else if (version == '1.1') {
          
        } else {
          db.execute("CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER, age INTEGER)"),
        }
      }
      version: 1,
    );
    展开

    作者回复: 数据库创建的语句不对:
    1.1.0,1.1和1.2传入的version完全一样,没办法区分数据库版本
    2.数据库升级的代码不太适合用if-else判断具体版本去写适配策略,版本一多适配代码就乱了。建议用none break的switch-case去写

    
     2
  • 一夫
    2020-02-05
    请问,如果在程序中,需要连续访问数据库(多表)操作时,是不是把openDatabase这个操作在应用启动时直接完成比较好呢?如果一直持有database的对象,对性能是否有影响呢?或者,换个角度,每次访问时,都要打开数据库,这样操作,是否会有性能延迟呢?这种操作怎么平衡比较好?
    
    
  • coc
    2019-12-16
    getApplicationDocumentsDirectory找不到这方法

    作者回复: import 'package:path_provider/path_provider.dart';

    
    
  • Geek_neterM
    2019-09-09
    老师,是不是我本地没有content.txt,一直报 no such file or directory

    作者回复: 检查一下你的路径名是不是和例子一样哈

    
    
  • Geek_neterM
    2019-09-09
    老师,是不是实现必须把content.txt 创建好呀。

    作者回复: 不需要的

    
    
  • Geek_joestar
    2019-09-09
    1.1 版本及 1.2 版本的数据库升级代码:
    final Future<Database> database = openDatabase(
          join(await getDatabasesPath(), 'students_database.db'),
          onCreate: (db, version) => db.execute(
              "CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER, age INTEGER)"),
          onUpgrade: (db, oldVersion, newVersion) {
            //dosth for migration
            print("old:$oldVersion,new:$newVersion");
            switch (oldVersion) {
              case 1:
                db.execute("ALTER TABLE students ADD age INTEGER");
            }
          },
          version: 2,
        );
    展开

    作者回复: 对,不过switch-case是需要有break的

    
    
  • ptlCoder
    2019-08-29
    数据库升级应该要比较两个版本的字段,防止数据丢失应该把旧的字段值拷贝到新的版本中

    作者回复: 数据量大的话不建议拷贝,建议直接在原始表上新增字段

    
    
  • 小水滴
    2019-08-28
    final Future<Database> database_1v = openDatabase(
        join(await getDatabasesPath(),'students_database.db'),
        onCreate: (db,version)=>db.execute("CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER)"),
        version: 1
      );

     
      //1.1版本
      final Future<Database> database_11v = openDatabase(
          join(await getDatabasesPath(),'students_database.db'),
          onCreate: (db,version) {
            switch(version){
              case 1:
                db.execute("ALTER TABLE students ADD age INTEGER)");
                break;
              default:
                db.execute("CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER , age INTEGER");
            }

          },
          version: 11
      );

      //1.1版本
      final Future<Database> database_12v = openDatabase(
          join(await getDatabasesPath(),'students_database.db'),
          onCreate: (db,version) {
            switch(version){
              case 1:
                db.execute("ALTER TABLE students ADD age INTEGER)");
                break;
              case 11:
                break;
              default:
                db.execute("CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER , age INTEGER");
            }

          },
          version: 12
      );
    展开

    作者回复: 这里有一个bug:你这里的switch-case只能执行单条更新语句,如果数据库版本差的比较多,每个版本都有更新,这样就不行了


    另外更正一个原文中的错误:数据库的升级是在onUpgrade回调函数中完成的

    
    
  • davidzhou
    2019-08-26
    老师,flutter的sqlite有没有ORM的相关第三方库

    作者回复: pub上有一些,没有特别好用的,不建议

    
    
  • 汪帅
    2019-08-24
    我想请问一下关于获取系统信息怎么做啊?例如通讯录,安装的APP信息等等

    作者回复: 需要在原生代码宿主写方法通道来实现了。具体可以参考26节的内容

     3
    
我们在线,来聊聊吧