随时随地技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、QQ技术交流群(183198395)。

接着android 中导出数据 一文,下面介绍在android中导入数据的思路:

1、将数据从文本中读取出来

2、封装处理成自己想要的对象或模型

3、将处理好的数据对象插入自己应用的数据库中

4、更新UI显示

下面仍以导入联系人至系统中为例,若是导入自己的应用中,思路一样甚至更简单,代码如下:

注:我的联系人.txt的格式即为android 中导出数据 一文生成的格式

MainActivity:

package com.home.impcontact;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.provider.ContactsContract.RawContacts;
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;
import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {private Button btn;// 导入按钮private TextView show;// 显示结果的文本框private Thread addThread;// 增加联系人线程private static final int ADD_FAIL = 0;// 导入失败标识private static final int ADD_SUCCESS = 1;// 导入成功标识private static int successCount = 0;// 导入成功的计数private static int failCount = 0;// 导入失败的计数// 默认文件路劲,实际情况应作相应修改或从界面输入或浏览选择private static final String PATH = Environment.getExternalStorageDirectory() + "/我的联系人.txt";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);init();}/*** 初始化组件*/private void init() {btn = (Button) findViewById(R.id.main_btn);btn.setOnClickListener(this);show = (TextView) findViewById(R.id.main_tv);}@Overridepublic void onClick(View v) {if (v == btn) {addContact();}}/*** 导入联系人入口*/private void addContact() {if (!new File(PATH).exists()) {Toast.makeText(this, "文件不存在!", Toast.LENGTH_SHORT).show();show.setText("文件不存在!");return;}if (addThread != null) {addThread.interrupt();addThread = null;}addThread = new Thread(new AddRunnable(this, PATH));createDialog(this, "警告", "确保你是第一次导入,重复导入会创建新的联系人,请慎用!");}/*** 创建提示对话框* * @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) {startAddContact();}});builder.setNeutralButton("取消", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int whichButton) {dialog.cancel();}});builder.show();}/*** 开启导入线程*/private void startAddContact() {setAddWidgetEnabled(false);show.setText("正在导入联系人...");if (addThread != null) {addThread.start();}}class AddRunnable implements Runnable {private Context context;private String path;public AddRunnable(Context context, String path) {this.path = path;this.context = context;}@Overridepublic void run() {boolean result = importContact(context, path);if (result) {handler.sendEmptyMessage(ADD_SUCCESS);} else {handler.sendEmptyMessage(ADD_FAIL);}}}/*** 处理UI相关的handler*/private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case ADD_FAIL:show.setText("导入联系人失败");setAddWidgetEnabled(true);break;case ADD_SUCCESS:show.setText(String.format("导入联系人成功 %d 条,失败 %d 条",successCount, failCount));setAddWidgetEnabled(true);break;}}};/*** 设置导入组件的可用性* * @param enabled*/private void setAddWidgetEnabled(boolean enabled) {btn.setEnabled(enabled);if (!enabled) {show.setText("");}}/*** 导入联系人* * @param context* @param path* @return*/private boolean importContact(Context context, String path) {successCount = 0;failCount = 0;try {ArrayList<ContactInfo> list = readFromFile(path);if (list == null) {return false;}for (int i = 0; i < list.size(); i++) {ContactInfo info = list.get(i);if (doAddContact(context, info)) {successCount++;}}} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 读取联系人并封装成ContactInfo对象集合* * @param path* @return contactsList*/private ArrayList<ContactInfo> readFromFile(String path) {ArrayList<String> strsList = doReadFile(path);if (strsList == null) {return null;}ArrayList<ContactInfo> contactsList = handleReadStrs(strsList);return contactsList;}/*** 将读出来的内容封装成ContactInfo对象集合* * @param strsList* @return*/private ArrayList<ContactInfo> handleReadStrs(ArrayList<String> strsList) {ArrayList<ContactInfo> contactsList = new ArrayList<ContactInfo>();for (int i = 0; i < strsList.size(); i++) {String info = strsList.get(i);String[] infos = info.split("\\s{2,}");String displayName = null;String mobileNum = null;String homeNum = null;switch (infos.length) {case 0:continue;case 1:displayName = infos[0];break;case 2:displayName = infos[0];if (infos[1].length() >= 11) {mobileNum = infos[1];} else {homeNum = infos[1];}break;default:// length >= 3displayName = infos[0];mobileNum = infos[1];homeNum = infos[2];}if (displayName == null || "".equals(displayName)) {failCount++;continue;}contactsList.add(new ContactInfo(displayName, mobileNum, homeNum));}return contactsList;}/*** 读取文件内容* * @param path* @return*/private ArrayList<String> doReadFile(String path) {FileInputStream in = null;ArrayList<String> arrayList = new ArrayList<String>();try {byte[] tempbytes = new byte[1 << 24];in = new FileInputStream(path);while (in.read(tempbytes) != -1) {int length = 0;int first = length;for (int i = 0; i < tempbytes.length; i++) {if (tempbytes[i] == '\n') {length = i;byte[] nowBytes = new byte[length - first];System.arraycopy(tempbytes, first, nowBytes, 0, length- first);arrayList.add(new String(nowBytes, "utf-8").trim());first = i + 1;}}}} catch (Exception e1) {return null;} finally {if (in != null) {try {in.close();} catch (IOException e1) {return null;}}}return arrayList;}/*** 向数据库表插入联系人信息* * @param context* @param contactInfo* @return*/private boolean doAddContact(Context context, ContactInfo contactInfo) {try {ContentValues contentValues = new ContentValues();Uri uri = context.getContentResolver().insert(RawContacts.CONTENT_URI, contentValues);long rowId = ContentUris.parseId(uri);String name = contactInfo.getDisplayName();String mobileNum = contactInfo.getMobileNum();String homeNum = contactInfo.getHomeNum();// 插入姓名if (name != null) {contentValues.clear();contentValues.put(Data.RAW_CONTACT_ID, rowId);contentValues.put(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE);int index = name.length() / 2;String displayName = name;String givenName = null;String familyName = null;// 检查是否是英文名称if (checkEnglishName(displayName) == false) {givenName = name.substring(index);familyName = name.substring(0, index);} else {givenName = familyName = displayName;}contentValues.put(StructuredName.DISPLAY_NAME, displayName);contentValues.put(StructuredName.GIVEN_NAME, givenName);contentValues.put(StructuredName.FAMILY_NAME, familyName);context.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, contentValues);}if (mobileNum != null) {// 插入手机电话contentValues.clear();contentValues.put(Data.RAW_CONTACT_ID, rowId);contentValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);contentValues.put(Phone.NUMBER, mobileNum);contentValues.put(Phone.TYPE, Phone.TYPE_MOBILE);context.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, contentValues);}if (homeNum != null) {// 插入家庭号码contentValues.clear();contentValues.put(Data.RAW_CONTACT_ID, rowId);contentValues.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);contentValues.put(Phone.NUMBER, homeNum);contentValues.put(Phone.TYPE, Phone.TYPE_HOME);context.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, contentValues);}} catch (Exception e) {return false;}return true;}/*** 检查是否是英文名称* * @param name* @return*/private boolean checkEnglishName(String name) {char[] nameChars = name.toCharArray();for (int i = 0; i < nameChars.length; i++) {if ((nameChars[i] >= 'a' && nameChars[i] <= 'z')|| (nameChars[i] >= 'A' && nameChars[i] <= 'Z')) {continue;}return false;}return true;}
}

