蓝桉云顶

Good Luck To You!

Android数据存储,有哪些方式可以选择?

Android 数据存储方式包括:SharedPreferences、文件存储、SQLite数据库、ContentProvider和网络存储。

Android如何存储数据

在Android开发中,数据存储是关键的一环,应用程序需要有效地存储和检索数据,以便为用户提供无缝体验,本文将深入探讨Android的五大存储方式:SharedPreferences、文件存储、SQLite数据库、ContentProvider和网络存储,通过理解这些方式,你将能够更好地管理你的应用程序的数据,并确保其在各种场景下都能稳定运行。

一、SharedPreferences存储

SharedPreferences是Android中用于保存少量数据的一种简单存储方式,通常用于保存一些常用的配置信息,这些数据以键值对的形式存储,类似于HashMap,SharedPreferences提供了一种轻量级的方式来保存和检索基本类型的值,如字符串、整数、布尔值等,由于SharedPreferences基于XML文件存储数据,因此它非常适合于存储简单的配置信息。

核心原理

SharedPreferences的核心原理是通过一个XML文件来存储键值对数据,每个SharedPreferences文件都位于应用的私有目录下,文件名通常是"shared_prefs",SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例。

使用步骤

获取SharedPreferences对象:通过getSharedPreferences("filename", MODE_PRIVATE)获取SharedPreferences对象。

编辑数据:通过edit()方法获取Editor对象,然后使用putStringputInt等方法添加或修改数据。

提交修改:调用commit()方法提交修改。

示例代码

// 获取SharedPreferences对象
SharedPreferences sharedPreferences = getSharedPreferences("config", MODE_PRIVATE);
// 写入数据
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("username", "admin");
editor.putInt("age", 25);
editor.apply();
// 读取数据
String username = sharedPreferences.getString("username", "default_username");
int age = sharedPreferences.getInt("age", 0);

二、文件存储

文件存储是一种常用的数据存储方式,允许应用程序在设备内部存储大量数据,Android提供了多种文件存储方法,包括内部存储和外部存储,内部存储是指将数据保存在应用程序私有目录下,其他应用程序无法访问,外部存储则提供了公共目录,其他应用程序可以共享和访问这些目录下的文件。

内部存储

(1)特点

私有性:只有当前应用可以访问内部存储的文件。

无需权限:读写内部存储不需要申请特殊权限。

隔离性:不同应用的内部存储空间相互隔离。

(2)使用步骤

打开文件输出流:使用openFileOutput(String name, int mode)方法打开文件输出流。

写入数据:通过输出流写入数据。

关闭输出流:写入完成后关闭输出流。

(3)示例代码

try {
    FileOutputStream fos = openFileOutput("data.txt", MODE_PRIVATE);
    fos.write("Hello, World!".getBytes());
    fos.close();
} catch (IOException e) {
    e.printStackTrace();
}

(4)读取数据

try {
    FileInputStream fis = openFileInput("data.txt");
    InputStreamReader isr = new InputStreamReader(fis);
    BufferedReader br = new BufferedReader(isr);
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = br.readLine()) != null) {
        sb.append(line);
    }
    String content = sb.toString();
    Log.d("FileContent", content);
    br.close();
    isr.close();
    fis.close();
} catch (IOException e) {
    e.printStackTrace();
}

外部存储

(1)特点

公共性:外部存储的文件可以被其他应用访问。

权限要求:从Android 6.0(API级别23)开始,读写外部存储需要申请权限。

存储位置:通常位于设备的公共存储区域,如SD卡。

(2)使用步骤

检查权限:确保应用具有READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限。

获取外部存储路径:使用getExternalFilesDir(null)获取应用专属的外部存储目录。

读写文件:与内部存储类似,使用文件输入输出流进行读写操作。

(3)示例代码

// 写入外部存储
File file = new File(getExternalFilesDir(null), "example.txt");
try (FileOutputStream fos = new FileOutputStream(file)) {
    fos.write("External Storage Example".getBytes());
} catch (IOException e) {
    e.printStackTrace();
}
// 读取外部存储
try (FileInputStream fis = new FileInputStream(file)) {
    int content;
    while ((content = fis.read()) != -1) {
        System.out.print((char) content);
    }
} catch (IOException e) {
    e.printStackTrace();
}

注意事项

权限处理:在AndroidManifest.xml中声明权限,并在运行时请求权限。

文件格式:选择合适的文件格式以提高读取效率和节省存储空间。

安全性:避免存储敏感信息,必要时对文件进行加密处理。

三、SQLite数据库存储

SQLite是一个轻量级的关系型数据库,广泛应用于移动应用程序中,Android提供了SQLite数据库API,使开发人员能够轻松创建、操作和管理数据库,通过使用SQLite数据库,应用程序可以以结构化的方式存储、检索和管理数据,SQLite数据库提供了高效的数据检索、事务处理和数据一致性保证等功能。

核心组件

SQLiteOpenHelper:辅助类,用于管理数据库版本和创建表结构。

