当前位置: 首页 > 后端技术 > Python

Flutter的三种本地存储方式:文件、SharedPreferences、数据库

时间:2023-03-25 22:46:51 Python

SharedPreferences存储和缓存少量的键值对信息(比如记录用户是否阅读了公告,或者简单的计数),可以使用SharedPreferences。SharedPreferences将通过原生平台相关机制为简单的键值对数据提供持久化存储,即在iOS上使用NSUserDefaults,在Android上使用SharedPreferences。SharedPreferences的使用非常简单方便。但是需要注意的是,只有基本类型的数据才能以键值对的形式存储,比如int、double、bool、string等。1.pubspec.yaml引入shared_preferences:0.5.12+42.codeimport'dart:developer';导入“包:flutter/material.dart”;导入“包:shared_preferences/shared_preferences.dart”;voidmain(){runApp(MyApp());}classMyAppextendsStatelessWidget{//这个小部件是你应用程序的根。@overrideWidgetbuild(BuildContextcontext){returnMaterialApp(title:'FlutterDemo',theme:ThemeData(primarySwatch:Colors.blue,),home:MyHomePage(title:'FlutterDemoHomePage'),);}}classMyHomePageextendsStatefulWidget{MyHomePage({Keykey,this.title}):super(key:key);最终字符串标题;@override_MyHomePageStatecreateState()=>_MyHomePageState();}class_MyHomePageStateextendsState{int_counter=0;//涉及耗时的文件读写,将这些操作以异步的方式包装起来//读取得到SharedPreferences中计数器的值作为键Future_loadCounter()async{SharedPreferencesprefs=awaitSharedPreferences.getInstance();intcounter=(prefs.getInt('counter')??0);退货柜台;}//在SharedPreferences中增量写入counter的值,key为counterFuture_incrementCounter()async{SharedPreferencesprefs=awaitSharedPreferences.getInstance();intcounter=(prefs.getInt('counter')??0)+1;print("当前值:"+counter.toString());prefs.setInt('计数器',计数器);//setter(setInt)方法会同步更新内存中的键值对,然后将数据保存到磁盘,所以不需要调用update方法强制刷新缓存}_fresh(){//_incrementCounter();_incrementCounter().then((_)=>{_loadCounter().then((value){setState((){_counter=value;});print("before:$value");})});}//void_incrementCounter(){//setState((){//_counter++;//});//}@overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(//这里我们从App.build方法创建的MyHomePage对象中获取值,并且用它来设置我们的应用栏标题。title:Text(widget.title),),body:Center(//Center是一个布局小部件。它采用单个子项并将其定位//在父项的中间。child:Column(mainAxisAlignment:MainAxisAlignment.center,children:[Text('你已经按下按钮这么多次了:',),Text('$_counter',style:Theme.of(context).textTheme.headline4,),],),),floatingActionButton:FloatingActionButton(onPressed:_fresh,tooltip:'Increment',child:Icon(Icons.add),),//这个尾随逗号使构建方法的自动格式化更好。);}}数据库存储如果需要持久化大量格式化数据,并且这些数据会以更高的频率更新,为了进一步考虑可扩展性,通常使用sqlite数据库来处理这种场景,相比文件和SharedPreferences,Databases可以为数据读写提供更快更灵活的解决方案。1.pubspec.yaml导入sqflite:1.3.2+1path_provider:^1.6.242.代码import'package:flutter/material.dart';import'package:sqflite/sqflite.dart';import'package:path/path.dart';import'package:path_provider/path_provider.dart';import'dart:io';voidmain(){runApp(MyApp());}classMyAppextendsStatelessWidget{//这个小部件是你的根应用。@overrideWidgetbuild(BuildContextcontext){returnMaterialApp(title:'FlutterDemo',theme:ThemeData(primarySwatch:Colors.blue,),home:MyHomePage(title:'FlutterDemoHomePage'),);}}classMyHomePageextendsStatefulWidget{MyHomePage({Keykey,this.title}):super(key:key);最终字符串标题;@override_MyHomePageStatecreateState()=>_MyHomePageState();}classStudent{Stringid;字符串名称;积分;//构造方法Student({this.id,this.name,this.score,});//使用将JSON字符串转换成类对象的工厂类方法factoryStudent.fromJson(MapparsedJson){returnStudent(id:parsedJson['id'],name:parsedJson['name'],score:parsedJson['score'],);}MaptoJson(){return{'id':id,'name':名字,'score':分数,};}}class_MyHomePageStateextendsState{varstudent1=Student(id:'123',name:'张三',score:110);query_database(id){Futureuser=query_by_id(id);user.then((t){print("单用户查询成功");print('sroceis:'+t.score.toString());student1.score=t.score;});}//插入数据FutureinsertStudent(Studentstd)async{finalDatabasedb=awaitdatabase;awaitdb.insert('students',std.toJson(),//插入冲突策略,新的替换旧的冲突算法:ConflictAlgorithm.replace,);}Futurequery_by_id(Stringid)async{finalDatabasedb=awaitdatabase;列表maps=awaitdb.query('学生',列:['id','姓名','分数'],其中:'id=?',whereArgs:[id]);if(maps.length>0){print("根据id找到了数据");返回Student.fromJson(maps.first);}print("根据id没有找到数据");返回空值;}//初始化数据库方法initDB()async{DirectorydocumentsDirectory=awaitgetApplicationDocumentsDirectory();Stringpath=join(documentsDirectory.path,"students_database.db");returnawaitopenDatabase(path,version:1,onOpen:(db){},onCreate:(Databasedb,intversion)async{awaitdb.execute('''CREATETABLEstudents(idTEXTPRIMARYKEY,nameTEXT,score复制代码整数)''');});}数据库_数据库;Future异步获取数据库{if(_database!=null){print(_database);返回_数据库;}_database=awaitinitDB();print("新建一个数据库");返回_数据库;}void_incrementCounter()async{student1.score+=1;等待插入学生(学生1);设置状态((){});}Future>students()async{finalDatabasedb=awaitdatabase;finalList>maps=awaitdb.query('students');返回List.generate(maps.length,(i)=>Student.fromJson(maps[i]));}@overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:Text(widget.title),),body:Center(child:Column(mainAxisAlignment:MainAxisAlignment.center,children:[文本('你已经按下按钮这么多次了:',),Text(student1.score.toString(),style:Theme.of(context).textTheme.headline4,),],),),floatingActionButton:FloatingActionButton(onPressed:_incrementCounter,tooltip:'Increment',child:图标(Icons.add),),);}@overridevoiddispose()async{//TODO:实现disposesuper.dispose();最终数据库db=等待数据库;数据库关闭();火星字体转换哄女朋友神器号码测试好坏电视节目直播表最好用的笔记软件