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,一经查实,立即删除!

相关文章

C++_多态(函数指针)

多态 介绍虚函数覆盖(重写)多态源码运行结果 笔记扩充(函数指针源码) 介绍 本文主要介绍 多态这个概念 (PS:多态只是一种概念形式) 虚函数 1.成员函数前 加上关键词 virtual ,该函数称为虚函数 (PS:static函数除外) 2.虚函数 按照实际 函数类型调用 (PS:如果基类中 …

vite+vue3创建项目及开发常见的问题

创建项目 1、npm create vitelatest 下一步,选vue 下一步,选typescript 成功; 2、进入项目,npm install 手动安装vue和vite相关的依赖包; 3、npm run dev 运行项目 常见问题 1、dev run dev 运行项目时,…

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…

【我的RUST库】get_local_info 0.2.1发布

get_local_info是一个获取linux本地信息的Rust三方库,其目标是降低获取本地linux系统信息的难度。支持银河麒麟10、UOS、鸿蒙等国产系统。 项目维护:长期 当前功能: 1.网络功能 1.1.获取网络接口信息 1.2 获取活动网卡信息:网…

延时任务的解决方案

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

面试题-回溯算法解法模板

常见的回溯算法面试题 电话号码的字母组合 组合 全排列 组合总和 回溯算法解题模板 对于用回溯解决的题目,代码大部分可以用下面的模板来套: void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素&…

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

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

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

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

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

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

SwiftUI之深入解析布局协议

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

国内外十大语言模型横向对比测评(截至2023.12.8)

主要参考资料: B站Up主贯一智能科技《国内外十大语言模型之横向对比测评》 现在有非常多的开源测试数据集,比如MMLU、AGIEval、CEval 但是根据Up主描述比较费时成本高,其次这类标准化评测更多考察模型在各个学科和领域的综合表现,…

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

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

QML使用QCustomPlot笔记

这里在QML中使用QCustomPlot是定义一个继承自QQuickPaintedItem的类,它包含一个QCustomPlot对象,在paint函数中将这个对象转化为pixmap绘制到布局中显示。 在QML中使用QT的Widget控件也可以借鉴这个思路实现 顺便记录一下QCustomPlot的简单设置与使用。…

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

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

C中分支和循环语句相关练习题

目录 (1)编写程序数一下1-100的所有整数中出现多少个数字9 (2)计算1/1-1/21/3-1/4......1/99-1/100的值,打印结果 (3)求十个整数中的最大值 (4)在屏幕上输出九九乘法口诀表 (5)二分查找元素 …

超声波模块驱动代码(CS100A芯片)

CS100A.c #include "CS100A.h"TIM_HandleTypeDef TimHandle;uint16_t CS100A_count0; //定时器中断中累加计数 float CS100A_distance0; //计算超声波测得的距离,单位为cm float err15/15.98; //调整误差系数,由于各种原因会出…

Hive 数据同步

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