思路很簡單:
1、將資料庫的資料讀取出來,並根據需要作相應處理。
2、將資料寫入SD卡
下面以匯出系統連絡人為例:
MainActivity:
package com.home.exportcontact;import java.io.File;import java.io.FileWriter;import java.io.IOException;import android.app.Activity;import android.app.AlertDialog;import android.content.Context;import android.content.DialogInterface;import android.database.Cursor;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.provider.ContactsContract;import android.provider.ContactsContract.CommonDataKinds.Phone;import android.provider.ContactsContract.CommonDataKinds.StructuredName;import android.provider.ContactsContract.Contacts.Data;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener {private Button exportBtn;// 匯出按鈕private TextView showText;// 顯示進度的文本// 匯出txt的存放位置private final static String OUTPUT_PATH = Environment.getExternalStorageDirectory() + "/我的連絡人.txt";private static final int OUTPUT_FAIL = 0;// 匯出失敗標識private static final int OUTPUT_SUCCESS = 1;// 匯出成功標識private static int count;// 匯出連絡人的計數private Thread mOutputThread;// 匯出連絡人線程// 空格private static final String SPACE_1 = " ";private static final String SPACE_2 = SPACE_1 + SPACE_1;private static final String SPACE_4 = SPACE_2 + SPACE_2;private static final String SPACE_8 = SPACE_4 + SPACE_4;private static final String SPACE_11 = SPACE_8 + SPACE_2 + SPACE_1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);exportBtn = (Button) findViewById(R.id.main_btn_export);exportBtn.setOnClickListener(this);showText = (TextView) findViewById(R.id.main_tv_show);}@Overridepublic void onClick(View v) {if (v == exportBtn) {outputContact();}}/** * 匯出連絡人入口 */private void outputContact() {File file = new File(OUTPUT_PATH);if (!file.exists()) {startOutputContact();} else {createDialog(this, "警告", "我的連絡人.txt已經存在,是否覆蓋?");}}/** * 建立提示對話方塊 * * @param context * @param title * @param message */private void createDialog(Context context, String title, String message) {AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setTitle(title);builder.setMessage(message);builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int whichButton) {startOutputContact();}});builder.setNeutralButton("取消", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int whichButton) {dialog.cancel();}});builder.show();}/** * 開啟匯出連絡人子線程 */private void startOutputContact() {setOutputWidgetEnabled(false);showText.setText("正在匯出連絡人...");if (mOutputThread != null) {mOutputThread.interrupt();mOutputThread = null;}mOutputThread = new Thread(new OutputRunnable(this));if (mOutputThread != null) {mOutputThread.start();}}/** * 設定匯出組件的可用性 */private void setOutputWidgetEnabled(boolean enabled) {exportBtn.setEnabled(enabled);if (!enabled) {showText.setText("");}}class OutputRunnable implements Runnable {private Context context;public OutputRunnable(Context context) {this.context = context;}@Overridepublic void run() {boolean result = doOutputContact(context);if (result) {handler.sendEmptyMessage(OUTPUT_SUCCESS);} else {handler.sendEmptyMessage(OUTPUT_FAIL);}}}/** * 處理UI提示相關 */private Handler handler = new Handler() {public void handleMessage(Message msg) {if (msg.what == OUTPUT_SUCCESS) {showText.setText((String.format("已成功匯出 %d 條連絡人記錄", count)));setOutputWidgetEnabled(true);} else if (msg.what == OUTPUT_FAIL) {showText.setText("匯入連絡人失敗");setOutputWidgetEnabled(true);}}};/** * 從資料庫中匯出連絡人 * * @param context * @return 是否成功 */private boolean doOutputContact(Context context) {count = 0;try {String result = readFromContactDatabase(context);writeFile(OUTPUT_PATH, result);} catch (Exception e) {return false;}return true;}/** * 從資料庫中讀取連絡人相關資訊 * * @param context * @return 資訊結果 */private String readFromContactDatabase(Context context) {StringBuilder resultBuilder = new StringBuilder();Cursor cursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI,new String[] { StructuredName.DISPLAY_NAME,Data.RAW_CONTACT_ID }, Data.MIMETYPE + "= ?",new String[] { StructuredName.CONTENT_ITEM_TYPE }, null);while (cursor.moveToNext()) {// 得到名稱和每一行記錄的IDString displayName = cursor.getString(0);int id = cursor.getInt(1);// 得到電話號碼的遊標Cursor mobileCursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI,new String[] { Phone.NUMBER },Data.RAW_CONTACT_ID + " = " + id + " AND " + Data.DATA2+ " = " + 2, null, null);String mobileNum = "";if (mobileCursor.moveToNext()) {mobileNum = mobileCursor.getString(0);}mobileCursor.close();// 得到家庭電話Cursor homeCursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI,new String[] { Phone.NUMBER },Data.RAW_CONTACT_ID + " = " + id + " AND " + Data.DATA2+ " = " + 1, null, null);String homeNum = "";if (homeCursor.moveToNext()) {homeNum = homeCursor.getString(0);}homeCursor.close();if (displayName != null && !"".equals(displayName)) {String result = displayName + SPACE_4;if ("".equals(mobileNum)) {result += SPACE_11;} else {result += mobileNum;}result += SPACE_8 + homeNum + '\n';String checkString = resultBuilder.toString();if (!checkString.contains(result)&& ("".equals(mobileNum) || !checkString.contains(mobileNum))) {resultBuilder.append(result);count++;}}}cursor.close();return resultBuilder.toString();}/** * 將連絡人資訊寫入SD * * @param path * @param info */private void writeFile(String path, String info) {try {File file = new File(path);FileWriter writer = new FileWriter(file, false);writer.write(info);writer.close();} catch (IOException e) {e.printStackTrace();}}}
布局:
許可權: