安卓学习笔记(四)数据存储

IO优化是怎么做的,使用 SharedPreferences为什么这么卡,mmkv原理是什么 } MMKV的使用非常简单, 所有变更立马生效,无需调用 sync、apply。 在 App 启动时初始化 MMKV,设定 MMKV 的根目录 (默认/data/data/xxx.xxx/files/mmkv/) (sp存储在/data/data/xxx.xxx/shared_prefs/) 支持从SP迁移数据importFromSharedPreferences MMKV 还额外实现了一遍 SharedPreferences、SharedPreferences.Editor 这两个 interface / 阅读详情

目录

一. 背景

二. 持久化技术简介

三. 文件存储

(1)简介

(2)将数据存储到文件中

  1. openFileOutput()方法

  2. 保存方法示例

(3)从文件中读取数据

  1. openFileInput()方法

  2. 读取方法示例

四. SharedPreferences存储

 (1)简介

 (2)往SharedPreferences中存储数据

        1.获取SharedPreferences对象

        2. 向SharedPreferences文件中存储数据

        3. 项目示例

 (3)从SharedPreferences中读取数据  

五. MMKV概述

 1. MMKV——基于 mmap 的高性能通用 key-value 组件

 2. MMKV 原理

六. MMKV在Android中的使用

1. 添加依赖

2. 初始化

3. 支持的数据类型

4. CRUD操作

(1)存储与读取数据

(2)删除与查询

(3)不同业务需要区别存储时

(4)业务需要多进程访问时     

   5. SharedPreferences 迁移


一. 背景

任何一个应用程序都在不停地和数据打交道,我们使用程序时所关心的都是里面的数据。为了保证一些关键性的数据不会丢失,需要用到数据持久化技术。

二. 持久化技术简介

1. 瞬时数据:存储在内存当中,有可能会因为程序关闭或其他原因导致内存被回收而丢失的数据。

2. 数据持久化:将内存中的瞬时数据保存到存储设备中,保证即使在手机或计算机关机的情况下,这些数据仍然不会丢失。

3. 数据状态转换:保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的。持久化技术提供了一种机制,可以让数据在瞬时状态和持久状态之间进行转换。

4. Android系统提供的3种持久化技术:文件存储、SharedPreferences存储以及数据库存储。

三. 文件存储

(1)简介

   文件存储。Android中最基本的数据存储方式,它不对存储的内容进行任何格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合存储一些简单的文本数据或二进制数据。

(2)将数据存储到文件中

  1. openFileOutput()方法

 Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。这个方法接收两个参数:第一个参数是文件名,在文件创建的时候使用。第二个参数是文件的操作模式。

val output = openFileOutput("data", Context.MODE_PRIVATE)
  • 指定的文件名不可以包含路径,所有的文件都默认存储到
  • /data/data/<package name>/files/目录下;  
  • 操作模式可选MODE_PRIVATE和MODE_APPEND,默认值为MODE_PRIVATE,表示当指定相同文件名的时候,所写入的内容将会覆盖原文件中的内容;MODE_APPEND则表示如果该文件已存在,就往文件里面追加内容,不存在就创建新文件。

  2. 保存方法示例

  以下是一段简单的代码示例,展示了如何将一段文本内容保存到文件中:

