Android开发基础(四)

news2024/11/15 17:52:12

Android开发基础(四)
本篇将从Android数据存储方式去理解Android开发。
Android开发

Android数据存储方式

Android提供了多种数据存储方式。

一、SharedPreferences存储

主要用于存储一些简单的配置信息,如登录账号密码等;
这种存储方式采用Map数据结构,以key-value的方式存储数据,可以更方便地进行读写操作;
数据存储在设备中,采用XML格式;
以下代码是Java编写,Kotlin实际上是相同的。

// 获取SharedPreferences对象  
SharedPreferences sharedPreferences = getSharedPreferences("my_data", MODE_PRIVATE);  
  
// 写入数据  
SharedPreferences.Editor editor = sharedPreferences.edit();  
editor.putString("key1", "value1");  
editor.putInt("key2", 123);  
editor.apply();  
  
// 读取数据  
String value1 = sharedPreferences.getString("key1", null);  
int value2 = sharedPreferences.getInt("key2", 0);

二、文件存储

这是一种比较常见的方式,可以用来存储图片、视频、文本等数据;
在读取和写入文件时,与Java中的I/O程序完全一样,提供了openFileInput()和openFileOutput()方法来读取设备上的文件;
以下代码是Java编写的,Kotlin要注意空值判断,可以参考Android开发基础(二)。

// 创建文件对象  
File file = new File(context.getFilesDir(), "my_file.txt");  
  
// 写入数据  
try {  
    FileOutputStream outputStream = new FileOutputStream(file);  
    outputStream.write("Hello World".getBytes());  
    outputStream.close();  
} catch (IOException e) {  
    e.printStackTrace();  
}  
  
// 读取数据  
try {  
    FileInputStream inputStream = new FileInputStream(file);  
    InputStreamReader inputStreamReader = new InputStreamReader(inputStream);  
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
    String line;  
    while ((line = bufferedReader.readLine()) != null) {  
        Log.d("File Content", line);  
    }  
    inputStream.close();  
} catch (IOException e) {  
    e.printStackTrace();  
}

三、SQLite数据库存储

SQLite是一种轻量级的数据库,适用于移动设备;
Android系统提供了SQLite数据库引擎,开发者可以使用它来创建和管理数据库;
使用SQLite数据库可以方便地存储、检索和管理数据。

// 创建SQLite数据库  
val db = openOrCreateDatabase("my_database.db", Context.MODE_PRIVATE)  
  
// 创建表  
db.execSQL("CREATE TABLE IF NOT EXISTS my_table (id INTEGER PRIMARY KEY, name TEXT)")  
  
// 插入数据  
val insertStatement = "INSERT INTO my_table (name) VALUES (?)"  
db.beginTransaction()  
try {  
    val statement = db.compileStatement(insertStatement)  
    for (name in names) {  
        statement.bindString(1, name)  
        statement.executeInsert()  
    }  
    db.setTransactionSuccessful()  
} catch (e: Exception) {  
    e.printStackTrace()  
} finally {  
    db.endTransaction()  
}  
  
// 查询数据  
val cursor = db.query("my_table", null, null, null, null, null, "name ASC")  
while (cursor.moveToNext()) {  
    val id = cursor.getInt(cursor.getColumnIndex("id"))  
    val name = cursor.getString(cursor.getColumnIndex("name"))  
    Log.d("Data", "ID: $id, Name: $name")  
}  
cursor.close()  
  
// 删除数据  
db.delete("my_table", "name = ?", arrayOf("John"))

四、ContentProvider存储

当一个应用实例继承ContentProvider类并重写该类用于提供数据和存储数据的方法时,就可以向其他应用共享其数据;
通过ContentProvider,应用程序可以访问其他应用程序的数据或提供自己的数据供其他应用程序使用。

// 创建ContentProvider  
public class MyContentProvider extends ContentProvider {  
    private static final String AUTHORITY = "com.example.myapp.provider";  
    private static final String PATH = "my_table";  
    private static final int BASE_URI = 0;  
    private static final UriMatcher uriMatcher;  
  