联系人实体类ContactInfo:

package com.home.impcontact;public class ContactInfo {/** 名称 */private String displayName;/** 手机号 */private String mobileNum;/** 家庭电话 */private String homeNum;public ContactInfo(String displayName, String mobileNum, String homeNum) {this.displayName = displayName;this.mobileNum = mobileNum;this.homeNum = homeNum;}public String getDisplayName() {return displayName;}public String getMobileNum() {return mobileNum;}public String getHomeNum() {return homeNum;}
}

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><Buttonandroid:id="@+id/main_btn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="导入联系人" /><TextViewandroid:id="@+id/main_tv"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" />

android中导入数据相关推荐

  1. 把json数据导入linux,使用json文件给es中导入数据

    使用json文件可以给es中导入数据,10万条左右的数据可以一次导入,数量太大时导入就会报错.大数量的到导入还是需要用bulk方式. accounts.json文件格式如下: {"index ...

  2. excel文件导入hive乱码_hive 从Excel中导入数据

    拿到Excel表后将数据保留,其他的乱七八糟都删掉,然后另存为txt格式的文本,用nodepad++将文本转换为UTF-8编码,此处命名为cityprovince.txt 将cityprovince. ...

  3. 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法...

    注意,64位系统,用64位的补丁文件; https://www.cnblogs.com/A2008A/articles/2438962.html 操作系统:使用的是64位的Windows Server ...

  4. 数据库-表中导入数据-insert

    表中导入数据 在表中导入数据的方式有两种 第一种:将以上数据整理成SQL语句,insert into pet.... 第二种:通过加载文件的方式将数据导入到表中 1.创建一个pet.txt的文件(注: ...

  5. python 数据导入mysql_用python批量向数据库(MySQL)中导入数据

    用python批量向数据库(MySQL)中导入数据 现有数十万条数据,如下的经过打乱处理过的数据进行导入 数据库内部的表格的数据格式如下与下面的表格结构相同Current database: pyth ...

  6. android listview 数据同步,android中ListView数据刷新时的同步方法

    本文实例讲述了android中ListView数据刷新时的同步方法.分享给大家供大家参考.具体实现方法如下: public class Main extends BaseActivity { priv ...

  7. sqoop动态分区导入mysql,使用sqoop import从mysql往hive含分区表中导入数据的一些注意事项...

    先看下面这条语句,它实现的功能是将特定日期的数据从mysql表中直接导入hive $ sqoop import \ --connect jdbc:mysql://192.168.xx.xx:3306/ ...

  8. Android中XML数据解析

    转载请注明出处:http://blog.csdn.net/yegongheng/article/details/38296207 XML初步 今天我们来学习另一种非常重要的数据交换格式-XML.XML ...

  9. android libbfaac.so,Android中Json数据读取与创建

    一:  Json的特性和在数据交互中的地位就不用说了,直接看案例. 首先在android studio中创建assets文件目录,用于存放Json数据文件,android studio 1.3 默认项 ...

最新文章

  1. openjdk-alpine镜像无法打印线程堆栈和内存堆栈问题
  2. 数据分析常用功能:巧用门户制作功能,让多个报表一览无余
  3. 黑发不知勤学早,白首方悔读书迟———颜真卿
  4. linux给文件添加链接,Linux给文件或目录创建软链接或硬链接的方法
  5. iptables oracle策略,利用iptables防火墙保护Oracle数据库
  6. html中取消li的点击事件,jquery设置html li点击click事件为什么无法赋值到表单input value中呢?...
  7. 如何 sizing 一台物理机上可以承载多少 VMware 虚拟机? 分享 Vsphere HA 几个实用知识点
  8. 实体(Entity)和模型(Model)
  9. 日期和时间的格式化定义(ISO C89)
  10. Julia: 由0.3 升级到0.4 版本的变化
  11. 单片机编程软件很简单(六),V5.29 keil mdk单片机编程软件新特性+烧写程序
  12. JS日历控件 (兼容IE firefox) 可选择时间
  13. 求饶不经过原点的旋转轴的旋转矩阵
  14. 谈谈古典的《拆掉思维里的墙》
  15. (Emitted value instead of an instance of Error) postcss-viewport-units:
  16. ubuntu 双屏显示的设置
  17. iframe解决跳转登录界面问题
  18. 三大世界级难题,等你来解答
  19. C#增加SVN版本管控方法
  20. python 基础之 控制结构 篇

热门文章

  1. C#语言俄罗斯方块源代码(据陈广老师视频)
  2. python正则匹配两个字符之间的内容(转自:小晓酱手记)
  3. 【Linux系统】利用手机端juiceSSH远程控制Linux终端
  4. C语言中#undef的用法
  5. 机器学习-贝叶斯分类器(附Python代码)
  6. git命令行新建分支,并推送至远程分支(git 新建远程分支)
  7. Java 简单实现计算器
  8. 复杂系统学习(六):细胞自动机II:实现一个模型
  9. 关于C#下使用轻量级数据库的一些经验
  10. pytorch张量复制clone()和detach()