zoukankan      html  css  js  c++  java
  • Android存储数据的三种方式

    Android存储数据的三种方式

    2019-09-17 23:21:14 ZackSock 阅读数 409更多

    分类专栏: Android # 数据持久化

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    本文链接:https://blog.csdn.net/ZackSock/article/details/100943825

    今天来给大家讲一下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.  
    10. <EditText

    11. android:id="@+id/et_name"

    12. android:layout_width="match_parent"

    13. android:layout_height="wrap_content"

    14. android:hint="用户名"/>

    15.  
    16. <EditText

    17. android:id="@+id/et_pwd"

    18. android:layout_width="match_parent"

    19. android:layout_height="wrap_content"

    20. android:inputType="textPassword"

    21. android:hint="密码"/>

    22.  
    23. <Button

    24. android:layout_width="match_parent"

    25. android:layout_height="wrap_content"

    26. android:onClick="save"

    27. android:text="登录"/>

    28.  
    29. </LinearLayout>

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

    
     
    1. public class MainActivity extends AppCompatActivity {

    2. //声明控件

    3. private EditText etName;

    4. private EditText etPwd;

    5.  
    6. @Override

    7. protected void onCreate(Bundle savedInstanceState) {

    8. super.onCreate(savedInstanceState);

    9. setContentView(R.layout.activity_main);

    10. initView();

    11. }

    12. private void initView() {

    13. //关联控件

    14. etName = findViewById(R.id.et_name);

    15. etPwd = findViewById(R.id.et_pwd);

    16. }

    17. }

    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.  
    7.  
    8. //Context中的方法openFileOutput(),获取一个FileOutputStream对象

    9. fos = openFileOutput("data", Context.MODE_PRIVATE);

    10. String str = etName.getText().toString().trim() + "#" + etPwd.getText().toString().trim();

    11. fos.write(str.getBytes());

    12. Toast.makeText(getApplicationContext(), "保存成功", Toast.LENGTH_SHORT).show();

    13.  
    14.  
    15.  
    16. } catch (Exception e) {

    17. e.printStackTrace();

    18. } finally {

    19. try {

    20. fos.close();

    21. } catch (IOException e) {

    22. e.printStackTrace();

    23. }

    24. }

    25. }else{

    26. Toast.makeText(getApplicationContext(), "用户名或密码不能为空", Toast.LENGTH_SHORT).show();

    27. }

    28. }

    代码看起来有点乱,我在中间空了许多,主要代码就那些。利用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.  
    5. //获取Editor对象

    6. SharedPreferences.Editor editor = sp.edit();

    7.  
    8. //用Editor对象储存数据,传入键和值

    9. editor.putString("name", "zack");

    10.  
    11. //最后调用apply()方法

    12. editor.apply();

    13.  
    14. }

    2.3、获取Sp中的文件

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

    
     
    1. private void initData(){

    2. //创建一个文件名为data的sp对象

    3. SharedPreferences sp = getSharedPreferences("data", Context.MODE_PRIVATE);

    4.  
    5. //直接通过键获取数据,如果通过这个键找不到,就返回第二个参数中的值

    6. sp.getString("name", null);

    7.  
    8. }

    3、SQLite数据库

    3.1、SQLite数据库的创建

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

    
     
    1. public class MySQLiteOpenHelper extends SQLiteOpenHelper {

    2.  
    3. /**

    4. * @param context 上下文

    5. * @param name 数据库名称

    6. * @param factory 游标工场

    7. * @param version 版本

    8. */

    9. public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {

    10. super(context, name, factory, version);

    11. }

    12.  
    13. /**

    14. * 数据库创建时调用这个方法

    15. * @param db 数据库对象

    16. */

    17. @Override

    18. public void onCreate(SQLiteDatabase db) {

    19.  
    20. }

    21.  
    22. /**

    23. * 数据库升级的时候自动调用

    24. * @param db 数据库对象

    25. * @param oldVersion 老版本

    26. * @param newVersion 新版本

    27. */

    28. @Override

    29. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    30.  
    31. }

    32. }

    这里写了三个方法,其中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.  
    5. //通过MySQLiteOpenHelper对象获取数据。这两个方法暂时不区别

    6. //SQLiteDatabase db = sqLiteOpenHelper.getWritableDatabase();

    7. SQLiteDatabase db = sqLiteOpenHelper.getReadableDatabase();

    8.  
    9. }

    3.3、数据库操作

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

  • 相关阅读:
    超微主板不识别M2-解决方案
    Centos7安装zookpeer
    PowerBI主题制作
    [python错误]UnicodeDecodeError: 'gbk' codec can't decode byte...
    使用Python批量合并PDF文件(带书签功能)
    Oracle使用超大SQL脚本文件恢复数据问题记录
    Linux Mint 18.2安装后需要进行的设置
    Excel使用SUMIF函数注意事项
    CSV文件分割与列异常处理的python脚本
    小程序例子
  • 原文地址:https://www.cnblogs.com/grj001/p/12223890.html
Copyright © 2011-2022 走看看