iOS 退出App如何保存和恢复App的状态、数据

iOS 退出App如何保存和恢复App的状态、数据,第1张

我们希望在输入一些字符,当App关掉再次运行的时候之前输入的那些字符会自动显示在Text中.

然后在AppDelegate.m中添加如下回调方法:

-(BOOL)application:(UIApplication*)application shouldSaveApplicationState:                                                                    (nonnull NSCoder *)coder{returnYES}-(BOOL)application:(UIApplication*)application shouldRestoreApplicationState:(NSCoder *)coder{returnYES}

如果你想要保存App级别的数据可以使用以下2个回调方法:

-(void)application:(UIApplication*)application didDecodeRestorableStateWithCoder:(NSCoder*)coder{   

 float val = [coder decodeFloatForKey:kAppValue]    

NSLog(@"value is %f",val)

}

-(void)application:(UIApplication*)application willEncodeRestorableStateWithCoder:(nonnullNSCoder*)coder{

    [coder encodeFloat:99.99forKey:kAppValue]

}

如果你想要保存某个View界面中的数据,就像一开始说的那样,你可以在ViewController.m里添加如下2个方法:

-(void)decodeRestorableStateWithCoder:(NSCoder *)coder{ 

   [superdecodeRestorableStateWithCoder:coder]

self.inputText.text= [coder decodeObjectForKey:kSaveKey]

}

-(void)encodeRestorableStateWithCoder:(NSCoder *)coder{

    [superencodeRestorableStateWithCoder:coder]   

 [coder encodeObject:self.inputText.textforKey:kSaveKey]

}

现在你运行App,输入一些字符然后关闭App.当你再次运行该App时你会发现View界面中的文本框会显示之前输入的字符串:

