
本文共 8514 字,大约阅读时间需要 28 分钟。
数据持久化技术在Android开发中的应用
一、持久化技术简介
持久化技术是Android开发中至关重要的一部分。它的核心作用是确保应用程序在设备重新启动时仍然能够访问和管理那些重要的数据。在Android系统中,主要有三种常用的持久化技术:文件存储、SharedPreferences和数据库存储。每一种存储方式都有其特点和适用场景。接下来,我们将深入探讨这三种技术的实现方式及其应用场景。
二、文件存储技术
文件存储是Android中最基础也最简单的一种持久化方式。这种方法直接将数据以文件形式保存,不对内容进行任何格式化处理。因此,它适合用于存储简单的文本数据或二进制数据。
2.1 将数据存储到文件中
文件存储的实现步骤如下:
openFileOutput()
方法获取输出流。openFileOutput()方法的详细说明:
- 第一个参数是文件名称,不能包含路径,文件默认保存到
/data/data/<package name>/files/
目录下。 - 第二个参数是文件操作模式,主要有
MODE_PRIVATE
和MODE_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()
方法获取输入流。示例代码:
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的存储过程包括以下步骤:
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数据的实现步骤如下:
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'
- 创建一个
litepal.xml
配置文件。 - 在
AndroidManifest.xml
中配置LitePalApplication
。 - 创建一个继承自
LitePalSupport
的类,并定义相应的字段和方法。
5.3 数据库操作
创建或升级数据库
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");
查询数据
ListpeopleList = LitePal.findAll(People.class);for (People person : peopleList) { Log.i("MainActivity", "查询到的学生:" + person.getName() + " " + person.getAge());}
以上内容突出了Android中三种主要的持久化技术及其操作方式,涵盖了文件存储、SharedPreferences以及关系型数据库的实现细节,同时也介绍了LitePal这样的数据库框架。读者可以根据实际需求选择合适的持久化方式来实现数据的存取和管理。
发表评论
最新留言
关于作者