    static {  
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);  
        uriMatcher.addURI(AUTHORITY, PATH, BASE_URI);  
    }  
  
    @Override  
    public boolean onCreate() {  
        return true;  
    }  
  
    @Override  
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {  
        SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();  
        queryBuilder.setTables("my_table");  
        queryBuilder.setProjectionMap(null); // 设置投影映射  
        queryBuilder.setSortOrder(sortOrder); // 设置排序方式  
        Cursor cursor = queryBuilder.query(dbHelper.getReadableDatabase(), projection, selection, selectionArgs, null, null, sortOrder);  
        return cursor;  
    }  
  
    @Override  
    public String getType(Uri uri) {  
        return null;  
    }  
  
    @Override  
    public Uri insert(Uri uri, ContentValues values) {  
        long rowId = dbHelper.getWritableDatabase().insert("my_table", null, values);  
        Uri newUri = Uri.withAppendedPath(uri, rowId + "");  
        return newUri;  
    }  
  
    @Override  
    public int delete(Uri uri, String selection, String[] selectionArgs) {  
        int count = dbHelper.getWritableDatabase().delete("my_table", selection, selectionArgs);  
        return count;  
    }  
  
    @Override  
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {  
        int count = dbHelper.getWritableDatabase().update("my_table", values, selection, selectionArgs);  
        return count;  
    }  
}

五、网络存储

通过网络接口进行数据的存储和上传等操作,适用于比较重要的事情,如科研、勘探、航空等实时采集到的数据需要马上通过网络传输到数据处理中心进行存储和处理。

import okhttp3.MediaType;  
import okhttp3.OkHttpClient;  
import okhttp3.RequestBody;  
import okhttp3.Request;  
import okhttp3.Response;  
  
public class NetworkStorageExample {  
  