fun save(inputText: String) {
    try {
        // 1.通过openFileOutput()方法获取一个FileOutputStream对象
        val output = openFileOutput("data", Context.MODE_PRIVATE)
        // 2.借助FileOutputStream对象,构建出一个OutputStreamWriter对象。然后依靠OutputStreamWriter对象,构建一个BufferedWriter对象,通过其将文本内容写入文件中
        val writer = BufferedWriter(OutputStreamWriter(output))
        // 3.内置扩展函数use,在Lambda表达式中的代码全部执行完之后自动将外层的流关闭,无需再编写一个finally语句,手动去关闭流
        writer.use {
            it.write(inputText)
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
}

(3)从文件中读取数据

  1. openFileInput()方法

   Context类中还提供了一个openFileInput()方法,用于从文件中读取数据。这个方法只接收一个参数,即要读取的文件名,然后系统会自动到/data/data/<package name>/files/目录下加载这个文件,并返回一个FileInputStream对象,得到这个对象之后,再通过流的方式就可以将数据读取出来了。

  2. 读取方法示例

 以下是一段简单的代码示例,展示了如何从文件中读取文本数据:

fun load(): String {
    val content = StringBuilder()
    try {
        // 注释1
        val input = openFileInput("data")
        // 注释2
        val reader = BufferedReader(InputStreamReader(input))
        reader.use {
            // 注释3
            reader.forEachLine {
                // 注释4
                content.append(it)
            }
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
    // 注释5
    return content.toString()
}

注释1:获取一个FileInputStream对象
注释2:借助FileInputStream对象构建出一个InputStreamReader对象,依靠InputStreamReader对象,构建一个BufferedReader对象,通过其将文件中的数据一行行读取出来
注释3:内置扩展函数forEachLine,它会将读到的每行内容都回调到Lambda表达式中,我们在Lambda表达式中完成拼接逻辑即可。
注释4:拼接到StringBuilder对象当中。
注释5:最后将读取的内容返回就可以了

四. SharedPreferences存储

 (1)简介

不同于文件的存储方式,SharedPreferences是使用键值对的方式来存储数据的。也就是说,当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值取出来。

而且SharedPreferences还支持多种不同的数据类型存储,如果存储的数据类型是整型,那么读取出来的数据也是整型的;如果存储的数据是一个字符串,那么读取出来的数据仍然是字符串。

 (2)往SharedPreferences中存储数据

        1.获取SharedPreferences对象

 Context类中的getSharedPreferences()方法,此方法接收两个参数。

  • 第一个参数用于指定SharedPreferences文件的名称,如果指定的文件不存在则会创建一个,SharedPreferences文件都是存放在/data/data/<package name>/shared_prefs/目录下的;
  • 第二个参数用于指定操作模式,目前只有默认的MODE_PRIVATE这一种模式可选,它和直接传入0的效果是相同的,表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写。

 Activity类中的getPreferences()方法,该方法只接收一个参数用于指定操作模式。使用这个方法时会自动将当前Activity的类名作为SharedPreferences的文件名。

        2. 向SharedPreferences文件中存储数据

得到了SharedPreferences对象之后,就可以开始存储数据了,主要可以分为3步实现。

(1) 调用SharedPreferences对象的edit()方法获取一个SharedPreferences.Editor对象。

(2) 向SharedPreferences.Editor对象中添加数据,比如添加一个布尔型数据就使用putBoolean()方法,添加一个字符串则使用putString()方法,以此类推。

(3) 调用apply()方法将添加的数据提交,从而完成数据存储操作。

 3. 项目示例

      新建一个SharedPreferencesTest项目,然后修改activity_main.xml中的代码,简单地放置了一个按钮,用于将一些数据存储到SharedPreferences文件当中,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/saveButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Save Data"
        />

</LinearLayout>

       然后修改MainActivity中的代码,如下所示:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        saveButton.setOnClickListener {
            val editor = getSharedPreferences("data", Context.MODE_PRIVATE).edit()
            editor.putString("name", "Tom")
            editor.putInt("age", 28)
            editor.putBoolean("married", false)
            editor.apply()
        }
    }

}

可以看到,这里首先给按钮注册了一个点击事件,然后在点击事件中通过getSharedPreferences()方法指定SharedPreferences的文件名为data,并得到了SharedPreferences.Editor对象。接着向这个对象中添加了3条不同类型的数据,最后调用apply()方法进行提交,从而完成了数据存储的操作 .

 (3)从SharedPreferences中读取数据

  SharedPreferences对象中提供了一系列的get方法,用于读取存储的数据,每种get方法都对应了SharedPreferences.Editor中的一种put方法,比如读取一个布尔型数据就使用getBoolean()方法,读取一个字符串就使用getString()方法。

     这些get方法都接收两个参数:

     第一个参数是键,传入存储数据时使用的键就可以得到相应的值了;

     第二个参数是默认值,当传入的键找不到对应的值时会以默认值进行返回。

在SharedPreferencesTest项目的基础上继续开发,修改activity_main.xml中的代码,增加了一个还原数据的按钮,我们希望通过点击这个按钮来从SharedPreferences文件中读取数据,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/saveButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Save Data"
        />

    <Button
        android:id="@+id/restoreButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Restore Data"
        />

</LinearLayout>

 修改MainActivity中的代码,在还原数据按钮的点击事件中首先通过getSharedPreferences()方法得到了SharedPreferences对象,然后分别调用它的getString()、getInt()和getBoolean()方法,去获取前面所存储的姓名、年龄和是否已婚,如果没有找到相应的值,就会使用方法中传入的默认值来代替,最后通过Log将这些值打印出来。如下所示:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        ...
        restoreButton.setOnClickListener {
            val prefs = getSharedPreferences("data", Context.MODE_PRIVATE)
            val name = prefs.getString("name", "")
            val age = prefs.getInt("age", 0)
            val married = prefs.getBoolean("married", false)
            Log.d("MainActivity", "name is $name")
            Log.d("MainActivity", "age is $age")
            Log.d("MainActivity", "married is $married")
        }
    }

}

  

