Jetpack架构学习(7)——使用DataStore存储配置信息
<p>原文地址: Jetpack架构学习(7)——使用DataStore存储配置信息-Stars-One的杂货小窝</p><p>这里由于开发的app使用的compose架构,比较适合与DataStore一起使用,所以稍微学习了使用方法,顺便记录下</p>
<p>其实<code>DataStore</code>和<code>SharePreference</code>使用方式类似,就是如果你的是新项目,没有啥历史包袱,可以试着用下,使用Flow和Compose使用还是挺舒服的</p>
<h2 id="介绍">介绍</h2>
<p>DataStore分2种类型:</p>
<ul>
<li><code>Preferences DataStore</code> 存储配置信息</li>
<li><code>Proto DataStore</code> 存储对象数据(二进制)</li>
</ul>
<p>常用的存储配置信息,存储对象数据一般比较少用,这里也不深究了</p>
<h2 id="使用">使用</h2>
<h3 id="1依赖导入">1.依赖导入</h3>
<pre><code class="language-kotlin">// Preferences DataStore (SharedPreferences like APIs)
dependencies {
implementation("androidx.datastore:datastore-preferences:1.1.7")
}
// Alternatively - use the following artifact without an Android dependency.
dependencies {
implementation("androidx.datastore:datastore-preferences-core:1.1.7")
}
</code></pre>
<h3 id="2数据读取和写入">2.数据读取和写入</h3>
<p>这里,首先得给Context加个扩展方法,用来创建我们的DataStore实例</p>
<pre><code class="language-kotlin">//需要在顶层kt文件创建,name参数可以任取
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
</code></pre>
<blockquote>
<p>一般我们一个app,只需要用到一个DataStore即可,如果你想要创建多个,可以搞几个扩展方法,然后创建不同名字的DataStore</p>
</blockquote>
<p>下面给一个简单封装示例,用于存储keyexample_counter的为int类型数据:</p>
<pre><code class="language-kotlin">class MySetting(val context:Context){
val EXAMPLE_COUNTER = intPreferencesKey("example_counter")
//写入数据:
suspend fun incrementCounter(data:Int) {
context.dataStore.edit { settings ->
settings = data
}
}
//读取数据
val exampleCounterFlow: Flow<Int> = context.dataStore.data
.map { preferences ->
// No type safety.
preferences ?: 0
}
}
</code></pre>
<ul>
<li><code>intPreferencesKey</code>用来定义你的数据key,从名字看得出来,你的key对应的数据是int类型,除此之外,还有其他几个方法:</li>
<li><code>doublePreferencesKey</code></li>
<li><code>stringPreferencesKey</code></li>
<li><code>booleanPreferencesKey</code></li>
<li><code>floatPreferencesKey</code></li>
<li><code>longPreferencesKey</code></li>
<li><code>stringSetPreferencesKey</code></li>
<li><code>byteArrayPreferencesKey</code></li>
</ul>
<p>从名字可以直接看得出类型,这里就不解释了</p>
<p>如果你还是想使用同步方法调用,可以使用协程的<code>runBlocking</code>方法</p>
<p>页面使用:</p>
<pre><code>val context = LocalContext.current
val mySettingremember { MySetting(context)}
Column(){
val num by mySetting.exampleCounterFlow.collectAsState(0)
Text(num.toString())
}
</code></pre>
<h2 id="参考">参考</h2>
<ul>
<li>App Architecture: Data Layer - DataStore - Android Developers|App architecture</li>
</ul>
</div>
<div id="MySignature" role="contentinfo">
<hr>
<span>提问之前,请先看</span>提问须知
<span>点击右侧图标发起提问</span>
<img border="0" src="http://wpa.qq.com/pa?p=2:1053894518:52" alt="联系我" title="联系我">
<span>或者加入QQ群一起学习</span>
<img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="Stars-One安卓学习交流群" title="Stars-One安卓学习交流群">
TornadoFx学习交流群:1071184701
<img src="https://img2020.cnblogs.com/blog/1210268/202003/1210268-20200316120825333-1551152974.png" width="1000" height="auto">
<img src="https://img2018.cnblogs.com/blog/1210268/201905/1210268-20190508151523126-971809604.gif" width="1000" height="auto">
<!--<img src="https://img2020.cnblogs.com/blog/1210268/202004/1210268-20200413161422035-1188549898.gif" width="1000" height="auto">--><br><br>
来源:https://www.cnblogs.com/stars-one/p/19019101
頁:
[1]