Android开发基础(四)

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.mzph.cn/news/616719.shtml

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

相关文章

U盘启动安装win11遇到缺少计算机所需的介质驱动程序问题

一、使用U盘制作启动盘遇到问题 下载了windows原版镜像,验证了md5,确保文件没有损坏。使用ultroiso制作u盘启动盘,开始安装后出现下图的报错: 在网上搜索解决方案,主要有以下几种: 安装的时候&#xff0c…

MySQL 8.0 InnoDB Tablespaces之Temporary Tablespaces(临时表空间)

文章目录 MySQL 8.0 InnoDB Tablespaces之Temporary Tablespaces(临时表空间)会话临时表空间会话临时表空间的磁盘分配和回收会话临时表空间的创建创建临时表和查看临时表信息会话临时表空间相关的设置参数innodb_temp_tablespaces_dir 全局临时表空间查…

leetcode 每日一题 2024年01月09日 字符串中的额外字符

题目 字符串中的额外字符 给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串,每个子字符串都在 dictionary 中出现过。s 中可能会有一些 额外的字符 不在任何子字符串中。 请你采取最优策略分割 s &…

Tensorflow2.0笔记 - 修改形状和维度

本次笔记主要使用reshape,transpose,expand_dim,和squeeze对tensor的形状和维度进行操作。 import tensorflow as tf import numpy as nptf.__version__#tensor的shape和维数获取 #假设下面这个tensor表示4张28*28*3的图片 tensor tf.rando…

延时任务的解决方案

延时任务的解决方案 1.数据库轮询2. JDK的延迟队列3.netty时间轮算法4.使用消息队列 1.数据库轮询 该方案通常是在小型项目中使用,即通过一个线程定时的去扫描数据库,通过订单时间来判断是否有超时的订单,然后进行update或delete等操作 代码示…

C++核心编程——类和对象(二)

本专栏记录C学习过程包括C基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下,不定时更新,欢迎关注。 当前章节处于: ---------第1阶段-C基础入门 ---------第2阶段实战…

[ctf.show 元旦水友赛 2024] crypto

感觉半个多月回家没有打开过电脑了。看到ctf.show上元旦的比赛,才想起似乎应该看看。 月月的爱情故事 上来这就是个小脑洞题,给了一大段文字和一个base64的串。并且提示:试试摩斯吧! 从文字上看只有三种标点符号,显…

基于汽车胎压检测及温度预警

课题简介 汽车胎压监测系统可分为两种:一种是间接式胎压监测系统,是通过轮胎的转速差来判断轮胎是否异常;另一种是直接式胎压监测系统,通过在轮胎里面加装四个胎压监测传感器,在汽车静止或者行驶过程中对轮胎气压和温…

SwiftUI之深入解析布局协议

一、什么是布局协议? 采用布局协议类型的任务,是告诉 SwiftUI 如何放置一组视图,需要多少空间。这类型常常被作为视图容器,虽然布局协议是 2022 年新推出的(至少公开来说),但是我们在第一天使用…

线性代数:由矩阵 AB=A 可以推出 B=E 吗?

其实,类似的问题在十几年前的各种提问中就出现了,而且,根据 A B A A BA ABA 推出 B E BE BE 有时候也相当 "符合直觉”,但如果追根问底,矩阵 B B B 到底应该是什么样子的,却很少有详细的解答。 …

Docker的介绍及安装基本操作命令

前言 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱…

Hive 数据同步

一、需求 同步集团的数据到断直连环境。 二、思路 三、同步数据(方案) 1、环境:断直连模拟环境 2、操作机器:ETL 机器 XX.14.36.216 3、工作路径:cd /usr/local/fqlhadoop/hadoop/bin 4、执行命令: 命令…

H264码流进行RTP包封装

一.H264基本概念 H.264从框架结构上分为视频编码层(VCL)和网络抽象层(NAL),VCL功能是进行视频编解码,包括运动补偿预测,变换编码和熵编码等功能;NAL用于采用适当的格式对VCL视频数据…

springboot实现文件上传与下载的通用思路模板流程

文件上传 需要将参数设置成为MultipartFile类型 或者我们可以使用spring提供的一个文件内置工具类 FileCopyUtils.copy(InputStream in…

线性方程组计算

一、题型 1)给一个线性方程组,问:唯一解?无解?无穷多解? 2)在上面的基础上,给一个未知数λ,问:当λ为几时,方程组唯一解?无解&#…

STM32F103RCT6开发板M3单片机教程07-TIMER1CH1输出 PWM做LED呼吸灯

概述 本教程使用是(光明谷SUN_STM32mini开发板) 免费开发板 在谷动谷力社区注册用户,打卡,发帖求助都可以获取积分,当然最主要是发原创应用文档奖励更多积分. (可用积分换取,真的不用钱&…

2D绘图--视口窗口setViewport setWindow

目录 1 setViewport setWindow 2 示例 3 实际应用(个人理解) 4 总结 1 setViewport setWindow 在Qt中,QPainter的setViewport()方法用于定义绘图区域在窗口坐标系中的可视部分。 QPainter::setWindow() 是 Qt 库中 QPainter 类的一个方法…

数据库创建表并插入数据练习题

一、创建表的要求 创建一个英雄表(hero) 主键 name nickname address groups email telphone 二、 操作步骤 1.登录MySQL [rootlocalhost ~]# systemctl start mysqld [rootlocalhost ~]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with…

NAND系统性能提升常见方案

随着NAND的发展,针对NAND系统性能提升,业内目前主要的做法有以下几种方案: 1.提升总线频率和优化AC时序: 提高NAND闪存接口的工作频率可以显著加快数据传输速度。通过不断改进工艺和技术,缩短了信号稳定时间、降低了延…

工程师职称申报业绩是如何要求的?

无论是初级职称还是中级职称或是高级职称,评审的重要条件之一就是相关的业绩证明。 一、个人业绩,比如你做过哪些与本专业相关的业绩证明,像工程类的职称,你的业绩证明就包括中标通知书、竣工验收报告,或是你参与工程建…