五. MMKV概述

 1. MMKV——基于 mmap 的高性能通用 key-value 组件

       MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今在微信上使用,其性能和稳定性经过了时间的验证。

       GitHub地址:https://github.com/Tencent/MMKV

 2. MMKV 原理

 (1)内存准备:通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。

 (2)数据组织:数据序列化方面我们选用 protobuf 协议,pb 在性能和空间占用上都有不错的表现。

  (3)写入优化:考虑到主要使用场景是频繁地进行写入更新,我们需要有增量更新的能力。我们考虑将增量 kv 对象序列化后,append 到内存末尾。

  (4)空间增长:使用 append 实现增量更新带来了一个新的问题,就是不断 append 的话,文件大小会增长得不可控。我们需要在性能和空间上做个折中。

六. MMKV在Android中的使用

 1. 添加依赖

​dependencies {
    implementation 'com.tencent:mmkv-static:1.2.2''
}

2. 初始化

 MMKV 的使用非常简单,所有变更立马生效,无需调用 sync、apply。

在 App 启动时初始化 MMKV,设定 MMKV 的根目录(files/mmkv/),例如

public class MyApp extends Application {
    private static final String TAG = MyApp.class.getSimpleName();
    @Override
    public void onCreate() {
        super.onCreate();
        String rootDir = MMKV.initialize(this);
        Log.i(TAG,"mmkv root: " + rootDir);
    }
}

 3. 支持的数据类型

  •  支持以下Java语言基础类型:

      boolean、int、long、float、double、byte[]。

  •  支持以下Java类和容器:

     String、Set<String>、任何实现了Parcelable的类型。

 4. CRUD操作

   (1)存储与读取数据

1.MMKV会提供一个全局实例,可以直接使用

2.存储数据采用键值对的方法进行存储,使用数据相应的encode()方法

3.读取数据采用decode()方法,传入键作为参数,读取Int类型就用decodeInt(),以此类推

import com.tencent.mmkv.MMKV;
...
MMKV kv = MMKV.defaultMMKV();
 
kv.encode("bool", true);
System.out.println("bool: " + kv.decodeBool("bool"));
 
kv.encode("int", Integer.MIN_VALUE);
System.out.println("int: " + kv.decodeInt("int"));
 
kv.encode("long", Long.MAX_VALUE);
System.out.println("long: " + kv.decodeLong("long"));
 
kv.encode("float", -3.14f);
System.out.println("float: " + kv.decodeFloat("float"));
 
kv.encode("double", Double.MIN_VALUE);
System.out.println("double: " + kv.decodeDouble("double"));
 
kv.encode("string", "Hello from mmkv");
System.out.println("string: " + kv.decodeString("string"));
 
