当前位置:网站首页 > 数据科学与大数据 > 正文

《第一行代码》 第六章:数据库与存储方案

一,持久化技术简介

也就是数据存储在内存中,会丢失。需要存储在存储设备中。而持久化技术,就是提供了手段,让数据再试瞬时状态和持久状态之间转换。
安卓开发提供了三种数据的持久化技术:
在这里插入图片描述

二,文件存储

文件存储不对存储内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中,因而它比较适合用于存储一些简单地文本数据。 
第一个参数是文件名,在文件创建的时候使用的就是这个名称,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data/<packagename/files/目录下的。 第二个参数是文件的操作模式,主要有两种模式可选,MODE PRIVATE和MODE APPEND。其中MODE PRIVATE是默认的操作模式,表示当指定同样文件名的时候所写入的内容将会覆盖原文件中的内容,而MODE APPEND 则表示如果该文件已存在,就往文件里面追加内容,不存在就创建新文件。 

下面的代码展示了如何将一段文本内容存储道文件中:

 public void save(String inputText) { 
    FileOutputStream out=null; BufferedWriter writer=null; try { 
    out=openFileOutput("data", Context.MODE_PRIVATE); writer=new BufferedWriter(new OutputStreamWriter(out)); writer.write(inputText); }catch(IOException e){ 
    e.printStackTrace(); }finally { 
    try { 
    if(writer!=null){ 
    writer.close(); } }catch (IOException e){ 
    e.printStackTrace(); } } } 

主要就是这三行代码:

 out=openFileOutput("data", Context.MODE_PRIVATE); writer=new BufferedWriter(new OutputStreamWriter(out)); writer.write(inputText); 

构建出writer对象,就可以writer.write(inputText);写入文件。

1,新建FilePersistenceTest项目

修改其中的activity_main.xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <EditText android:id="@+id/edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#00ff00" android:hint="请输入内容"/> </LinearLayout> 

2,修改MainActivity文件

public class MainActivity extends AppCompatActivity { 
    private EditText edit; @Override protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edit=(EditText) findViewById(R.id.edit); } @Override protected void onDestroy() { 
    super.onDestroy(); String inputText =edit.getText().toString(); save(inputText); } public void save(String inputText) { 
    FileOutputStream out=null; BufferedWriter writer=null; try { 
    //文件名字是:data,文件书写类型是覆盖 out=openFileOutput("data", Context.MODE_PRIVATE); //将文件写入的参数传入,构建出writer对象 writer=new BufferedWriter(new OutputStreamWriter(out)); //调用writerd的write方法,写入文件。 writer.write(inputText); }catch(IOException e){ 
    e.printStackTrace(); }finally { 
    try { 
    if(writer!=null){ 
    writer.close(); } }catch (IOException e){ 
    e.printStackTrace(); } } } } 

在该活动被销毁的时候,就会调用save方法,把文本写入文件中。

3,查看文件内容

书中的查看方法已经被弃用了,新的查看方法是:在Android Studio的顶部栏,View >> Tool Windows >> Device File Explorer;然后再在文件夹data/data中查看即可。
在这里插入图片描述
这样就可以在文件中看到。

4,从文件中读取数据

 public String load(){ 
    FileInputStream in=null; BufferedReader reader=null; StringBuilder content=new StringBuilder(); try { 
    //配置读取参数 in = openFileInput("data"); //使用读取参数构建reader reader=new BufferedReader(new InputStreamReader(in)); String line=""; //一行行读取内容,并且放置到content中 while((line=reader.readLine())!=null){ 
    content.append(line); } }catch(IOException e){ 
    e.printStackTrace(); }finally { 
    try { 
    if(reader!=null){ 
    reader.close(); } }catch (IOException e){ 
    e.printStackTrace(); } } return content.toString(); } 

于是仅需要修改上文的MainActivity中的代码即可:

public class MainActivity extends AppCompatActivity { 
    private EditText edit; @Override protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edit=(EditText) findViewById(R.id.edit); String inputText=load(); if(!TextUtils.isEmpty(inputText)){ 
    //读取到内容了就更新 edit.setText(inputText); //焦点放置到最后位置 edit.setSelection(inputText.length()); Toast.makeText(this, "读取到内容啦", Toast.LENGTH_SHORT).show(); } } @Override protected void onDestroy() { 
    super.onDestroy(); String inputText =edit.getText().toString(); save(inputText); } public void save(String inputText) { 
    FileOutputStream out=null; BufferedWriter writer=null; try { 
    //文件夹名字是:data,文件书写类型是覆盖 out=openFileOutput("data", Context.MODE_PRIVATE); //将文件写入的参数传入,构建出writer对象 writer=new BufferedWriter(new OutputStreamWriter(out)); //调用writerd的write方法,写入文件。 writer.write(inputText); }catch(IOException e){ 
    e.printStackTrace(); }finally { 
    try { 
    if(writer!=null){ 
    writer.close(); } }catch (IOException e){ 
    e.printStackTrace(); } } } public String load(){ 
    FileInputStream in=null; BufferedReader reader=null; StringBuilder content=new StringBuilder(); try { 
    //配置读取参数 in = openFileInput("data"); //使用读取参数构建reader reader=new BufferedReader(new InputStreamReader(in)); String line=""; //一行行读取内容,并且放置到content中 while((line=reader.readLine())!=null){ 
    content.append(line); } }catch(IOException e){ 
    e.printStackTrace(); }finally { 
    try { 
    if(reader!=null){ 
    reader.close(); } }catch (IOException e){ 
    e.printStackTrace(); } } return content.toString(); } } 

