如何快速給Flutter應用增長雲同步功能第三篇

今天以一個漂亮的開源TodoList爲例,來給你們提供一個思路,用最簡單的方法將一個本地存儲項目變爲能夠雲同步的項目。git

這個App原始地址在https://github.com/asjqkkkk/flutter-todos。爲何選這個項目呢?由於這個項目自己就是使用的本地sqlite進行數據存儲,能夠比較方便將它改爲在線postgre數據庫,從而用有云同步功能。github

對於沒有使用sqlite的項目也是能夠改造的,只不過要從新寫存儲邏輯,若是某個項目你有特別喜歡和須要的功能,也是值得花點時間改造的。sql

廢話少說,咱們來看項目。數據庫

咱們找到項目中的database.dart文件,接下來的主要任務就是改造這個本地數據庫功能。markdown

因爲項目原來使用的sqlite,而咱們準備將它改成postgresasync

首先咱們引入dart的postgre驅動,並初始化數據庫。oop

import 'package:postgres/postgres.dart';

...

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

...
複製代碼

這裏須要準備一個有公網ip的免費雲數據庫MemFireDB,一鍵建立,一鍵查詢,十分方便post

在這裏貼幾個邀請碼,方便你們測試。測試

BeAwWu, BeBJdb, BeAuWn, BeB0d9, Be8JJP, BeBSuaui

接下來建立數據庫方式也要修改爲postgre的方式。

await connection.execute(""" CREATE TABLE todolist ( id SERIAL PRIMARY KEY, account TEXT, taskName TEXT, taskType TEXT, taskStatus INTEGER, taskDetailNum INTEGER, uniqueId TEXT, needUpdateToCloud TEXT, overallProgress TEXT, changeTimes INTEGER, createDate TEXT, finishDate TEXT, startDate TEXT, deadLine TEXT, detailList TEXT, taskIconBean TEXT, textColor TEXT, backgroundUrl TEXT); """);
複製代碼

這一步成功以後,咱們就將數據庫搬到了雲上。接下來將它全部操做數據庫的業務邏輯改爲postgre方式。

能夠看到源代碼中有這個幾個方法。

createTask
getTasks
updateTask
deleteTask
updateTasks
createTasks
getTaskByUniqueId
queryTask
複製代碼

咱們看其中一個添加Todo的方法能夠看到,dartsqlite庫對SQL語句作了一些封裝,能夠直接插入一個map,使用起來比較方便。

Future createTask(TaskBean task) async {
  ...

  var sql = getInsertSql('todolist', task.toMap());
  await db.execute(sql, substitutionValues: task.toMap());
}
複製代碼

可是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 createTask(TaskBean task) async {
  ...

  var sql = getInsertSql('todolist', task.toMap());
  await db.execute(sql, substitutionValues: task.toMap());
}
複製代碼

一樣的其餘的方法也都要改造,將這些方法都改造完成以後就完成了。

若是你的應用須要提供給其餘人用,那麼以寫一個配置數據庫的界面,方便動態配置數據庫。

我這裏寫了一個,可供參考。

到這裏,該着就完成啦!🐶

App仍是很好用的,如今又有了雲同步功能,就更增強大了。

這裏只是給你們提供一個思路,更多的玩法你們發揮本身的想象。

完整代碼(github.com/aliyoge/flu…)

相關文章
相關標籤/搜索