乐趣区

关于flutter:如何快速给Flutter应用增加云同步功能第二弹

明天以一个丑陋的开源笔记 / 日记为例,来给大家提供一个思路,用最简略的办法将一个本地存储我的项目变为能够云同步的我的项目。

这个 App 原始地址在 https://github.com/bimsina/notes-app。为什么选这个我的项目呢?因为这个我的项目自身就是应用的本地sqlite 进行数据存储,能够比拟不便将它改成在线 postgre 数据库,从而用有云同步性能。

对于没有应用 sqlite 的我的项目也是能够革新的,只不过要从新写存储逻辑,如果某个我的项目你有特地喜爱和须要的性能,也是值得花点工夫革新的。

废话少说,咱们来看我的项目。

咱们找到我的项目中的 db_helper.dart 文件,接下来的次要工作就是革新这个本地数据库性能。

因为我的项目原来应用的sqlite,而咱们筹备将它改为postgres

首先咱们引入 dart 的 postgre 驱动,并初始化数据库。

import 'package:postgres/postgres.dart';

...

connection = PostgreSQLConnection(dbIp, dbPort, dbName,
      username: dbAccount, password: dbPasswd);
await connection.open();

...

这里须要筹备一个有公网 ip 数据库,举荐一个不便的云数据库,一键创立,一键查问,非常不便,而且是收费的哦。返回 MemFireDB 注册一个账号就能应用。

接下来创立数据库形式也要批改成 postgre 的形式。

await connection.execute("""
        CREATE TABLE $noteTable (
                  $colId SERIAL PRIMARY KEY,
                  $colTitle TEXT,
                  $colDescription TEXT,
                  $colPriority INTEGER,
                  $colColor INTEGER,
                  $colDate TEXT);
        """);

这一步胜利之后,咱们就将数据库搬到了云上。接下来将它所有操作数据库的业务逻辑改成 postgre 形式。

能够看到源代码中有这个几个办法。

getNoteMapList
insertNote
updateNote
deleteNote
getCount
getNoteList

咱们看其中一个增加笔记的办法能够看到,dartsqlite 库对 SQL 语句做了一些封装,能够直接插入一个map,应用起来比拟不便。

Future<int> insertNote(Note note) async {
  Database db = await this.database;
  var result = await db.insert(noteTable, note.toMap());
  return result;
}

然而 postgre 库没有提供这些,须要本人做一点封装。

上面是我封装的办法,不便插入和更新数据。

static String getInsertSql(String table, Map<String, dynamic> values,
    {List<String> ignores}) {if (ignores != null && ignores.length > 0) {ignores = ignores.map((e) => e.toLowerCase()).toList();}

  final insert = StringBuffer();
  insert.write('INSERT');
  insert.write('INTO');
  insert.write(_escapeName(table));
  insert.write('(');

  final size = (values != null) ? values.length : 0;

  if (size > 0) {final sbValues = StringBuffer(') VALUES (');

    var i = 0;
    values.forEach((String colName, dynamic value) {if (ignores == null || !ignores.contains(colName.toLowerCase())) {if (i++ > 0) {insert.write(',');
          sbValues.write(',');
        }

        /// This should be just a column name
        insert.write(_escapeName(colName));
        sbValues.write(PostgreSQLFormat.id(colName));
      }
    });
    insert.write(sbValues);
  }
  insert.write(')');

  var sql = insert.toString();
  return sql;
}

还有一些别的封装,大家具体到我的项目中去看,最初会给出残缺代码地址。

这里咱们增加笔记的办法就变成了。

Future<int> insertNote(Note note) async {
  ...

  var sql = getInsertSql(noteTable, note.toMap());
  var res = await db.execute(sql, substitutionValues: note.toMap());
  return res;
}

同样的其余的办法也都要革新,将这些办法都革新实现之后就实现了。

如果你的利用须要提供给其他人用,或者你想跟你的对象 (如果你有的话) 一起写日记🐶。

那么以写一个配置数据库的界面,不便动静配置数据库。

我这里写了一个,可供参考。

<center class=”half”>

<img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a4d3e09e7b6047dbb7a441b0cd227260~tplv-k3u1fbpfcp-zoom-1.image" width="400"/>

</center>

到这里,你就能够跟你对象欢快的一起写日记啦!🐶

App 还是很好用的,当初又有了云同步性能,就更加弱小了。

这里只是给大家提供一个思路,更多的玩法大家施展本人的设想。

残缺代码(https://github.com/aliyoge/notes-app)

退出移动版