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
中的字符串
当我在 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
中的字符串