Android存储数据的三种方式

举报
北山啦 发表于 2021/05/26 00:50:43 2021/05/26
【摘要】 今天来给大家讲一下Android中如何存储数据。我编写Android使用的是Java语言,所以今天讲的也是Java版的数据存储。在Android中,数据存储主要有三种,文件存储、Sp、SQLite。文件存储就是我们平时的IO流,是非常传统的一种方式。而Sp是Android中的,利用XML文件存储数据的一种方式,要比文件存储简单。SQLite就是一个数据库了,基本操作和数据库大...

今天来给大家讲一下Android中如何存储数据。我编写Android使用的是Java语言,所以今天讲的也是Java版的数据存储。在Android中,数据存储主要有三种,文件存储、Sp、SQLite。文件存储就是我们平时的IO流,是非常传统的一种方式。而Sp是Android中的,利用XML文件存储数据的一种方式,要比文件存储简单。SQLite就是一个数据库了,基本操作和数据库大致一样。

1、文件存储

先写一个简洁的登陆界面:

布局文件activity_main.xml如下:


  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. tools:context=".MainActivity">
  9. <EditText
  10. android:id="@+id/et_name"
  11. android:layout_width="match_parent"
  12. android:layout_height="wrap_content"
  13. android:hint="用户名"/>
  14. <EditText
  15. android:id="@+id/et_pwd"
  16. android:layout_width="match_parent"
  17. android:layout_height="wrap_content"
  18. android:inputType="textPassword"
  19. android:hint="密码"/>
  20. <Button
  21. android:layout_width="match_parent"
  22. android:layout_height="wrap_content"
  23. android:onClick="save"
  24. android:text="登录"/>
  25. </LinearLayout>

MainActivity中基本代码如下,就是简单的声明控件和关联控件:


  
  1. public class MainActivity extends AppCompatActivity {
  2. //声明控件
  3. private EditText etName;
  4. private EditText etPwd;
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_main);
  9. initView();
  10. }
  11. private void initView() {
  12. //关联控件
  13. etName = findViewById(R.id.et_name);
  14. etPwd = findViewById(R.id.et_pwd);
  15. }
  16. }

1.1、保存文件