byte[] bytes = {'m', 'm', 'k', 'v'};
kv.encode("bytes", bytes);
System.out.println("bytes: " + new String(kv.decodeBytes("bytes")));

   (2)删除与查询

  • removeValueForKey()方法移除指定的key
  • removeValueForKeys()方法移除一组key
MMKV kv = MMKV.defaultMMKV();
 
// 移除指定的key
kv.removeValueForKey("bool");
System.out.println("bool: " + kv.decodeBool("bool"));
    
// 移除一组key
kv.removeValuesForKeys(new String[]{"int", "long"});
System.out.println("allKeys: " + Arrays.toString(kv.allKeys()));
 
boolean hasBool = kv.containsKey("bool");

   (3)不同业务需要区别存储时

// 单独创建自己的实例
MMKV mmkv = MMKV.mmkvWithID("MyID");
mmkv.encode("bool", true);

   (4)业务需要多进程访问时     

// 在初始化的时候加上标志位 MMKV.MULTI_PROCESS_MODE
MMKV mmkv = MMKV.mmkvWithID("InterProcessKV", MMKV.MULTI_PROCESS_MODE);
mmkv.encode("bool", true);

   5. SharedPreferences 迁移

  • MMKV 提供了 importFromSharedPreferences() 函数,可以比较方便地迁移数据过来。
  • MMKV 还额外实现了一遍 SharedPreferences、SharedPreferences.Editor 这两个 interface,在迁移的时候只需两三行代码即可,其他 CRUD 操作代码都不用改。
    private void testImportSharedPreferences() {
        //SharedPreferences preferences = getSharedPreferences("myData", MODE_PRIVATE);
        MMKV preferences = MMKV.mmkvWithID("myData");
        // 迁移旧数据
        {
            SharedPreferences old_man = getSharedPreferences("myData", MODE_PRIVATE);
            preferences.importFromSharedPreferences(old_man);
            old_man.edit().clear().commit();
        }
        // 跟以前用法一样
        SharedPreferences.Editor editor = preferences.edit();
        editor.putBoolean("bool", true);
        editor.putInt("int", Integer.MIN_VALUE);
        editor.putLong("long", Long.MAX_VALUE);
        editor.putFloat("float", -3.14f);
        editor.putString("string", "hello, imported");
        HashSet<String> set = new HashSet<String>();
        set.add("W"); set.add("e"); set.add("C"); set.add("h"); set.add("a"); set.add("t");
        editor.putStringSet("string-set", set);
        // 无需调用 commit()
        //editor.commit();
    }

【5年Android从零复盘系列之三十四】Android存储(9):腾讯MMKV 高性能键值存储组件详解 【5年Android从零复盘系列之三十四】Android存储(9):腾讯MMKV 高性能键值存储组件详解 【代码是最好得老师】 1.概要 Github 官方文档 Demo.zip MMKV 是基于 mmap 内存映射的 key-value 组件 性能高,稳定性强(底层序列化/反序列化使用 protobuf 实现) 支持加密 支持多进程共享 支持匿名内存,内存悬浮不落地文件,安全性极高 效率极高 支持SharedPreferences直接迁移 支持类型:boolean、int、long、float、dou 阅读详情

相关推荐

Android MMKV 接入+ 替换原生 SP + 原生 SP 数据迁移

背景:项目中一直使用的是原生 SP,众所周知,使用原生 SP 存在卡顿性能问题。因此,替换原生 SP 迫在眉睫。本文记录如何使用腾讯开源框架 MMKV 替换原生 SP、以及替换后当中遇到的一些问题解决。

xiaobaaidaba123的专栏 1884

MMKV-Android中的存储框架

一.SharedPreferences 1.先讲一下SharedPreferences,通过key/value (键值对)的形式将数据保存在XML文件中,但是有些不能跨进程等问题。所以我们这里就不使用他了,使用mmkv来存储,所有我们后面着重介绍一下mmkv。 二.mmkv 1.mmkv介绍 MMKV 分别代表的是 Memory Mapping Key Value(内存映射键值),是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性

qq_42759120的博客 8630

