已编辑 4 几个月前 通过 ExtremeHow 编辑团队
安卓数据节省连接优化设置智能手机提示移动设备数据管理用户界面
翻译更新 4 几个月前
在Android设备上保存数据是移动应用程序开发的重要部分。本文将为您提供全面了解在Android设备上保存数据的各种方法。有许多保存数据的方法,包括共享偏好、内部存储、外部存储、SQLite数据库等等。
在详细了解每种存储方法之前,了解指导Android数据存储的一般原则很重要。您需要考虑诸如您正在保存的数据类型、数据的一致性要求以及数据的隐私等因素。首先让我们概述一下您在Android上拥有的主要数据存储选项:
共享偏好适合以键值对的形式存储少量数据。它通常用于保存用户设置或应用程序偏好。以下是如何在您的Android应用程序中使用SharedPreferences:
您可以通过调用getSharedPreferences()
方法来获取SharedPreferences实例,该方法需要两个参数:偏好文件的名称和模式。
SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);
要在SharedPreferences中保存数据,您需要使用SharedPreferences.Editor
对象。这里是如何快速做到这一点:
SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("username", "john_doe"); editor.putInt("user_id", 12345); editor.apply();
从共享偏好获取数据很简单。您可以使用getX()
方法,其中X是您想要获取的数据类型:
String username = sharedPreferences.getString("username", "default_name"); int userId = sharedPreferences.getInt("user_id", 0);
内部存储用于保存只有您的应用程序可以访问的文件。它最适合用于私有数据。以下是如何与内部存储一起工作:
您可以使用FileOutputStream
类写入文件。以下是写入一个简单文本文件的示例:
String filename = "myfile.txt"; String fileContents = "Hello World!"; FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE); fos.write(fileContents.getBytes()); fos.close();
要从内部存储读取文件,您需要使用FileInputStream
:
FileInputStream fis = openFileInput(filename); InputStreamReader inputStreamReader = new InputStreamReader(fis); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); StringBuilder sb = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { sb.append(line); } String fileContents = sb.toString();
外部存储可以是可移动的媒体,例如SD卡或用户可访问的设备存储的一部分。这对于大型文件或可以跨应用程序共享的文件很有用。以下是如何使用外部存储:
在使用外部存储之前,确保您的AndroidManifest.xml文件包含所需的权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
要将数据写入外部存储,使用File
类定义目录和文件路径:
File externalStorageDir = Environment.getExternalStorageDirectory(); File myFile = new File(externalStorageDir, "myfile.txt"); FileOutputStream fos = new FileOutputStream(myFile); fos.write("Hello World!".getBytes()); fos.close();
从外部存储读取文件可以使用FileInputStream
实现:
FileInputStream fis = new FileInputStream(myFile); InputStreamReader inputStreamReader = new InputStreamReader(fis); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); StringBuilder sb = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { sb.append(line); } String fileContents = sb.toString();
SQLite是一个强大的结构化数据存储选项,提供了一个完整的SQL数据库用于存储数据。它非常适合大型或复杂的数据结构。让我们学习如何在Android中创建和使用SQLite数据库:
您需要创建一个继承自SQLiteOpenHelper
的助手类,以管理数据库的创建和版本管理:
public class MyDbHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "mydatabase.db"; public MyDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS users"); onCreate(db); } }
您可以使用ContentValues
进行数据输入:
MyDbHelper dbHelper = new MyDbHelper(getContext()); SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", "John Doe"); values.put("age", 29); long newRowId = db.insert("users", null, values);
查询数据使用query()
或rawQuery()
方法完成:
SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = db.query("users", new String[] {"id", "name", "age"}, null, null, null, null, null ); while(cursor.moveToNext()) { long userId = cursor.getLong(cursor.getColumnIndexOrThrow("id")); String userName = cursor.getString(cursor.getColumnIndexOrThrow("name")); int userAge = cursor.getInt(cursor.getColumnIndexOrThrow("age")); } cursor.close();
Room是SQLite的抽象层,简化了数据库访问,使您可以在流畅的API中编写查询或依靠编译时SQL诊断。以下是基本步骤:
使用@Entity
注解定义表的实体表示:
@Entity public class User { @PrimaryKey public int id; public String name; public int age; }
通过DAO定义访问数据库的方法:
@Dao public interface UserDao { @Insert void insertAll(User... users); @Query("SELECT * FROM user") List<User> getAll(); }
创建一个继承自RoomDatabase
的抽象类,其中包含实体和DAO:
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
您可以在应用程序中使用定义的数据库:
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").build(); UserDao userDao = db.userDao(); List<User> users = userDao.getAll();
总之,Android提供了多种数据存储方法,您可以根据您的具体需求进行选择。了解每种方法的优缺点将指导您在应用程序开发过程中做出实用的决策。
如果你发现文章内容有误, 您可以