博客
关于我
Android基础知识——数据存储方案
阅读量:664 次
发布时间:2019-03-16

本文共 8514 字,大约阅读时间需要 28 分钟。

数据持久化技术在Android开发中的应用

一、持久化技术简介

持久化技术是Android开发中至关重要的一部分。它的核心作用是确保应用程序在设备重新启动时仍然能够访问和管理那些重要的数据。在Android系统中,主要有三种常用的持久化技术:文件存储、SharedPreferences和数据库存储。每一种存储方式都有其特点和适用场景。接下来,我们将深入探讨这三种技术的实现方式及其应用场景。

二、文件存储技术

文件存储是Android中最基础也最简单的一种持久化方式。这种方法直接将数据以文件形式保存,不对内容进行任何格式化处理。因此,它适合用于存储简单的文本数据或二进制数据。

2.1 将数据存储到文件中

文件存储的实现步骤如下:

  • 调用openFileOutput()方法获取输出流。
  • 使用IO操作将数据写入文件中。
  • openFileOutput()方法的详细说明

    • 第一个参数是文件名称,不能包含路径,文件默认保存到/data/data/<package name>/files/目录下。
    • 第二个参数是文件操作模式,主要有MODE_PRIVATEMODE_APPEND两种选择。在MODE_PRIVATE模式下,若文件已存在,内容将会覆盖原文件;MODE_append模式下,数据将追加到已有文件末尾,若文件不存在则会创建新文件。

    示例代码

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

    查找生成文件的方式

    • 在Android Studio中,点击菜单栏中的"View" > "Tool Windows" > "Device File Explorer"。-amic:len Android Studio中,点击菜单栏中的"View" > "Tool Windows" > "Device File Explorer",并找到/data/data/<package name>/files/目录。

    2.2 从文件中读取数据

    读取文件数据的实现步骤如下:

  • 调用openFileInput()方法获取输入流。
  • 使用IO操作读取数据。
  • 示例代码

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

    三、SharedPreferences存储技术

    SharedPreferences是一种使用键值对存储数据的机制。与文件存储相比,它更为便捷,且支持多种数据类型的存取操作。其优势在于通过简单的方法即可完成数据的持久化操作。

    3.1 将数据存储到SharedPreferences中

    SharedPreferences的存储过程包括以下步骤:

  • 获取SharedPreferences实例。
  • 获取SharedPreferences.Editor对象。
  • 调用putXXX()方法存储数据。
  • 调用apply()方法完成保存。
  • 获取SharedPreferences实例的方式

  • 使用Context.getSharedPreferenecs()方法,需提供文件名和操作模式。
  • 使用Activity.getPreferences()方法,文件名默认为活动类名。
  • 使用PreferenceManager.getDefaultSharedPreferences()方法,文件名为应用包名。
  • 示例代码

    SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();editor.putString("name", "Tom");editor.putInt("age", 18);editor.apply();

    3.2 从SharedPreferences中读取数据

    读取SharedPreferences数据的实现步骤如下:

  • 获取SharedPreferences实例。
  • 调用getString()getInt()等方法获取指定键的数据。
  • 示例代码

    SharedPreferences preferences = getSharedPreferences("data", MODE_PRIVATE);String name = preferences.getString("name", "");int age = preferences.getInt("age", -1);

    四、SQLite数据库存储技术

    SQLite是一款轻量级的关系型数据库,支持标准的SQL语法。它是处理大量复杂数据时的理想选择。

    4.1 创建数据库

    创建SQLite数据库的步骤如下:

  • 创建一个继承自SQLiteOpenHelper的类,并重写onCreate()onUpgrade()方法。
  • onCreate()方法中执行创建表的SQL语句。
  • 调用getWritableDatabase()方法获取数据库实例。
  • 示例代码

    public class MySQLiteOpenHelper extends SQLiteOpenHelper {    private Context mContext;    private final String CREATE_BOOK = "CREATE TABLE Book (" +            "id INTEGER PRIMARY KEY AUTOINCREMENT," +            "name TEXT," +            " author TEXT," +            "price REAL)";        public MySQLiteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);        mContext = context;    }        @Override    public void onCreate(SQLiteDatabase sqLiteDatabase) {        sqLiteDatabase.execSQL(CREATE_BOOK);        Toast.makeText(mContext, "数据库创建成功", Toast.LENGTH_SHORT).show();    }        @Override    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {        // 根据需求添加升级逻辑    }}public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        final MySQLiteOpenHelper helper = new MySQLiteOpenHelper(this, "BookStore.db", null, 1);        Button button = findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                helper.getWritableDatabase();            }        });    }}

    4.2 升级数据库

    在实际开发中,我们可能需要对数据库进行升级。升级步骤如下:

  • onCreate()中添加新的表结构。
  • onUpgrade()中调用onCreate(),并重复创建表的操作。
  • 升级示例

    public class MySQLiteOpenHelper extends SQLiteOpenHelper {    private Context mContext;    private final String CREATE_BOOK = "CREATE TABLE Book (" +            "id INTEGER PRIMARY KEY AUTOINCREMENT," +            "name TEXT," +            "author TEXT," +            "price REAL)";    private final String CREATE_STUDENT = "CREATE TABLE Student (" +            "id INTEGER PRIMARY KEY AUTOINCREMENT," +            "name TEXT," +            "age INTEGER)";        public MySQLiteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);        mContext = context;    }        @Override    public void onCreate(SQLiteDatabase sqLiteDatabase) {        sqLiteDatabase.execSQL(CREATE_BOOK);        sqLiteDatabase.execSQL(CREATE_STUDENT);        Toast.makeText(mContext, "数据库升级成功", Toast.LENGTH_SHORT).show();    }        @Override    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS Book");        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS Student");        onCreate(sqLiteDatabase);    }}public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        final MySQLiteOpenHelper helper = new MySQLiteOpenHelper(this, "BookStore.db", null, 2);        Button button = findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                SQLiteDatabase database = helper.getWritableDatabase();            }        });    }}

    4.3 数据操作(插入、更新、删除)

    插入数据

    SQLiteDatabase database = helper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", "Java");values.put("price", 43.2);database.insert("Book", null, values);

    更新数据

    SQLiteDatabase database = helper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", "Android");database.update("Book", values, "id = ?", new String[] {"1"});

    删除数据

    SQLiteDatabase database = helper.getWritableDatabase();database.delete("Book", "id = ?", new String[] {"1"});

    4.4 查询数据

    SQLiteDatabase database = helper.getWritableDatabase();Cursor cursor = database.query("Student", null, "age = ?", new String[] {"18"}, null, null, null);while (cursor.moveToNext()) {    String name = cursor.getString(cursor.getColumnIndex("name"));    int age = cursor.getInt(cursor.getColumnIndex("age"));    Log.i("MainActivity", "查询到的数据:" + name + " " + age);}cursor.close();

    五、LitePal数据库框架

    LitePal是一款开源的Android数据库框架,支持对象关系映射(ORM)模式,大大简化了数据库操作。

    5.1 LitePal简介

    LitePal通过封装常用数据库操作功能,减少了手动编写SQL语句的需求。它支持标准的增删改查操作,并通过 ORM映射将POJO对象与数据库表映射。


    5.2 配置LitePal

  • 在项目的build.gradle中添加相关依赖。
  • implementation 'org.litepal.android:java:3.0.0'
    1. 创建一个litepal.xml配置文件。
      1. AndroidManifest.xml中配置LitePalApplication

      2. 5.3 数据库操作

        创建或升级数据库

      3. 创建一个继承自LitePalSupport的类,并定义相应的字段和方法。
      4. public class People extends LitePalSupport {    String name;    int age;    public String getName() { return name; }    public void setName(String name) { this.name = name; }    public int getAge() { return age; }    public void setAge(int age) { this.age = age; }}

        litepal.xml中添加映射关系。


        添加数据

        People person = new People();person.setName("张三");person.setAge(30);person.save();

        更新数据

        People person = new People();person.setName("李四");person.updateAll("id = ?", "1");

        删除数据

        LitePal.deleteAll("People", "id = ?", "1");

        查询数据

        List
        peopleList = LitePal.findAll(People.class);for (People person : peopleList) { Log.i("MainActivity", "查询到的学生:" + person.getName() + " " + person.getAge());}


        以上内容突出了Android中三种主要的持久化技术及其操作方式,涵盖了文件存储、SharedPreferences以及关系型数据库的实现细节,同时也介绍了LitePal这样的数据库框架。读者可以根据实际需求选择合适的持久化方式来实现数据的存取和管理。

    转载地址:http://gwjqz.baihongyu.com/

    你可能感兴趣的文章
    Jenkins - 部署在Tomcat容器里的Jenkins,提示“反向代理设置有误”
    查看>>
    wxWidgets源码分析(3) - 消息映射表
    查看>>
    wxWidgets源码分析(5) - 窗口管理
    查看>>
    wxWidgets源码分析(8) - MVC架构
    查看>>
    wxWidgets源码分析(9) - wxString
    查看>>
    [梁山好汉说IT] 梁山好汉和抢劫银行
    查看>>
    [源码解析] 消息队列 Kombu 之 基本架构
    查看>>
    [源码分析] 消息队列 Kombu 之 启动过程
    查看>>
    wx.NET CLI wrapper for wxWidgets
    查看>>
    Silverlight for linux 和 DLR(Dynamic Language Runtime)
    查看>>
    ASP.NET MVC Action Filters
    查看>>
    Powershell中禁止执行脚本解决办法
    查看>>
    OO_Unit2 多线程电梯总结
    查看>>
    git clone 出现fatal: unable to access ‘https://github 错误解决方法
    查看>>
    04_Mysql配置文件(重要参数)
    查看>>
    python 加密算法及其相关模块的学习(hashlib,RSA,random,string,math)
    查看>>
    JavaSE总结
    查看>>
    手动造轮子——基于.NetCore的RPC框架DotNetCoreRpc
    查看>>
    Python IO编程
    查看>>
    CSS入门总结
    查看>>