Android数据持久化操作全解析
立即解锁
发布时间: 2025-08-24 00:17:38 阅读量: 2 订阅数: 4 

### Android 数据持久化操作全解析
在 Android 开发中,数据持久化是一个重要的环节,它涉及到数据库操作、数据备份、共享等多个方面。本文将详细介绍 Android 数据持久化的相关操作,包括数据库的查询、备份、恢复以及数据库的共享等内容。
#### 1. 数据库基本操作与连接管理
在 Android 应用中,当不再需要数据库和游标连接时,关闭它们是非常重要的。例如,在 `onPause()` 方法中,当 Activity 不再处于前台时,可以关闭这些连接。
使用 `SimpleCursorAdapter` 可以将数据库中的数据映射到标准的 Android 两行列表项视图。通过字符串和整数数组参数来构成映射关系,字符串数组中每个项的数据将被插入到具有相应 ID 值的视图中。需要注意的是,这里传递的列名列表与查询时传递的数组略有不同,因为在进行其他操作时需要知道记录 ID,但在将数据映射到用户界面时,该 ID 并非必需。
用户可以在文本字段中输入姓名,然后点击“Add New Person”按钮,创建新的 `ContentValues` 并将其插入到数据库中。为了使 UI 显示这些更改,需要调用 `Cursor.requery()` 和 `ListAdapter.notifyDataSetChanged()`。相反,点击列表中的某一项将从数据库中删除该项。为了实现这一操作,需要构造一个简单的 SQL 语句,告诉数据库仅删除 `_id` 值与所选内容匹配的记录。之后,游标和列表适配器将再次刷新。
获取所选内容的 `_id` 值的方法是将游标移动到所选位置,并调用 `getString(0)` 来获取列索引为零的值。这是因为在查询的列列表中,第一个参数(索引为 0)是 `_id`。删除语句由两个参数组成:语句字符串和参数。传递数组中的参数将被插入到字符串中出现问号的位置。
#### 2. 数据库查询操作
当应用使用 `SQLiteDatabase` 时,可能需要返回其中特定的数据子集。可以使用完全结构化的 SQL 查询来创建特定数据的过滤器,并从数据库中返回这些子集。`SQLiteDatabase.query()` 方法有多种重载形式,下面是最详细的一种:
```java
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
```
各参数的含义如下:
| 参数 | 含义 |
| ---- | ---- |
| `table` | 要查询数据的表 |
| `columns` | 每个记录中希望访问的列 |
| `selection` | 给定查询的 SQL WHERE 子句 |
| `selectionArgs` | 如果 `selection` 中有问号,这些项将填充这些字段 |
| `groupBy` | 给定查询的 SQL GROUP BY 子句 |
| `having` | 给定查询的 SQL HAVING 子句 |
| `orderBy` | 给定查询的 SQL ORDER BY 子句 |
| `limit` | 查询返回的最大结果数 |
下面是一些常见的查询示例:
- **返回值与给定参数匹配的所有行**:
```java
String[] COLUMNS = new String[] {COL_NAME, COL_DATE};
String selection = COL_NAME+" = ?";
String[] args = new String[] {"NAME_TO_MATCH"};
Cursor result = db.query(TABLE_NAME, COLUMNS, selection, args, null, null, null, null);
```
- **返回数据库中最后插入的 10 行**:
```java
String orderBy = "_id DESC";
String limit = "10";
Cursor result = db.query(TABLE_NAME, COLUMNS, null, null, null, null, orderBy, limit);
```
- **返回日期字段在指定范围内的行**:
```java
String[] COLUMNS = new String[] {COL_NAME, COL_DATE};
String selection = "datetime("+COL_DATE+") > datetime(?)"+
" AND datetime("+COL_DATE+") < datetime(?)";
String[] args = new String[] {"2000-1-1 00:00:00","2000-12-31 23:59:59"};
Cursor result = db.query(TABLE_NAME, COLUMNS, selection, args, null, null, null, null);
```
- **返回整数字段在指定范围内的行**:
```java
String[] COLUMNS = new String[] {COL_NAME, COL_AGE};
String selection = COL_AGE+" > ? AND "+COL_AGE+" < ?";
String[] args = new String[] {"7","10"};
Cursor result = db.query(TABLE_NAME, COLUMNS, selection, args, null, null, null, null);
```
#### 3. 数据备份操作
当应用将数据持久化存储在设备上时,需要为用户提供一种备份和恢复数据的方法,以便在更换设备或重新安装应用时使用。可以使用设备的外部存储作为安全的位置来复制数据库和其他文件。外部存储通常是可物理移除的,用户可以将其放置在另一台设备上进行恢复。即使无法这样做,当用户将设备连接到计算机时,也可以挂载外部存储,从而进行数据传输。
下面是一个实现数据备份和恢复的 `AsyncTask` 示例:
```java
public class BackupTask extends AsyncTask<String,Void,Integer> {
public interface CompletionListener {
void onBackupComplete();
void onRestoreComplete();
void onError(int errorCode);
}
public static final int BACKUP_SUCCESS = 1;
public static final int RESTORE_SUCCESS = 2;
public static final int BACKUP_ERROR = 3;
public static final int RESTORE_NOFILEERROR = 4;
public static final String COMMAND_BACKUP = "backupDatabase";
public static final String COMMAND_RESTORE = "restoreDatabase";
private Context mContext;
private CompletionListener listener;
public BackupTask(Context context) {
super();
mContext = context;
}
public void setCompletionListener(CompletionListener aListener) {
listener = aListener;
}
@Override
protected Integer doInBackground(String... params) {
//Get a reference to the database
File dbFile = mContext.getDatabasePath("mydb");
//Get a reference to the directory location for the backup
File exportDir = new File(Environment.getExternalStorageDirectory(), "myAppBackups");
if (!exportDir.exists()) {
exportDir.mkdirs();
}
File backup = new File(exportDir, dbFile.getName());
//Check the required operation
String command = params[0];
if(command.equals(COMMAND_BACKUP)) {
//Attempt file copy
try {
backup.createNewFile();
fileCopy(dbFile, backup);
return BACKUP_SUCCESS;
} catch (IOException e) {
return BACKUP_ERROR;
}
} else if(command.equals(COMMAND_RESTORE)) {
//Attempt file copy
try {
if(!backup.exists()) {
return RESTORE_NOFILEERROR;
}
dbFile.createNewFile();
fileCopy(backup, dbFile);
return RESTORE_SUCCESS;
} catch (IOException e) {
return BACKUP_ERROR;
}
} else {
return BACKUP_ERROR;
}
}
@Override
protected void onPostExecute(Integer result) {
switch(result) {
case BACKUP_SUCCESS:
if(listener != null) {
listener.onBackupComplete();
}
break;
case RESTORE_SUCCESS:
if(listener != null) {
listener.onRestoreComplete();
}
break;
case RESTORE_NOFILEERROR:
if(listener != null) {
listener.onError(RESTORE_NOFILEERROR);
}
break;
default:
if(lis
```
0
0
复制全文
相关推荐