在开发过程中,我们需要将某些数据保存下来,比如一些设置信息以及一些用户主动去保存的数据。待用户下次打开应用时候,再自动加载这些信息。下面将介绍windows8开发中如何存储数据。一.本地数据存储在wp中我们使用IsolatedStorageSettings进行本地数据存储,在win8中也提供类似的方法进行存储,我们使用ApplicationData.Current.LocalSettings。下面将通过实例进行描述:在节目上添加姓名、年龄、性别三个控件,代码如下:1234567891011121314男15女161718192021222324新建类AppDataHelper.cs,引用命名空间usingWindows.Storage。我们将读取和保存封装成共通,方便调用。保存数据:1///2///保存数据3///4///数据类型5///键6///值7publicstaticvoidSave(stringkey,Tvalue)8{9ApplicationData.Current.LocalSettings.Values[key]=value10}读取数据:1///2///读取数据3///4///数据类型5///键6///值7publicstaticTRead(stringkey)8{9if(ApplicationData.Current.LocalSettings.Values.ContainsKey(key))10{11return(T)ApplicationData.Current.LocalSettings.Values[key]12}13else14{15returndefault(T)16}17}删除数据:1///2///移除数据3///4///键5///成功true/失败false6publicstaticboolRemove(stringkey)7{8returnApplicationData.Current.LocalSettings.Values.Remove(key)9}我们只要在需要存储或者读取数据的地方进行调用,就可以了。1privatevoidbtnSave_Click(objectsender,RoutedEventArgse)2{3AppDataHelper.Save("name",txtName.Text.Trim())4AppDataHelper.Save("age",int.Parse(txtAge.Text.Trim()))5AppDataHelper.Save("sex",cbxSex.SelectedIndex)6}7privatevoidbtnRead_Click(objectsender,RoutedEventArgse)8{9txtName.Text=AppDataHelper.Read("name")10txtAge.Text=AppDataHelper.Read("age").ToString()11cbxSex.SelectedIndex=AppDataHelper.Read("sex")12}那么我们保存的数据保存到哪里去了呢?我们应该如何找到他们,别急,我们下面开始找保持的数据。打开C:\Users\\AppData\Local\Packages\\Settings\settings.dat,user_name对应当前登录的用户名,packpage对应此应用的唯一标识,在Package.appxmanifest中我们可以找到它:此文件为.dat后缀,我们需要用注册表工具打开它,开始->运行(win+R键),输入Regedit,在打开的窗口里面选择HKEY_LOCAL_MACHINE,然后选择文件->加载配置单元,选择settings.dat文件,打开填入项名称,确定之后可以看到保存的数据会显示在其中。双击name,打开,我们可以看到存储的数据值。那么我们是否能像wp那样存储一个对象到本地存储呢,答案是否定的。win8中只能存储一些简单类型,如int、bool、string等下面有一个Person对象:1[DataContract]2publicclassPerson3{4[DataMember]5publicstringName{getset}6[DataMember]7publicintAge{getset}8[DataMember]9publicintSex{getset}10}进行存储:1Personperson=newPerson()2{3Name=txtName.Text.Trim(),4Age=int.Parse(txtAge.Text.Trim()),5Sex=cbxSex.SelectedIndex6}7AppDataHelper.Save("person",person)此时会报错,提示不支持此类型存储。那么我们应该如何存储一个对象呢?下面我们将介绍文件存储。二.文件存储对于那些比较复杂的数据类型,我们需要将其存储为文件的形式存储在应用中。StorageFile的存储,以文件的形式进行存储存入数据。新建一个类,LocalFileHelper.cs存储文件:1///2///存储数据///3///数据类型4///文件名称5///数据6///无7publicasyncstaticTaskSave(stringfileName,Tdata)8{9//取得当前程序存放数据的目录10StorageFolderfolder=Windows.Storage.ApplicationData.Current.LocalFolder11//创建文件,如果文件存在就覆盖12StorageFilefile=awaitfolder.CreateFileAsync(fileName,CreationCollisionOption.ReplaceExisting)13using(StreamnewFileStream=awaitfile.OpenStreamForWriteAsync())14{15DataContractSerializerser=newDataContractSerializer(typeof(T))16ser.WriteObject(newFileStream,data)17newFileStream.Dispose()18}19}读取文件:1///2///读取数据3///4///数据类型5///文件名称6///数据7publicasyncstaticTaskRead(stringfileName)8{9Tt=default(T)10try11{12StorageFolderfolder=Windows.Storage.ApplicationData.Current.LocalFolder13StorageFilefile=awaitfolder.GetFileAsync(fileName)14if(file==null)15returnt16StreamnewFileStream=awaitfile.OpenStreamForReadAsync()17DataContractSerializerser=newDataContractSerializer(typeof(T))18t=(T)ser.ReadObject(newFileStream)19newFileStream.Dispose()20returnt21}22catch(Exception)23{24returnt25}26}删除文件:1///2///删除文件3///4///文件名称5///成功true/失败false6publicasyncstaticTaskDelete(stringfileName)7{8StorageFolderfolder=Windows.Storage.ApplicationData.Current.LocalFolder9StorageFilefile=awaitfolder.GetFileAsync(fileName)10if(file!=null)11{12try13{14awaitfile.DeleteAsync()15}16catch(Exception)17{18returnfalse19}20}21returntrue22}使用方法:1Personperson=newPerson()2{3Name=txtName.Text.Trim(),4Age=int.Parse(txtAge.Text.Trim()),5Sex=cbxSex.SelectedIndex6}78awaitLocalFileHelper.Save("person.xml",person)910Listlist=newList()11list.Add(person)12list.Add(person)13awaitLocalFileHelper.Save("personList.xml",list)141516PersonnewPerson=awaitLocalFileHelper.Read("person.xml")17ListpersonList=awaitLocalFileHelper.Read("personList.xml")文件在哪里?同样我们打开C:\Users\user_name\AppData\Local\Packages\package\LocalState文件夹,下面就有我们保持的文件,打开文件,保存文件的内容格式为xml:27BetterChaner0三.使用Sqlite进行数据存储Sqlite现已提供对WindowsRT和Windows8Metro应用的支持.首先,在工具,选择扩展与更新中,选择联机,在搜索框内输入sqlite,找到SQLiteforWindowRuntime,下载安装。安装完成之后重启VS,右击项目添加引用,选择Windows->扩展,找到Mircosoftvisualc++runtimepackage和sqliteforwindowsruntime,打勾,确定。由于目前Sqlite不支持AnyCPU,所以我们将项目改成X64,右击解决方案,属性,修改之。然后右击引用,选择管理Nuget程序包,联机搜索sqlite-net,下载安装。我们发现项目工程中多了2个类文件,SQLite.cs和SQLiteAsync.cs基本 *** 作:1//创建数据库2stringdbRootPath=Windows.Storage.ApplicationData.Current.LocalFolder.Path3SQLiteConnectiondb=newSQLiteConnection(Path.Combine(dbRootPath,"myApp.sqlite"))45//创建表6db.CreateTable()78//插入一条数据9db.Insert(newPerson(){Name="BetterChaner",Age=27,Sex=1})1011//插入多条数据12Listlist=newList()13list.Add(newPerson(){Name="Zhangsan",Age=27,Sex=1})14list.Add(newPerson(){Name="Lisi",Age=32,Sex=0})15list.Add(newPerson(){Name="Wangwu",Age=24,Sex=1})16db.InsertAll(list)1718//查询数据19Listlist2=db.Query("select*fromPerson")2021//更新数据22SQLiteCommandcmd=db.CreateCommand("updatePersonsetAge=21whereName='Lisi'")23cmd.ExecuteNonQuery()2425//删除一条数据26db.Delete(newPerson(){Name="Zhangsan",Age=27,Sex=1})27//删除全部数据28db.DeleteAll()数据存储的位置为:C:\Users\\AppData\Local\Packages\\LocalState\文件夹下的myApp.sqlite四.SqlCE有了Sqilte,SqlCE不太经常会用到了,在这里就不写出实例了,与wp中类似。小结以上为windowsstoreapp开发中可以使用的几种存储数据的方式,可以根据数据大小、作用以及类型选择应该使用哪一种存储方式。

数据持久化包简单来说就是把数据放外存嘛。如果这个数据是这个App用户自己私有的,并且不需要同步其他设备,只在这个设备使用,那么考虑本地嘛,或者是一些需要缓存的东西像个人资料,头像什么的,网上拉取了,我下次打开App就能直接拉取,等服务器更新完了数据我在进行替换。本地的sharepreference, SQLite,sdCard 都是可以考虑的

然后,其他需要共享的,网络同步的那些就自然是服务器啦,都是看情况定的嘛


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6617998.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-25
下一篇 2023-03-25

发表评论

登录后才能评论

评论列表(0条)

保存