今天以一个漂亮的开源TodoList为例,来给你们提供一个思路,用最简单的方法将一个本地存储项目变为能够云同步的项目。git
这个App原始地址在https://github.com/asjqkkkk/flutter-todos
。为何选这个项目呢?由于这个项目自己就是使用的本地sqlite
进行数据存储,能够比较方便将它改为在线postgre
数据库,从而用有云同步功能。github
对于没有使用sqlite
的项目也是能够改造的,只不过要从新写存储逻辑,若是某个项目你有特别喜欢和须要的功能,也是值得花点时间改造的。sql
废话少说,咱们来看项目。数据库
咱们找到项目中的database.dart
文件,接下来的主要任务就是改造这个本地数据库功能。markdown
因为项目原来使用的sqlite
,而咱们准备将它改成postgres
。async
首先咱们引入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
, BeBSua
ui
接下来建立数据库方式也要修改为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
的方法能够看到,dart
的sqlite
库对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…)