接下来实现一下点击事件save():


  
  1. public void save(View view) {
  2. //当用户名密码不为空时
  3. if(!TextUtils.isEmpty(etName.getText()) && !TextUtils.isEmpty(etPwd.getText())){
  4. FileOutputStream fos = null;
  5. try {
  6. //Context中的方法openFileOutput(),获取一个FileOutputStream对象
  7. fos = openFileOutput("data", Context.MODE_PRIVATE);
  8. String str = etName.getText().toString().trim() + "#" + etPwd.getText().toString().trim();
  9. fos.write(str.getBytes());
  10. Toast.makeText(getApplicationContext(), "保存成功", Toast.LENGTH_SHORT).show();
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. } finally {
  14. try {
  15. fos.close();
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. }else{
  21. Toast.makeText(getApplicationContext(), "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
  22. }
  23. }

代码看起来有点乱,我在中间空了许多,主要代码就那些。利用Context中的openFileOutput(String name, int mode)方法,传入文件名和操作模式。获取一个FileOutputStream对象,然后在存储文件。我这里直接用#来拼接,这样是有问题的。这里只是为了方便。

1.2、读取文件

我们写一个方法load,用来读取文件:


  
  1. private void load() {
  2. try{
  3. //利用Context中的openFileInput()方法获取输入流
  4. FileInputStream data = openFileInput("data");
  5. BufferedReader reader = new BufferedReader(new InputStreamReader(data));
  6. String line = reader.readLine();
  7. String[] split = line.split("#");
  8. etName.setText(split[0]);
  9. etPwd.setText(split[1]);
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. }

这里使用了Context中的openFileInput()方法,获取流,然后读取文件。因为文件流比较少用,我就讲到这里。

2、SharedPreferences简称Sp

Sp是一种用xml文件存储数据的方式,下面我具体讲一下。

2.1、Sp的创建

sp的创建方式有三种,第一种,之直接使用Context中的getSharedPreferences()方法,传入文件名和操作模式:


  
  1. private void initView(){
  2. //使用Context中的getSharedPreferences方法获取Sp对象
  3. SharedPreferences sp = getSharedPreferences("data", Context.MODE_PRIVATE);
  4. }

第二种,使用Activity中的getPreferences()方法,传入一个操作模式,文件名自动以类名命名:

SharedPreferences sp = getPreferences(Context.MODE_PRIVATE);
 

第三种,使用PreferenceManager中的getDefaultPreferences()方法,传入一个Context参数:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);

 

2.2、用Sp保存数据

使用Editor对象存储,Editor中对应的数据类型有对应的方法。putString、putInt...


  
  1. private void initData(){
  2. //获取sp对象
  3. SharedPreferences sp = getSharedPreferences("data", Context.MODE_PRIVATE);
  4. //获取Editor对象
  5. SharedPreferences.Editor editor = sp.edit();
  6. //用Editor对象储存数据,传入键和值
  7. editor.putString("name", "zack");
  8. //最后调用apply()方法
  9. editor.apply();
  10. }

2.3、获取Sp中的文件

获取的时候直接用存储时的文件名创建一个Sp对象,就可以读取数据:


  
  1. private void initData(){
  2. //创建一个文件名为data的sp对象
  3. SharedPreferences sp = getSharedPreferences("data", Context.MODE_PRIVATE);
  4. //直接通过键获取数据,如果通过这个键找不到,就返回第二个参数中的值
  5. sp.getString("name", null);
  6. }

3、SQLite数据库

3.1、SQLite数据库的创建

SQLite数据库的创建需要实现抽象类SQLiteOpenHelper,具体先定义一个类MySQLiteOpenHelper继承SQLiteOpenHelper:


  
  1. public class MySQLiteOpenHelper extends SQLiteOpenHelper {
  2. /**
  3. * @param context 上下文
  4. * @param name 数据库名称
  5. * @param factory 游标工场
  6. * @param version 版本
  7. */
  8. public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
  9. super(context, name, factory, version);
  10. }
  11. /**
  12. * 数据库创建时调用这个方法
  13. * @param db 数据库对象
  14. */
  15. @Override
  16. public void onCreate(SQLiteDatabase db) {
  17. }
  18. /**
  19. * 数据库升级的时候自动调用
  20. * @param db 数据库对象
  21. * @param oldVersion 老版本
  22. * @param newVersion 新版本
  23. */
  24. @Override
  25. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  26. }
  27. }

这里写了三个方法,其中onCreate()和onUpgrade()方法为SQLiteOpenHelper中的抽象方法。onCreate()在数据库创建时调用,只。而onUpgrade()在数据库升级时调用()(Version改变时)。所以onCreate()用于初始化表结构、onUpgrade()用于更新表结构。调用db.execSQL()方法,传入一个SQL语句就好了。

3.2、获取数据库

在Activity中创建MySQLiteOpenHelper的实例,然后通过这个实例获取数据库:


  
  1. private void initData(){
  2. //这里游标工场暂时用不到,设为null
  3. MySQLiteOpenHelper sqLiteOpenHelper = new MySQLiteOpenHelper(this, "db", null, 1);
  4. //通过MySQLiteOpenHelper对象获取数据。这两个方法暂时不区别
  5. //SQLiteDatabase db = sqLiteOpenHelper.getWritableDatabase();
  6. SQLiteDatabase db = sqLiteOpenHelper.getReadableDatabase();
  7. }

3.3、数据库操作

因为篇幅的关系,这里先不讲这么多了。SQLite中可以调用DataBase对象的execSQL()方法,通过SQL语句完成大多数操作。具体Android中特有的操作后面我再讲。大家有兴趣的话可以去了解一下郭林大神的LitePal,用来操作SQLite数据库方便很多。

文章来源: zacksock.blog.csdn.net,作者:ZackSock,版权归原作者所有,如需转载,请联系作者。

原文链接:zacksock.blog.csdn.net/article/details/100943825

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。