实现的效果:
在这里插入图片描述

三,SharedPreferences存储

这种存储方案有以下几个特点:

1,以键值对进行存储 2,支持多种数据结构进行存储,存的时候是什么数据结构,取出来的时候就是什么数据结构。 

将数据存储到SharedPreferences的第一步是需要获取SharedPreferences对象。有以下三种方法:

1,Context类中的getSharedPreferences()方法

2,Activity类中的getPreferences

这个方法和Context中的 getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为SharedPreferences 的文件名。

3,PreferenceManager类中的 getDefaultSharedPreferences()方法

这是一个静态方法,它接收一个 Context 参数,并自动使用当前应用程序的包名作为前缀来命名 SharedPreferences 文件。

4,向SharedPreferences文件中存储数据

(1)调用SharedPreferences 对象的edit)方法来获取一个SharedPreferences.Editor对象。 (2)向 sharedPreferences.Editor 对象中添加数据,比如添加一个布尔型数据就使用putBoolean()方法,添加一个字符串则使用 putstring()方法,以此类推。 (3)调用 apply()方法将添加的数据提交,从而完成数据存储操作。 

5,第一步:新建项目,修改Main_activity.html

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/save_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="保存"/> </LinearLayout> 

6,第二步,修改activity文件

public class MainActivity extends AppCompatActivity { 
    @Override protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button saveData =(Button) findViewById(R.id.save_data); saveData.setOnClickListener(new View.OnClickListener(){ 
    @Override public void onClick(View view) { 
    SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit(); editor.putString("name","Tom"); editor.putInt("age",24); editor.putBoolean("married",false); editor.apply(); } }); } } 

点击按钮后,立马就保存了,需要在Android Studio的顶部栏,View >> Tool Windows >> Device File Explorer;然后再在文件夹data/data中查看即可。
在这里插入图片描述

7,从SharedPreferences中读取数据

修改xml中代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/save_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="保存"/> <Button android:id="@+id/restore_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="获取数据"/> </LinearLayout> 

修改活动中的代码:

public class MainActivity extends AppCompatActivity { 
    @Override protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button saveData =(Button) findViewById(R.id.save_data); Button restoreData =(Button) findViewById(R.id.restore_data); saveData.setOnClickListener(new View.OnClickListener(){ 
    @Override public void onClick(View view) { 
    SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit(); editor.putString("name","Tom"); editor.putInt("age",24); editor.putBoolean("married",false); editor.apply(); } }); restoreData.setOnClickListener(new View.OnClickListener(){ 
    @Override public void onClick(View view) { 
    SharedPreferences pref=getSharedPreferences("data",MODE_PRIVATE); String name=pref.getString("name",""); Toast.makeText(MainActivity.this, name, Toast.LENGTH_SHORT).show(); } }); } } 

四,SQLite数据库

android有提供数据库。现在已经有开源的库LitePal来实现数据的增删改查。
它采用了对象关系映射(ORM)的模式,这是让我们非常好的理解的数据库,一个实体类对应我们数据库中的一个表。该库中还封装了许多的方法,就算对SQL语句的了解很少,也能很好的建立起数据库,以及各种增删改查的操作。
这一节,因为照着书上的方式,会报错。跳过先

到此这篇《第一行代码》 第六章:数据库与存储方案的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 《第一行代码》 第七章:跨程序共享数据-内容提供器2024-12-02 08:45:07
  • jdbc使用java连接数据库学习笔记2024-12-02 08:45:07
  • 表格当前行-对象数据传递给弹框 & 父组件传对象数据给子组件 & 接口写法-增删改查-post-get-delete2024-12-02 08:45:07
  • js中,封装一个判断所有数据类型的方法getType,入参为任意变量,返回值为该参数类型的字符串形式2024-12-02 08:45:07
  • js之对象分类、数据类型分类和存储位置、函数 function介绍、变量的作用域2024-12-02 08:45:07
  • 响应式数据2024-12-02 08:45:07
  • vuex实例方法replaceState解决vuex页面刷新数据丢失问题2024-12-02 08:45:07
  • js基础-(一)-基本数据类型2024-12-02 08:45:07
  • JavaScript技术总结9:轮询数据2024-12-02 08:45:07
  • cesium实时更新数据实现实体运功2024-12-02 08:45:07
  • 全屏图片