    public static void main(String[] args) {  
        OkHttpClient client = new OkHttpClient();  
  
        MediaType mediaType = MediaType.parse("application/json");  
        RequestBody requestBody = RequestBody.create(mediaType, "{\"key\":\"value\"}"); // 你的JSON数据  
        Request request = new Request.Builder()  
                .url("http://example.com/api") // 你的API URL  
                .post(requestBody)  
                .build();  
  
        try {  
            Response response = client.newCall(request).execute();  
            if (response.isSuccessful()) {  
                // 请求成功处理响应  
            } else {  
                // 请求失败处理错误情况  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1378037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

类和对象---C++

类和对象目录 类和对象1.封装1.1 封装的意义1.2 struct和class区别1.3 成员属性设置为私有1.3.1 联系---判断圆和点的位置关系 2.对象的初始化和清理2.1 构造函数和析构函数2.2 构造函数的分类及调用2.2.1无参构造函数调用2.2.2有参构造函数调用2.2.2.1括号法2.2.2.2显式法2.2.…

C++学习笔记(二十八):c++ 静态库及动态库的使用

静态库的使用 库的使用会很大程度减少我们的工作,本节对c中静态库和动态库的使用进行简单的介绍。静态链接库意味着这个库会被放到可执行文件中,在生成的exe中。动态链接库是在程序运行时链接的,可以在程序运行时调用加载库函数的方法来实现&…

蚂蚁爱购--靠谱的SpringBoot项目

简介 这是一个靠谱的SpringBoot项目实战,名字叫蚂蚁爱购。从零开发项目,视频加文档,十天就能学会开发JavaWeb项目。 教程路线是:搭建环境> 安装软件> 创建项目> 添加依赖和配置> 通过表生成代码> 编写Java代码&g…

测试八年|对业务测试人员的一些思考

自从事测试工作八年多以来,经历过三个部门多条业务线,也经历过测试转型再回到测试,在此过程中对测试工作和角色的认知也逐步有些思考,想把这些思考分享给大家,希望为业务测试同学提供一些有价值的思路。 一、质量保障…

【Leetcode】2085. 统计出现过一次的公共字符串

文章目录 题目思路代码 题目 2085. 统计出现过一次的公共字符串 思路 使用两个哈希表 words1Count 和 words2Count 分别统计两个数组中每个单词的出现次数。然后遍历 words1Count 中的每个单词,如果该单词在 words1 中出现了一次,且在 words2 中也出…

如何运用自养号测评策略在Lazada、Shopee上轻松提升销售和排名

卖家们常常会为Lazada、Shopee店铺销量不佳而感到困惑。然而,仅仅感叹并不能解决问题。作为卖家,我们需要深入分析问题,并采取有效的措施来解决它们。基本功是提升销量的基石,但仅仅依靠基本功是不够的。我们需要将运营和测评结合…

Java面试题(java高级面试题)

线程池的核心线程数设置为多大比较合理? Worker线程在执行的过程中,有一部计算时间需要占用CPU,另一部分等待时间不需要占用CPU,通过量化分析,例如打日志进行统计,可以统计出整个Worker线程执行过程中这两…

【排序算法】插入排序与希尔排序,你不想知道为什么希尔比插入更快吗?

文章目录 🚀前言🚀插入排序(insertsort)✈️原理✈️代码实现(coding) 🚀总结🚀希尔排序(shellsort)✈️代码实现(coding)✈️为啥希尔…

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin(2)

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin(2) 在 https://zhangphil.blog.csdn.net/article/details/135374279 基础上,增加一个功能,当手指在上面的图片…

以报时机器人为例详细介绍tracker_store和event_broker

报时机器人源码参考[1][2],本文重点介绍当 tracker_store 类型为 SQL 时,events 表的表结构以及数据是如何生成的。以及当 event_broker 类型为 SQL 时,events 表的表结构以及数据是如何生成的。 一.报时机器人启动 [3] Rasa 对话系统启动方…

基于springboot+vue心理测试管理系统

摘要 基于Spring Boot 和 Vue 的心理测试管理系统是一个综合利用现代Web开发技术的应用程序。系统采用了Spring Boot作为后端框架,通过其简化的配置和强大的功能提供了稳健的服务器端支持。前端则使用Vue.js,一个灵活、高效的JavaScript框架,…

通义千问AI挑战赛赛后反思

个人理解: 初赛阶段主要聚焦在如何通过 SFT 提升基础模型的代码能力,需要选手基于最新开源的 Qwen 1.8 模型作为基础模型,上分的关键主要通过收集高质量的代码数据提升模型的在Python, JavaScript, Java, Go, C, Rust六种编程语言的代码生成…

档案数字化怎样快速整理资料

对于机构和组织来说,档案数字化是一个重要的信息管理和保护措施。要快速整理资料进行档案数字化,可以遵循以下步骤: 1. 准备工具和设备:确保有一台计算机、扫描仪和相关软件。 2. 分类和组织资料:先将资料分类&#xf…

c++最值查找

目录 min和max函数 min_element和max_element 例 nth_element函数 例 例题 题目描述 输入描述 输出描述 解 min和max函数 只能传入两个值或一个列表 时间复杂度为O(1),数组O(n),n为元素个数 min_element和max_element min_element(st,ed)返回地址[st,…

数据结构学习之顺序栈应用的案例(有效的括号)

实例要求: 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效; 有效字符串需满足的条件: 1、左括号必须用相同类型的右括号闭合; 2、左括号必须…

服务端性能测试——性能测试工具JMeter-L1

第一遍没学懂,后续文章会更新~ 目录: 1.JMeter介绍与安装Meter简介JMeter安装2.JMeter的运行JMeter运行、界面功能简介3.使用代理服务器录制请求录制压测脚本(一)Web端脚本录制方法4.测试计划5.线程组6.控制器7.JMeter采样器/取…

Postman接口测试工具最全实用教程

一、postman简介 1、postman的特点 postman只做http协议的接口的测试,是一种最广泛REST接口测试客户端软件。postman支持http协议的所有请求方式,包括get、post、head、put、delete等。postman支持各种额外的头部字段的添加。postman除了可以模拟普通表…

chat-plus部署指南

目录 1.下载代码 2.启动 3.测试 1.下载代码 cd /optwget https://github.com/yangjian102621/chatgpt-plus/archive/refs/tags/v3.2.4.1.tar.gz 2.启动 cd /opt/chatgpt-plus-3.2.4.1/deploydocker-compose up -d 3.测试 管理员地址xxx:8080/admin 账号密码admin/admin1…

java流程控制-给个一件三连呗!✨✨✨✨✨

接下来我们来看流程控制方面的知识 文章目录 1.Scanner类的使用1.1 使用next()进行接收1.2 nextLine()1.3 hasNext()1.4 scanner.nextInt() 2.选择结构2.1 if...else....语句2.2 if....else if....else...语句2.3 switch() case...语句 3.循环结构3.1for 循环:3.2w…