Android基础学习(十八)—— 数据存储

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

数据持久化:将内存中的瞬时数据保存到存储设备中

Android系统中主要提供了3种方式用于简单地实现数据持久化功能:

  • 文件存储。对应的目录是:/data/data/<包名>/files/*
  • SharedPreferences存储。对应的目录是:/data/data/<包名>/shared_prefs
  • 数据库存储。对应的目录是:/data/data//<包名>/database

一、文件存储

适合用于存储一些简单的文本数据或二进制数据

1、将数据存储到文件中
Context.openFileOutput(文件名, 操作模式)

参数:

(1)文件名

不可以包含路径,默认存储到 /data/data/<包名>/files/ 目录下

(2)操作模式

1)MODE_PRIVATE

默认的模式。当指定同样的文件名时,所写入的内容将会覆盖原文件中的内容

2)MODE_APPEND

表示如果该文件已存在,就往文件里面追加内容,不存在就创建新文件。

返回值:

FileOutputStream对象

代码示例:

public void save(){
    String data = "Data to save";  //要进行文件存储的数据
    FileOutputStream out = null;
    BufferedWriter writer = null;
    try{
        out = openFileOutput("data", Context.MODE_PRIVATE);
        writer = new BufferedWriter(new OutputStreamWriter(out));
        writer.write(data);
    }catch(IOException e){
        e.printStackTrace();
    }finally{
        try{
            if(writer != null){
                writer.close();
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}
2、从文件中读取数据
Context.openFileInput(要读取的文件名)

系统会自动到 /data/data/<包名>/files/目录下去加载这个文件,并返回一个FileInputStream对象

public String load(){
    FileInputStream in = null;
    BufferedReader reader = null;
    StringBuilder content = new StringBuilder();
    try{
        in = openFileInput("data");
        reader = new BufferedReader(new InputStreamReader(in));
        String line = "";
        while((line = reader.readLine()) != null){
            content.append(line);
        }
    }catch(IOException e){
        e.printStackTrace();
    }finally{
        if(reader != null){
            try{
                reader.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
    return content.toString();
}

二、SharedPreferences存储

   SharedPreferences基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息,其存储位置在“/data/data/<包名>/shared_prefs”目录下。

   SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现的。

1、使用SP存取数据

(1)存储数据:

示例代码:

SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.putString("name","Tom");
editor.putInt("age",28);
editor.putBoolean("married", false);
editor.commit();

其中,获取SP对象有三种方式

①Context类中的getSharedPreferences()方法

Context.getSharedPreferences(文件名, 操作模式)

文件名:如果文件不存在则会创建一个,将指定的文件存放在“/data/data/<包名>/shared_prefs”目录下

操作模式:目前只有MODE_PRIVATE这一种模式,是默认的操作模式,表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写

②Activity类中的getPreferences()方法

Activity.getPreferences(操作模式)

类似于Context.getSharedPreferences方法,但此方法自动将当前活动的类名作为SP的文件名。

③PreferenceManager类中的getDefaultSharedPreferences()方法

PreferenceManager.getDefaultSharedPreferences(Context)

静态方法。

自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件。

(2)读取数据

示例代码:

SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);
String name = pref.getString("name", "默认值");
int age = preg.getInt("age", 0);
boolean married = pref.getBoolean("married", false);

(3)删除指定数据

示例代码:

SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.remove("name");
editor.commit();

(4)清空数据

示例代码:

SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.clear();
editor.commit();
2、关于SP的一些注意事项

(1)SP加载的主要过程
在这里插入图片描述

SP加载的主要过程:

1)找到对应name的文件

2)加载对应文件到内存中的SP

3)一个xml文件对应一个SP单例

(2)提交数据时的commit()方法和apply()方法

提交数据时有commit和apply两种方式:

1)apply没有返回值而commit返回boolean表明修改是否提交成功 ;

2)commit是把内容同步提交到硬盘的,而apply先立即把修改提交到内存,然后开启一个异步的线程提交到硬盘,并且如果提交失败,你不会收到任何通知。

3)所有commit提交是同步过程,效率会比apply异步提交的速度慢,在不关心提交结果是否成功的情况下,优先考虑apply方法。

4)apply是使用异步线程写入磁盘,commit是同步写入磁盘。所以我们在主线程使用的commit的时候,需要考虑是否会出现ANR问题。(不适合大量数据存储)

(3)Sharedpreferences只适合做轻量级存储的原因

1)我们在初始化SharedPreferencesImpl对象时会将SharedPreferencesImpl对应的xml文件中的所有数据都加载到内存中,如果xml文件很大,将会占用大量的内存,我们只想读取xml文件中某个key的值,但我们获取它的时候是会加载整个文件。

2)在UI线程中调用getXXX可能会导致ANR。

3)每添加一个键值对,都会重新写入整个文件的数据,不是增量写入。

(4)Sharedpreferences支持的数据类型

只能存储boolean,int,float,long和String五种简单的数据类型

三、SQLite

1、简介

关系型数据库

嵌入式的数据库(嵌入在Android系统中)

用于嵌入式设备:手表、手机

2、SQLite数据库的使用

Android SQlite数据库使用详解

3、SQLite支持的数据类型

SQLite的数据类型

SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本) 和 BLOB(二进制对象)这五种数据类型,

虽然它支持的类型只有五种,但实际上 sqlite3 也接受 varchar(n)、char(n)、decimal(p, s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 新闻app是一款基于Android平台的小型项目应用程序,它主要用于展示各类新闻内容,为用户提供便捷的阅读体验。该项目的源码包含了应用程序的基本框架和功能实现,方便开发者进行二次开发和定制。 新闻app的源码主要包含以下几个方面的内容: 1. 用户界面设计:源码中包含了新闻app的界面布局和样式,开发者可以根据自己的需要进行修改和美化。用户界面通常包括新闻列表、新闻详情页、分类标签等,开发者可以自由设计并添加其他功能模块。 2. 数据获取与展示:源码中实现了与服务器进行数据交互的功能,通过网络请求获取新闻数据,并在界面上展示出来。开发者可以根据需要修改数据请求接口和解析方式,实现与自己的服务器交互。 3. 新闻分类与搜索:源码中提供了新闻分类和搜索功能的实现,用户可以根据自己的兴趣和需求选择不同的新闻分类进行浏览,也可以通过搜索关键词进行精确定位。 4. 用户交互与分享:源码中包含了用户的登录注册功能和新闻内容的分享功能,用户可以通过登录账号进行个性化设置和收藏喜欢的新闻内容,也可以将新闻分享到社交媒体上与他人交流。 总之,新闻app源码是一个基础框架,开发者可以在此基础上进行二次开发和定制,根据自己的需求添加功能模块和美化界面,实现自己独特的新闻应用。 ### 回答2: Android新闻App是一个基于Android平台开发的小型项目,它的主要功能是提供最新的新闻内容给用户,并且用户可以进行浏览、搜索和分享等操作。下面是这个项目的一些关键特点和所需的源码组成部分: 1. 特点: - 用户界面友好,交互性强,提供舒适的浏览体验; - 支持实时更新,提供最新的新闻内容; - 具备搜索功能,方便用户查找感兴趣的新闻; - 支持新闻分享功能,方便用户将新闻分享给朋友; - 具备图文混排的能力,可以展示新闻的文字和图片。 2. 源码组成部分: - 主界面布局代码:定义了App的整体布局结构,包括顶部导航栏、底部工具栏和新闻显示区域等。 - 数据源代码:负责获取新闻数据,可以通过API接口获取最新的新闻内容,也可以从本地数据库获取已缓存的新闻数据。 - 新闻列表适配器代码:用于将新闻数据展示在界面上,包括标题、描述和图片等。 - 新闻详情界面代码:用于显示单篇新闻的详细内容,包括标题、正文和相关图片等。 - 搜索功能代码:实现了按关键字搜索新闻的功能,可以在已有的新闻数据中进行筛选。 - 分享功能代码:集成了社交媒体的分享SDK,方便用户将新闻内容分享给朋友。 - 图片加载和缓存代码:处理了新闻中的图片加载和本地缓存,提高了图片加载速度和用户体验。 通过以上的源码组成部分,可以完成一个基本的新闻App,用户可以在界面上浏览最新的新闻内容,进行搜索和分享操作。这个小项目可以帮助开发者理解Android开发框架和开发方式,提高编码能力和UI设计能力。 ### 回答3: 新闻app是基于Android平台开发的一个小型应用程序,可以提供用户各种最新的新闻资讯。以下是关于这个项目的源码介绍。 该项目源码主要由Java语言编写,使用了Android Studio作为开发工具。代码结构清晰,包含了主要的几个模块。 1. 用户界面模块:这个模块负责显示新闻列表和新闻详情等信息,主要包含布局文件和相应的逻辑代码。列表界面使用RecyclerView控件展示新闻列表,详情界面使用WebView展示新闻内容。 2. 网络请求模块:这个模块负责与后台服务器进行数据交互,使用了Android的HttpURLConnection类来发送请求和接收响应。请求参数可以根据实际需要进行修改,例如可以根据新闻类别进行请求。 3. 数据解析模块:这个模块负责解析从服务器返回的JSON格式的数据,转换成Java对象供应用程序使用。可以使用Android提供的JSON解析库,如Gson。 4. 数据存储模块:这个模块负责缓存新闻数据,以提高应用程序的响应速度。可以使用SharedPreferences或SQLite数据库来存储新闻数据。同时也可以使用图片缓存库,如Glide或Picasso来缓存新闻图片。 5. 用户交互模块:这个模块负责处理用户的交互行为,例如点击新闻列表项跳转到新闻详情界面,下拉刷新获取最新数据等。可以使用Android提供的相关控件和事件监听器来实现用户交互。 除了以上几个主要的模块,还可以根据需要添加其他功能,例如搜索栏、分享按钮等。 总体来说,这个新闻app的源码提供了一个完整的开发框架,初学者可以通过阅读和理解源码来学习Android应用程序的开发流程和一些常用技术。同时,也可以根据实际需求进行二次开发,添加新的功能和改进用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值