如何疾速给我的项目减少云同步性能
明天以一个丑陋的开源记账我的项目为例,来给大家提供一个思路,用最简略的办法将一个本地存储我的项目变为能够云同步的我的项目。
这个App名叫《出入》,地址在https://github.com/Livinglist/Churu
。为什么选这个我的项目呢?因为这个我的项目自身就是应用的本地sqlite
进行数据存储,能够比拟不便将它改成在线postgre
数据库,从而用有云同步性能。
对于没有应用sqlite
的我的项目也是能够革新的,只不过要从新写存储逻辑,如果某个我的项目你有特地喜爱和须要的性能,也是值得花点工夫革新的。
废话少说,咱们来看我的项目。
首先咱们须要筹备一个测试手机,咱们用最新的鸿蒙零碎进行测试
咱们找到我的项目中的db_provider.dart
文件,接下来的次要工作就是革新这个本地数据库性能。
首先咱们引入dart的postgre驱动,并初始化数据库。
import 'package:postgres/postgres.dart';...connection = PostgreSQLConnection(dbIp, dbPort, dbName, username: dbAccount, password: dbPasswd);await connection.open();...
这里须要筹备一个有公网ip的收费云数据库MemFireDB,一键创立,一键查问,非常不便。
接下来创立数据库形式也要批改成postgre
的形式。
CREATE TABLE $tableName (""" $colId SERIAL PRIMARY KEY, $colUuid TEXT, $colTimestamp BIGINT, $colDescription TEXT, $colType INTEGER, $colAmount REAL); """);
这一步胜利之后,咱们就将数据库搬到了云上。接下来将它所有操作数据库的业务逻辑改成postgre
形式。
能够看到源代码中有这个几个办法。
updateTransactiondeleteTransactionaddTransactiongetAllTransactions
咱们看其中一个增加交易的办法能够看到,dart
的sqlite
库对SQL
语句做了一些封装,能够直接插入一个map
,应用起来比拟不便。
Future<int> addTransaction(Transaction transaction) async {... return db.insert('Transactions', transaction.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;}
还有一些别的封装,都写在pg_helper.dart
文件中。
这里咱们增加交易的办法就变成了。
Future<int> addTransaction(Transaction transaction) async {... var sql = PgHelper.getInsertSql(tableName, transaction.toMap(), ignores: [colId]); var res = await db.execute(sql, substitutionValues: transaction.toMap()); return res;}
同样的其余的办法也都要革新,将这些办法都革新实现之后就实现了。
如果你的利用须要提供给其他人用,或者你想跟你的对象(如果你有的话)一起记账,那么能够写一个配置数据库的界面,不便动静配置数据库。
我这里写了一个,可供参考。
<center class="half">
<img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5cc171e603554293978c3edb30c40f8b~tplv-k3u1fbpfcp-zoom-1.image" width="400"/>
</center>
到这里,你就能够跟你对象欢快的一起记账啦![狗头]
App还是很好用的,当初又有了云同步性能,就更加弱小了。
这里只是给大家提供一个思路,更多的玩法大家施展本人的设想。
残缺代码(https://github.com/aliyoge/Churu)