Android中的Persistent,如何更好地管理應用的數據

一、什麼是數據持久化

在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-hant/n/156830.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-18 01:58
下一篇 2024-11-18 01:58

相關推薦

  • Python讀取CSV數據畫散點圖

    本文將從以下方面詳細闡述Python讀取CSV文件並畫出散點圖的方法: 一、CSV文件介紹 CSV(Comma-Separated Values)即逗號分隔值,是一種存儲表格數據的…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • 如何用Python統計列表中各數據的方差和標準差

    本文將從多個方面闡述如何使用Python統計列表中各數據的方差和標準差, 並給出詳細的代碼示例。 一、什麼是方差和標準差 方差是衡量數據變異程度的統計指標,它是每個數據值和該數據值…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29
  • Python爬取公交數據

    本文將從以下幾個方面詳細闡述python爬取公交數據的方法: 一、準備工作 1、安裝相關庫 import requests from bs4 import BeautifulSou…

    編程 2025-04-29
  • Python兩張表數據匹配

    本篇文章將詳細闡述如何使用Python將兩張表格中的數據匹配。以下是具體的解決方法。 一、數據匹配的概念 在生活和工作中,我們常常需要對多組數據進行比對和匹配。在數據量較小的情況下…

    編程 2025-04-29
  • Python數據標準差標準化

    本文將為大家詳細講述Python中的數據標準差標準化,以及涉及到的相關知識。 一、什麼是數據標準差標準化 數據標準差標準化是數據處理中的一種方法,通過對數據進行標準差標準化可以將不…

    編程 2025-04-29
  • 如何使用Python讀取CSV數據

    在數據分析、數據挖掘和機器學習等領域,CSV文件是一種非常常見的文件格式。Python作為一種廣泛使用的編程語言,也提供了方便易用的CSV讀取庫。本文將介紹如何使用Python讀取…

    編程 2025-04-29
  • Python如何打亂數據集

    本文將從多個方面詳細闡述Python打亂數據集的方法。 一、shuffle函數原理 shuffle函數是Python中的一個內置函數,主要作用是將一個可迭代對象的元素隨機排序。 在…

    編程 2025-04-29
  • Python根據表格數據生成折線圖

    本文將介紹如何使用Python根據表格數據生成折線圖。折線圖是一種常見的數據可視化圖表形式,可以用來展示數據的趨勢和變化。Python是一種流行的編程語言,其強大的數據分析和可視化…

    編程 2025-04-29

發表回復

登錄後才能評論