SQLiteDatabase:代表一个SQLite数据库实例,提供CRUD(创建、读取、更新、删除)操作的方法。

ContentValues:用于存储键值对数据,便于插入到数据库中。

使用步骤

创建数据库:继承SQLiteOpenHelper类,实现onCreate方法创建表结构。

升级数据库:重写onUpgrade方法处理数据库版本升级。

操作数据库:通过SQLiteDatabase对象执行增删改查操作。

示例代码

public class MyDatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "mydatabase.db";
    private static final int DATABASE_VERSION = 1;
    private static final String TABLE_NAME = "user";
    private static final String COLUMN_ID = "id";
    private static final String COLUMN_NAME = "name";
    private static final String COLUMN_AGE = "age";
    public MyDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTable = "CREATE TABLE " + TABLE_NAME + " (" +
                COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COLUMN_NAME + " TEXT, " +
                COLUMN_AGE + " INTEGER)";
        db.execSQL(createTable);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}

四、ContentProvider存储

ContentProvider是Android中用于跨应用程序共享数据的一种机制,它提供了一种标准化的方式来访问应用程序中的数据,使得其他应用程序可以通过URI来请求和修改数据,ContentProvider通常用于共享复杂的数据集,如通讯录、短信、图片等,通过使用ContentProvider,应用程序可以实现数据的封装和隐藏,并确保数据的安全性和完整性。

核心原理

ContentProvider通过实现一组标准的方法(如query、insert、update、delete)来管理数据的增删改查操作,其他应用可以通过ContentResolver对象与ContentProvider交互,使用URI来指定要操作的数据。

使用步骤

创建ContentProvider:继承ContentProvider类,实现抽象方法。

定义URI:为数据定义唯一的URI,便于识别和访问。

注册ContentProvider:在AndroidManifest.xml中注册ContentProvider。

操作数据:通过ContentResolver对象与ContentProvider交互,执行增删改查操作。

示例代码

public class MyContentProvider extends ContentProvider {
    private static final String AUTHORITY = "com.example.mycontentprovider";
    private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    private static final int USERS = 1;
    private static final int USER_ID = 2;
    private static final String BASE_PATH = "users";
    private static final HashMap<Integer, String> users = new HashMap<>();
    private static final int DATABASE_VERSION = 1;
    private static final String TABLE_NAME = "user";
    private static final String COLUMN_ID = "id";
    private static final String COLUMN_NAME = "name";
    private static final String COLUMN_AGE = "age";
    private SQLiteDatabase database;
    static {
        uriMatcher.addURI(AUTHORITY, BASE_PATH, USERS);
        uriMatcher.addURI(AUTHORITY, BASE_PATH + "/#", USER_ID);
    }
    @Override
    public boolean onCreate() {
        MyDatabaseHelper dbHelper = new MyDatabaseHelper(getContext());
        database = dbHelper.getWritableDatabase();
        return false; // return true if some value are inserted else false
    }
    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
        queryBuilder.setTables(TABLE_NAME);
        switch (uriMatcher.match(uri)) {
            case USERS:
                queryBuilder.appendWhere(COLUMN_ID + " = ?");
                break;
            case USER_ID:
                queryBuilder.appendWhere(COLUMN_ID + " = ?");
                break;
            default:
                throw new IllegalArgumentException("Unknown URI: " + uri);
        }
        Cursor cursor = queryBuilder.query(database, projection, selection, selectionArgs, null, null, sortOrder);
        cursor.setNotificationUri(getContext().getContentResolver(), uri);
        return cursor;
    }
    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        switch (uriMatcher.match(uri)) {
            case USERS:
                return ContentResolver.CURSOR_DIR_BASE_TYPE + "/users";
            case USER_ID:
                return ContentResolver.CURSOR_ITEM_BASE_TYPE + "/user";
            default:
                throw new IllegalArgumentException("Unknown URI: " + uri);
        }
    }
    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        long rowId = database.replace(TABLE_NAME, null, values);
        if (rowId > 0) {
            Uri returnUri = ContentUris.withAppendedId(uri, rowId);
            getContext().getContentResolver().notifyChange(uri, null);
            return returnUri;
        } else {
            throw new SQLException("Failed to add a record into " + uri);
        }
    }
    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        int rowsDeleted = 0;
        switch (uriMatcher.match(uri)) {
            case USERS:
                rowsDeleted = database.delete(TABLE_NAME, selection, selectionArgs);
                break;
            case USER_ID:
                rowsDeleted = database.delete(TABLE_NAME, COLUMN_ID + " = ?", new String[]{String.valueOf(ContentUris.parseId(uri))});
                break;
            default:
                throw new IllegalArgumentException("Unknown URI: " + uri);
        }
        getContext().getContentResolver().notifyChange(uri, null);
        return rowsDeleted;
    }
}
<provider android:name=".MyContentProvider" android:authorities="com.example.mycontentprovider" android:exported="true"></provider>

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年11月    »
123
45678910
11121314151617
18192021222324
252627282930
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接