专栏首页ZackSockAndroid存储数据的三种方式

Android存储数据的三种方式

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

1、文件存储

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

布局文件activity_main.xml如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context=".MainActivity">
    <EditText        android:id="@+id/et_name"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="用户名"/>
    <EditText        android:id="@+id/et_pwd"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:inputType="textPassword"        android:hint="密码"/>
    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:onClick="save"        android:text="登录"/>
</LinearLayout>

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

public class MainActivity extends AppCompatActivity {    //声明控件    private EditText etName;    private EditText etPwd;
    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        //关联控件        etName = findViewById(R.id.et_name);        etPwd = findViewById(R.id.et_pwd);    }}

1.1、保存文件

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

public void save(View view) {    //当用户名密码不为空时    if(!TextUtils.isEmpty(etName.getText()) && !TextUtils.isEmpty(etPwd.getText())){        FileOutputStream fos = null;        try {

            //Context中的方法openFileOutput(),获取一个FileOutputStream对象            fos = openFileOutput("data", Context.MODE_PRIVATE);            String str = etName.getText().toString().trim() + "#" + etPwd.getText().toString().trim();            fos.write(str.getBytes());            Toast.makeText(getApplicationContext(), "保存成功", Toast.LENGTH_SHORT).show();


        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                fos.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }else{        Toast.makeText(getApplicationContext(), "用户名或密码不能为空", Toast.LENGTH_SHORT).show();    }}

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

1.2、读取文件

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

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

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

2、SharedPreferences简称Sp

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

2.1、Sp的创建

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

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

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

SharedPreferences sp = getPreferences(Context.MODE_PRIVATE);

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

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);

2.2、用Sp保存数据

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

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

2.3、获取Sp中的文件

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

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

3、SQLite数据库

3.1、SQLite数据库的创建

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

public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    /**     * @param context 上下文     * @param name    数据库名称     * @param factory   游标工场     * @param version   版本     */    public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);    }
    /**     *  数据库创建时调用这个方法     * @param db    数据库对象     */    @Override    public void onCreate(SQLiteDatabase db) {
    }
    /**     *  数据库升级的时候自动调用     * @param db    数据库对象     * @param oldVersion    老版本     * @param newVersion    新版本     */    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }}

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

3.2、获取数据库

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

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

3.3、数据库操作

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

本文分享自微信公众号 - ZackSock(AndrewRubin),作者:ZackSock

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android四种数据存储的应用方式

     作为一个完整的应用程序,数据存储操作是必不可少的。因此,Android系统一共提供了四种数据存储方式。分别是:SharePreference、文件存储、SQL...

    砸漏
  • 字符串的三种存储方式

      在数据结构中,字符串要单独用一种存储结构来存储,称为串存储结构。这里的串指的就是字符串。无论学习哪种编程语言,操作最多的总是字符串。我们平常使用最多的存储结...

    嵌入式与Linux那些事
  • Android数据存储实现的5大方式

    Android数据存储实现的5大方式 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,更加系统详细的介绍了5种存储的...

    用户1289394
  • Android数据存储实现的5大方式

    第一种: 使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用...

    用户2192970
  • 【Android】数据存储(三) 数据库(SQLite)

    Gavin-ZYX
  • Python爬虫数据存哪里|数据存储到文件的几种方式

    爬虫请求解析后的数据,需要保存下来,才能进行下一步的处理,一般保存数据的方式有如下几种:

    吾非同
  • Flutter的两种本地存储方式之数据库(2)

    如果需要持久化大量格式化后的数据,并且这些数据还会以较高的频率更新,为了考虑进一步的扩展性,通常会选用 sqlite 数据库来应对这样的场景。

    Weaster
  • Android用文件存储数据的方法

    本文实例为大家分享了Android用文件存储数据的具体代码,供大家参考,具体内容如下

    砸漏
  • iOS常用的数据存储方式

    针对应用的字体大小、是否保存用户名等偏好设置,IOS的每个应用都有个NSUserDefaults实例,通过它来存取偏好设置。NSUserDefaults设置数据...

    公众号iOS逆向
  • 实现存储的几种方式

    Cookie是服务器发送到用户浏览器并保存在本地的一小块数据。cookie一般由后端设置,并通过response流发送给前端并设置过期时间。

    Cloud-Cloudys
  • mysql存储过程----三种定义变量方式

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

    逝兮诚
  • 020android初级篇之android存储数据方式:SharePreference的使用

    轻量级的存储类,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下。

    上善若水.夏
  • 区块链存储方式——分布式数据存储VS中心化存储

    2019年的1024讲话,让区块链这个词焕然一新,以前它总是和传销和诈骗联系在一起,“区块链”这个词总是蒙上一层灰色。但是如今,区块链则是和实体经济融合紧密相连...

    qq-2723379296
  • iSCSI存储的3种连接方式

    我们分析了iSCSI存储的系统结构,下面来看iSCSI是如何与服务器、工作站等主机设备来连接的,也就是我们如何建立一个iSCSI网络存储系统。

    py3study
  • 数据库中的 “行式存储”和“列式存储”

    传统的关系型数据库,如 Oracle、DB2、MySQL、SQL SERVER 等采用行式存储法(Row-based),在基于行式存储的数据库中, 数据是按照行...

    一个会写诗的程序员
  • iOS开发--常用的数据存储方式

    1、XML属性列表(plist)归档 2、preference(偏好设置) 3、NSKeyedArchiver归档(NSCoding) 4、SQLite3...

    孙寅
  • 轻松入门腾讯云存储系列三:对象存储COS 使用入门三种方式

    腾讯云目前支持三种不同的方式来登录和管理您的对象存储,请您根据自身场景灵活选择登录方式:控制台,CLI和API/SDKs。

    云加社区
  • hive的数据存储格式

    Hive支持的存储数据的格式主要有:TEXTFILE(行式存储) 、SEQUENCEFILE(行式存储)、ORC(列式存储)、PARQUET(列...

    大数据梦想家
  • 三种MySQL数据导出方式

    十毛

扫码关注云+社区

领取腾讯云代金券