Flutter,具有许多表的复杂 SQLite DB,这是最佳实践吗?

Posted

技术标签:

【中文标题】Flutter,具有许多表的复杂 SQLite DB,这是最佳实践吗?【英文标题】:Flutter, complex SQLite DBs with many tables, is this best practice? 【发布时间】:2019-03-11 05:08:54 【问题描述】:

Flutter 新手在这里害怕。

我有一个小型 Django 应用程序 (python),我将其移植到没有 Web 后端的独立 Flutter 应用程序。我直接导出了指定在我的 Django 应用程序中使用的 SQL 表的 SQL(DDL;大约 300 行),并在我的颤振应用程序中使用它(见下文)。我最终得到了大约 8 个表,我可以通过复制/粘贴 Django 通过 ORM 为我创建的 Django SQL 查询来查询这些表。

我的问题:在移动应用程序开发中拥有复杂的表格是最佳做法吗?我担心 SQLite 不适合这种复杂性。但我觉得重用这个已经生成的模型结构和 SQL 查询范围可以节省我的时间。

非常感谢, 安迪。

initDb() async 
// Get a location using path_provider
var databasesPath = await getDatabasesPath();
String path = join(databasesPath, "gear_log.db");

await deleteDatabase(path);

var theDb = await openDatabase(path, version: 1,
    onCreate: (Database db, int version) async 

      String sql = await rootBundle.loadString('assets/db/schema.txt');
      for(var s in sql.split(";"))  //seems to be a max # characters for db.execute
        if(s.length > 5)  // catching any hidden characters at end of schema
          await db.execute(s + ';');
        
      

      // When creating the db, create the table

    );
return theDb;

重用 Django 生成的 SQL 来检索数据:

Future<List<Item>> getItems() async 
var dbClient = await db;
List<Map> list = await dbClient.rawQuery('SELECT "shoe_actualpair"."id", "shoe_actualpair"."created", "shoe_actualpair"."modified", "shoe_actualpair"."name", "shoe_actualpair"."shoe_id", "shoe_actualpair"."expires", "shoe_actualpair"."runner_id" FROM "shoe_actualpair" WHERE "shoe_actualpair"."runner_id" = 1 ORDER BY "shoe_actualpair"."modified" DESC, "shoe_actualpair"."created" DESC');
List<Item> employees = new List();
for (int i = 0; i < list.length; i++) 
  employees.add(Item.fromMap(list[i]));

return employees;

【问题讨论】:

【参考方案1】:

您可以使用捷豹 ORM。 https://github.com/Jaguar-dart/jaguar_orm

我在具有一对一、一对多和多对多关系的应用中使用它。

对于 sqlite (sqflite),你还需要在你的 Flutter 应用中使用这个适配器: https://github.com/Jaguar-dart/jaguar_orm/tree/master/sqflite

【讨论】:

以上是关于Flutter,具有许多表的复杂 SQLite DB,这是最佳实践吗?的主要内容,如果未能解决你的问题,请参考以下文章

插入sqlite表的记录对于每一行都是相同的

SQLite复杂表的更新方式

在具有多个表的 sqlite 数据库中检索链接对象列表的查询是啥?

在具有多个表的 sqlite 数据库中删除行不起作用

为数据库处理创建数据模型类

如何使用Flutter将数据SQLite(离线)发送到服务器MySQL?