Android数据存储:安全性与可靠性的解决方案

一、内部存储

Android应用的内部存储是应用私有的文件存储空间,在设备上具有高度的安全性。只有当前应用才能访问这些文件,其他应用或用户无法访问。应用通过Context.getFilesDir()方法获得这个目录。以下是内部存储的一些特点:

1.文件存储在设备上的私有空间下,只有当前应用才能访问

2.存储数据的大小受到设备可用存储空间的限制,因此适用于少量数据存储

3.当用户卸载应用时,应用私有的内部存储空间也会被删除

二、外部存储

Android应用的外部存储是设备上所有应用共有的文件存储空间。它适用于存储大量数据并且这些数据需要在不同应用间共享的场景。此外,外部存储对于一些需要长时间保存的文件(例如用户录制的视频)也非常适合。以下是外部存储的一些特点:

1.应用可以通过Context.getExternalFilesDir()方法获得外部存储目录下的一个私有目录,在该目录下存储的数据只能由该应用访问

2.外部存储还包括公有目录,其中包括Download、Pictures、Music、Movies、DCIM、Documents等目录,存储在公有目录下的数据可被所有应用访问

3.存储在外部存储中的数据可能会被用户删除或设备清理,因此开发人员需要注意备份和数据恢复等问题

// 内部存储
String fileName = "internal.txt";
String content = "hello world!";
FileOutputStream fos = null;
try {
    fos = openFileOutput(fileName, MODE_PRIVATE);
    fos.write(content.getBytes());
    fos.close();
} catch (IOException e) {
    e.printStackTrace();
}

// 外部存储
String fileName = "external.txt";
String content = "hello world!";
File file = new File(getExternalFilesDir(null), fileName);
FileOutputStream fos = null;
try {
    fos = new FileOutputStream(file);
    fos.write(content.getBytes());
    fos.close();
} catch (IOException e) {
    e.printStackTrace();
}

三、SharedPreferences

SharedPreferences可用于存储轻量级的简单数据,例如应用设置、用户偏好等。它通过键值对的形式存储数据,并且存储在设备上的xml文件中。以下是SharedPreferences的一些特点:

1.应用可以通过Context.getSharedPreferences()方法获得一个SharedPreferences对象,对象可被多个组件共享

2.存储的数据不适合大量或敏感数据

3.当用户卸载应用时,SharedPreferences中的数据也会被删除

SharedPreferences sp = getSharedPreferences("my_sp", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("username", "john");
editor.apply();

String username = sp.getString("username", "");

四、数据库存储

SQLite是Android系统默认的关系型数据库,可用于存储大量复杂的结构化数据。它提供了标准的SQL语句操作,结合ContentProvider可方便地对外提供数据。以下是SQLite的一些特点:

1. SQLite的数据库文件存储在设备上的内部或外部存储,但它可以通过ContentProvider和ContentResolver对外提供数据接口,数据可以被其他应用访问

2. SQLite具有ACID事务,可确保数据的完整性和一致性

3. 当用户卸载应用时,数据库中的数据也会被删除

public class MyDatabaseHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "my_db";
    private static final int DB_VERSION = 1;
    public static final String TABLE_NAME = "student";
    public static final String COL_ID = "_id";
    public static final String COL_NAME = "name";
    public static final String COL_AGE = "age";

    public MyDatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String sql = "CREATE TABLE " + TABLE_NAME + "(" +
                COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                COL_NAME + " TEXT NOT NULL," +
                COL_AGE + " INTEGER);";
        sqLiteDatabase.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;
        sqLiteDatabase.execSQL(sql);
        onCreate(sqLiteDatabase);
    }
}

MyDatabaseHelper helper = new MyDatabaseHelper(context);
SQLiteDatabase db = helper.getReadableDatabase();

ContentValues values = new ContentValues();
values.put(MyDatabaseHelper.COL_NAME, "Tom");
values.put(MyDatabaseHelper.COL_AGE, 18);
long rowId = db.insert(MyDatabaseHelper.TABLE_NAME, null, values);

Cursor cursor = db.query(
        MyDatabaseHelper.TABLE_NAME,
        new String[]{MyDatabaseHelper.COL_ID, MyDatabaseHelper.COL_NAME, MyDatabaseHelper.COL_AGE},
        null,
        null,
        null,
        null,
        null
);

while (cursor.moveToNext()) {
    int id = cursor.getInt(cursor.getColumnIndex(MyDatabaseHelper.COL_ID));
    String name = cursor.getString(cursor.getColumnIndex(MyDatabaseHelper.COL_NAME));
    int age = cursor.getInt(cursor.getColumnIndex(MyDatabaseHelper.COL_AGE));
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/271528.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-16 14:56
下一篇 2024-12-16 14:56

相关推荐

发表回复

登录后才能评论