一、什麼是數據持久化
在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
微信掃一掃
支付寶掃一掃