android 中导出数据

来源:互联网 发布:女性假两性畸形 知乎 编辑:程序博客网 时间:2024/06/15 02:18

思路很简单:

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();}}}

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <Button        android:id="@+id/main_btn_export"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="导出联系人" />    <TextView        android:id="@+id/main_tv_show"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></LinearLayout>

权限:

 <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />




 

0 0