一、内部存储
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)); }