一、什麼是數據持久化
在Android中,數據持久化是將數據保存在應用程序中,使得在程序關閉後,數據也不會丟失,並能夠在下一次啟動應用程序時讀取這些數據。
數據持久化的方式有很多種,比如說SharedPreferences、SQLite數據庫、文件存儲、Content Provider等。
其中,SharedPreferences是一種輕量級的數據存儲方式,適合存儲少量的數據,SQLite數據庫適合存儲大量的結構化數據,文件存儲則適合存儲一些大型文件,而Content Provider適合在多個應用程序之間共享數據。
二、SharedPreferences
SharedPreferences是Android中一種輕量級的存儲方式,適用於存儲一些簡單的鍵值對。SharedPreferences提供了讀取和寫入數據的方法,可以在應用程序的任意位置進行操作,無需通過Content Provider或文件操作進行讀寫。
SharedPreferences的使用非常簡單,只需要使用getSharedPreferences()方法獲取SharedPreferences對象,然後就可以使用putXXX()和getXXX()方法進行存儲和讀取數據了。
// 存儲數據 SharedPreferences sharedPreferences = getSharedPreferences("MyData", MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("username", "Tom"); editor.putBoolean("is_login", true); editor.commit(); // 讀取數據 String username = sharedPreferences.getString("username", ""); boolean isLogin = sharedPreferences.getBoolean("is_login", false);
三、SQLite數據庫
在Android中,SQLite數據庫是一種基於文件的輕量級數據庫,適合存儲大量的結構化數據。SQLite數據庫使用SQL語言進行操作,可以進行搜索、排序、過濾等操作。
首先,需要定義數據庫的表和表的字段,然後使用SQLiteOpenHelper類對數據庫進行管理。其中,onCreate()方法用於創建數據庫和表,onUpgrade()方法用於升級數據庫。
使用SQLiteOpenHelper類可以進行數據庫的創建、更新和刪除,同時可以使用SQLiteDatabase類進行數據的讀寫操作。
// 創建數據庫 public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "MyDB"; private static final int DATABASE_VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE user (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 user"); onCreate(db); } } // 使用數據庫 MyDatabaseHelper helper = new MyDatabaseHelper(context); SQLiteDatabase db = helper.getWritableDatabase(); // 插入數據 ContentValues values = new ContentValues(); values.put("name", "Tom"); values.put("age", 20); db.insert("user", null, values); // 更新數據 ContentValues values = new ContentValues(); values.put("age", 21); db.update("user", values, "name=?", new String[]{"Tom"}); // 刪除數據 db.delete("user", "id=?", new String[]{"1"}); // 查詢數據 Cursor cursor = db.query("user", new String[]{"id","name","age"}, null, null, null, null, "age DESC"); if (cursor.moveToFirst()) { do { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); } while (cursor.moveToNext()); } cursor.close(); db.close();
四、文件存儲
文件存儲是一種與具體數據和數據結構無關的存儲方式,可以用於存儲一些文件或者文本信息。在Android中,文件存儲可以使用FileOutputStream和FileInputStream實現。
通過FileOutputStream可以將數據寫入文件,通過FileInputStream可以從文件中讀取數據。在進行文件存儲時,需要注意文件存儲的路徑,應該將數據存儲在Android指定的目錄下。
// 文件存儲 String fileName = "data.txt"; String fileContent = "This is a file."; FileOutputStream outputStream = null; try { outputStream = openFileOutput(fileName, MODE_PRIVATE); outputStream.write(fileContent.getBytes()); outputStream.flush(); Log.i(TAG, "文件存儲成功!"); } catch (Exception e) { Log.e(TAG, "文件存儲失敗:" + e.getMessage()); } finally { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } // 文件讀取 try { FileInputStream inputStream = openFileInput(fileName); byte[] bytes = new byte[inputStream.available()]; inputStream.read(bytes); String fileContent = new String(bytes); Log.i(TAG, "文件讀取成功,內容為:" + fileContent); } catch (Exception e) { Log.e(TAG, "文件讀取失敗:" + e.getMessage()); }
五、Content Provider
Content Provider是一種跨進程的數據管理方式,可以將數據暴露給其他應用程序使用。Content Provider可以在AndroidManifest.xml中進行註冊,在應用程序中通過URI訪問數據。
使用Content Provider時,需要定義數據的URI以及相應的數據類型和操作方式。Content Provider還需要繼承ContentProvider基類,實現查詢、插入、更新和刪除等方法。
// 定義URI public static final String AUTHORITY = "com.example.provider"; public static final Uri USER_URI = Uri.parse("content://" + AUTHORITY + "/user"); // 映射數據類型 public static final int USERS = 1; public static final String USER_TYPE = "vnd.android.cursor.dir/vnd.com.example.provider.user"; // 創建ContentProvider public class MyContentProvider extends ContentProvider { private MyDatabaseHelper dbHelper; private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); static { URI_MATCHER.addURI(AUTHORITY, "user", USERS); } @Override public boolean onCreate() { dbHelper = new MyDatabaseHelper(getContext()); return true; } @Nullable @Override public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = null; switch (URI_MATCHER.match(uri)) { case USERS: cursor = db.query("user",projection,selection,selectionArgs,null,null,sortOrder); break; } return cursor; } @Nullable @Override public String getType(@NonNull Uri uri) { switch (URI_MATCHER.match(uri)) { case USERS: return USER_TYPE; } return null; } @Nullable @Override public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { SQLiteDatabase db = dbHelper.getWritableDatabase(); Uri result = null; switch (URI_MATCHER.match(uri)) { case USERS: long id = db.insert("user",null,values); result = ContentUris.withAppendedId(uri, id); break; } return result; } @Override public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) { SQLiteDatabase db = dbHelper.getWritableDatabase(); int rows = 0; switch (URI_MATCHER.match(uri)) { case USERS: rows = db.update("user",values,selection,selectionArgs); break; } return rows; } @Override public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) { SQLiteDatabase db = dbHelper.getWritableDatabase(); int rows = 0; switch (URI_MATCHER.match(uri)) { case USERS: rows = db.delete("user",selection,selectionArgs); break; } return rows; } } // 使用Content Provider ContentResolver resolver = context.getContentResolver(); // 查詢數據 String[] projection = {"id","name","age"}; Cursor cursor = resolver.query(MyContentProvider.USER_URI,projection,null,null,"age DESC"); if (cursor.moveToFirst()) { do { int id = cursor.getInt(cursor.getColumnIndex("id")); String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); } while (cursor.moveToNext()); } cursor.close(); // 插入數據 ContentValues values = new ContentValues(); values.put("name", "Tom"); values.put("age", 20); Uri resultUri = resolver.insert(MyContentProvider.USER_URI, values); // 更新數據 values.clear(); values.put("age", 21); int rows = resolver.update(MyContentProvider.USER_URI, values, "name=?", new String[]{"Tom"}); // 刪除數據 rows = resolver.delete(MyContentProvider.USER_URI, "id=?", new String[]{"1"});
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/156830.html