MCP4728 电路及stm32F103程序移植

写在前面 通过优快云查到一些MCP4728 的程序,结合程序及datasheet对于驱动的描述,理清了思路 感谢开路者! MCP4728的电路比较简单,见下文描述 应用电路 datasheet: 实际测试电路: SCL接stm32的PB10,SDA接PB11 RDY/BSY引脚和LDCA引脚,悬空 解释见截图: MCP4728地址 选择任意输出通道写入DAC输入寄存器 应用程序 int mcp4728_write_all_channel(float vol1, float vol2, fl

u013074298的专栏 5427

安卓:MMKV——键值存储库

MMKV是一种用于安卓平台的轻量级键值存储库,它提供了一种高效、可靠的方式来在应用程序中存储和读取数据。

A125679880的博客 5853

Ansys Zemax实战:5步搞定衍射光学元件(DOE)设计,附赠超透镜(metalens)避坑指南

本文详细介绍了使用Ansys Zemax进行衍射光学元件(DOE)和超透镜(metalens)设计的5步实战流程。从基础光学系统搭建到相位面设计验证,再到制造准备与实测对比,全面解析了OpticStudio中的关键技巧和常见避坑指南,帮助工程师高效完成复杂光学元件设计。

orange的博客 622

手把手教你用示波器测试DDR5 DRAM信号完整性(附眼图分析技巧)

本文详细介绍了如何使用示波器测试DDR5 DRAM信号完整性,包括眼图分析技巧。从DDR5的核心挑战、测试设备选型到实测工作流程,提供了全面的指导。特别强调了DFE功能验证和系统级协同测试,帮助工程师解决信号完整性问题,提升测试效率。

g2h3i4j5的博客 1155

android学习笔记(四) 数据存储技术(上)

Android系统提供了多种数据存储方法。例如,使用SharedPreferences进行简单存储、文件存储、SQLite数据库存储等。本节主要介绍使用SharedPreferences进行简单存储和文件存储。主要分为以下几部分内容: 1、测试SharedPreferences存储_保存和读取 2、测试手机内部文件存储_保存和读取 3、测试手机外部文件存储_保存和读取 一、测试Shared...

qq_39903502的博客 505

一文速学数模-K-means聚类算法实战:信用卡用户画像聚类分析

该项目算是非常经典的金融业务用户画像的基础分析了,主要根据用户信用卡使用行为数据进行分析,根据收集到的不同字段信息,对每个用户划分类别。这里需要说明一下的是,聚类模型只是将具有相似行为的大部分用户聚集到一个类别里面,这点并不会考虑到每个字段的含义,也就是分成的类别并不是用户价值等级,此类别仅仅是这个类别大体相同的信用卡用户行为对象,并不能给每个用户价值打上标签,那是评价模型做的事,这里要注意不要搞混淆了,用户价值评价是评价模型决定的,而画像是聚类模型分析的。

master_hunter的博客 1万+

Android学习笔记(四)——Dialog和 数据存储(一)

Dialog组件 在Activity中用户可以主动调用的函数是:   showDialog(int id),负责显示标识为id的Dialog,函数如果被调用, 会触发onCreateDialog(int id)   dismissDialog(int id),使对应Dialog在界面中消失 Dialog有两个常见的...

weixin_30254435的博客 277

【零基础入门unity游戏开发——unity通用篇14】unity特性相关的知识(基于unity6开发介绍)

unity特性相关的知识(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1204

第五节_PySide6基本窗口控件_主窗口和标签

本文介绍了PySide6中主窗口和标签控件的使用。主要内容包括: 窗口控件分类: QWidget是基础窗口部件,可作为独立窗口或子部件 QMainWindow提供标准应用程序框架,包含菜单栏、工具栏等 QDialog用于对话框,支持模态交互 主窗口创建: 演示了如何创建QMainWindow子类 实现了窗口居中、设置图标、状态栏等功能 提供了窗口几何信息的获取方法 QLabel标签控件: 继承自QFrame类 用于显示文本或图像 文章通过代码示例详细说明了主窗口的创建和使用方法,包括位置控制、图标设置等常见

su桥木的博客 1022

Android第一行代码学习笔记四----数据存储

Android主要提供三种方式简单存储数据,即文件存储、SharedPreference 存储以及数据库存储。并且这三种存储方式比存储在SD卡中更安全。 文件存储 文件存储直接将数据保存到文件中,适用于简单的文本数据或二进制数据。 存储数据 Context 类中提供 openFileOutput ()方法,该方法接收两个参数,第一个参数是文件名,默认存储到/data/data//files

九天 538

SAP Single Sign-On 全景指南:从传统 SAP SSO 到 SAP Secure Login Service for SAP GUI 的架构、场景与迁移实践

本文系统梳理了SAP生态下的单点登录技术方案,重点分析了SAP GUI的云化替代方案SAP Secure Login Service(SLS)。内容涵盖SNC、Kerberos/SPNEGO、SAML 2.0等核心协议的技术实现,对比了传统SAP SSO与新型SLS for SAP GUI的架构差异,并给出AS ABAP系统的具体实施路径。针对SAP GUI访问、浏览器访问Fiori/移动端等不同场景,提供了详细的协议选型建议和配置指南,帮助团队构建安全可靠且适应云时代的统一认证体系。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 273

基于Android studio学习安卓之数据存储

在移动应用开发中,数据存储是一个非常重要且必不可少的技术。无论是保存用户的信息、记录应用的状态,还是缓存网络请求的数据,数据存储都是必须处理的需求。而在安卓开发中,我们有许多选项可以选择来进行数据存储。下面我们介绍几种安卓的常见的数据存储方式,包括Shared Preferences、数据库存储等。在Android中,SharedPreferences是一种轻量级的存储机制,用于存储和检索键值对数据。它提供了一种简单的方法来保存应用程序的持久化数据,包括用户首选项、设置信息、应用程序状态等。

qq_30665153的博客 3590

使用OpenCV从低对比度图像中提取圆形轮廓

希望本文能帮助您从低对比度图像中提取圆形轮在本文中,我们将探讨如何使用OpenCV库从低对比度图像中提取圆形轮廓。低对比度图像通常指的是图像中的亮度差异很小,导致物体边缘不够清晰的情况。在本文中,我们将探讨如何使用OpenCV库从低对比度图像中提取圆形轮廓。低对比度图像通常指的是图像中的亮度差异很小,导致物体边缘不够清晰的情况。通过预处理图像并应用Hough变换,我们能够在低对比度图像中准确地提取圆形轮廓。通过预处理图像并应用Hough变换,我们能够在低对比度图像中准确地提取圆形轮廓。

ByteWhiz的博客 350

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

安卓学习笔记-数据存储

本文是《安卓学习笔记-声明式UI》的续篇,重点探讨数据存储层与业务逻辑层的解耦。

wy53111的博客 977

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android安卓——数据存储之数据库存储

在安卓开发中,对于用户端数据的存储常使用SQLite数据库。 使用SQLite数据库进行数据的增删查改操作。后面附有代码 一、SQLite数据库1、SQLite数据库简介(1)、SQLite数据库是一个开源的嵌入式关系数据库。(2)、特点: 更加适用于嵌入式系统,嵌入到使用它的应用程序中去。 占用非常少的内存,运行高效可靠,可移植性好。

Deniece_X的博客 4468

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

(六) 安卓数据存储使用

在安卓应用开发中,数据存储是实现应用功能的重要部分。合理选择和实现数据存储方式,可以提升应用的性能和用户体验。本文将介绍安卓开发中常用的数据存储方法、适用场景、实现方式以及一些实践示例,帮助你全面掌握安卓数据存储技术。掌握安卓数据存储技术是开发高效应用的关键。通过本文的介绍和实践示例,希望你对安卓数据存储方法有一个全面的了解,并在实际开发中灵活应用。持续学习和实践是掌握数据存储技术的关键,祝你在安卓开发的道路上取得成功!

小新的博客 1104

【安卓基础6】数据存储

一、共享参数SharedPreferences、共享参数的使用场景、特点、共享参数的用法、二、数据库SQLite、SQLite基本语法、数据库帮助器SQLiteOpenHelper、创建数据库帮助器类、使用数据库帮助器获取数据库实例、数据库版本管理、数据库管理器SQLiteDatabase、获取SQLiteDatabase实例、执行SQL语句、插入数据、查询数据、更新数据、删除数据、事务处理、关闭数据库连接、操作数据库方式-总结、三、存储卡的文件操作、外部存储控件、在存储卡上读写图片文件、四、应用组件App

丨康有为丨的博客 1460

Android常见数据存储方式

学习中

m0_64346512的博客 3038

安卓学习笔记——数据存储之SharedPreference

Android提供了四种数据存储的方式 SharedPreference:一种常用的数据存储方式,其本质是基于XML文件存储键值对数据,通常用来存储一些简单的配置信息。 SQLite:一个轻量级数据库,支持基本SQL语法,是Android系统中常被采用的一种数据存储方式。 ContentProvider:Android系统中能实现应用程序之间数据共享的一种存储方式。 文件:即常说的文件存储方法,常用于存储数据量比较大的数据,但缺点是更新数据困难。 SharedPreference: 1、SharedPr

fuzhijieabc的博客 2100

安卓app开发系列之-数据存储方式概述

在Android开发中,数据存储是非常重要的一部分,因为应用常常需要保存用户数据、偏好设置、应用状态等信息。根据不同的数据量、访问频率和数据结构,Android提供了多种数据存储方式。本文将详细介绍这些存储方式的特点、使用场景及示例代码,帮助开发者选择合适的存储解决方案。在Android开发中,数据存储的选择依赖于应用需求和数据类型。本文介绍了多种数据存储方式,包括、内部存储、外部存储、SQLite数据库及网络数据存储。每种方式都有其优缺点和适合场景。

Jamson 1521

探索 LeanStorageDemo-Android:一款强大的安卓数据存储解决方案

探索 LeanStorageDemo-Android:一款强大的安卓数据存储解决方案 在快速发展的移动应用领域,高效、可靠的数据管理是应用程序成功的关键因素之一。今天我们要介绍的是 LeanStorageDemo-Android,一个由 LeanCloud 开发的安卓示例应用,它展示了如何利用 LeanCloud 的 LeanStorage 服务进行数据存储和检索。这款项目不仅提供了清晰的代码示例...

gitblog_00040的博客 651

Android数据存储五大方式

在 Android 开发中,数据存储是一个非常重要的部分,用于保存应用的各种数据,如用户信息、配置文件、图片、视频等。根据数据的类型和使用场景,Android 提供了多种数据存储方式。以下是 Android 中常见的五种数据存储方式的详细介绍。SharedPreferences 是 Android 提供的一种轻量级的数据存储方式,适合存储简单的键值对数据(Key-Value),通常用于保存配置信息、用户偏好等。

2501_90212852的博客 2811

【Android】开局一行码,数据自己填(浅析安卓数据存储)

对于Android开发者而言,掌握数据存储技术是构建强大应用的必备技能。Android提供了多种数据存储方案来满足不同的需求。本篇博客,我们将探讨Android中两种核心的数据存储技术:SharedPreferences和SQLite数据库。在Android开发中,对于轻量级数据的存储,SharedPreferences无疑是一个简单而强大的工具。它允许开发者以键值对的形式存储和检索数据,非常适合用于存储应用配置、用户偏好设置等。

2301_79344902的博客 1178

android将数据存储在哪简书,Android学习笔记——(数据存储)

Android系统主要提供了3中方式去存储数据。主要分为:文件存储、SharePreferences存储、SQLite数据库。1.文件存储文件存储是 Android 中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中,因而它比较适合用于存储一些简单的文本数据或二进制数据。1.1存储数据到文件中Context 类中提供 openFileOutput...

weixin_42306002的博客 1189
上一篇: 安卓学习笔记(三)
一抹雨影
博客等级 码龄5年 82粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值