【问题标题】:Flutter: How to store Numbers as String Sqflite?Flutter:如何将数字存储为 String Sqflite?
【发布时间】:2020-06-27 13:38:51
【问题描述】:

当我在 sqflite 中将“00012”存储为 String 时,它会自动转换为整数并删除零(仅将 12 作为 int 数据类型)。

示例代码:

AndroidManifest.xml文件添加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

还可以在设备上手动授予存储权限以创建数据库。

 import 'dart:io';

import 'package:flutter/material.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';

Future<Database> _getDatabase() async {
  WidgetsFlutterBinding.ensureInitialized();
  Directory directory = await getApplicationDocumentsDirectory();
  String path = join(directory.path, "MyDataBase");
  Database database = await openDatabase(
    path,
    version: 1,
    onCreate: (Database db, int version) async {
      await db.execute(
        'CREATE TABLE test (col1 STRING PRIMARY KEY, col2 STRING)',
      );
    },
  );
  return database;
}

Database db;

Future<void> main() async {
  db = await _getDatabase();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Test",
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  Future<dynamic> valueFromDb;

  Future<int> _saveToDB(String id, String text) async {
    final data = await _loadFromDB(id);
    if (data == null)
      return db.insert(
        "test",
        {
          "col1": id,
          "col2": text,
        },
      );
    return 0;
  }

  Future<dynamic> _loadFromDB(String id) async {
    final results = await db.query(
      "test",
      where: "col1 = ?",
      whereArgs: [id],
    );
    if (results?.isNotEmpty == true) return results.first["col2"];
    return null;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
              child: Text("Save 00012 as String to DB"),
              onPressed: () => _saveToDB("MyID", "000012"),
            ),
            RaisedButton(
              child: Text("Load Value"),
              onPressed: () {
                setState(() {
                  valueFromDb = _loadFromDB("MyID");
                });
              },
            ),
            FutureBuilder(
              future: valueFromDb,
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.waiting)
                  return Center(child: CircularProgressIndicator());
                else
                  return Column(
                    children: <Widget>[
                      Text(
                        "Value from DB: ${snapshot.data?.toString() ?? ""}",
                      ),
                      Text(
                        "Data Type: ${snapshot.data?.runtimeType ?? ""}",
                      )
                    ],
                  );
              },
            ),
          ],
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter flutter-dependencies sqflite


    【解决方案1】:

    改变

    'CREATE TABLE test (col1 STRING PRIMARY KEY, col2 STRING)'
    

    'CREATE TABLE test (col1 TEXT PRIMARY KEY, col2 TEXT)'
    

    阅读rule number 3 and 5 了解亲和力,

    If the STRING or BLOB looks like a real number (if it has a decimal point or an 
    exponent) or if the value is outside the range that can be represented 
    as a 64-bit signed integer, then it converts to REAL
    

    在这种情况下,REAL 就像一个双精度数。 STRING 在 SQLite 中并不是真正的类型(检查 3.1.1 中的表),因此它会将其视为 BLOB 并尝试根据存储的值指定亲和性。告诉使用 TEXT 亲和力之一将迫使它把它当作文本(VARCHAR、CHARACTER 等),即 dart 中的字符串

    【讨论】:

      猜你喜欢
      • 2020-04-13
      • 2020-07-13
      • 1970-01-01
      • 2019-12-22
      • 2020-01-11
      • 2019-08-16
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      相关资源
      最近更新 更多