Flutter:如何将数字存储为字符串 Sqflite?

Flutter: How to store Numbers as String Sqflite?

当我在 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 ?? ""}",
                      )
                    ],
                  );
              },
            ),
          ],
        ),
      ),
    );
  }
}

改变

'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 中的 table),因此它会将其视为 BLOB 并尝试根据存储的值指定亲和力。告诉使用其中一个 TEXT 亲和力将强制它将其视为文本(VARCHAR、CHARACTER 等),即 dart

中的字符串