在Android中将.csv文件导入Sqlite

我有一个.csv文件,我想导入这个文件放到我的数据库在Android。

例如,.csv文件:

| id | name | dt1 | dt2 | dt3 | | 1 | Paul | 21 | 98 | 91 | | 2 | John | 22 | 44 | 11 | | 3 | George| 21 | 31 | 22 | | 4 | Ringo | 20 | 10 | 15 | 

对于这样的事情:

 Cursor cursor = getWritableDatabase(). rawQuery("Insert into table1(_id, name, dt1, dt2, dt3) values ( 1, Paul, 21, 98, 91) values ( 2, John, 22, 44, 11) values ( 3, George, 21,31,22) values ( 4, Ringo, 20, 10,15);"); 

所以请,我该怎么做?

尝试下面的代码,

 FileReader file = new FileReader(fileName); BufferedReader buffer = new BufferedReader(file); String line = ""; String tableName ="TABLE_NAME"; String columns = "_id, name, dt1, dt2, dt3"; String str1 = "INSERT INTO " + tableName + " (" + columns + ") values("; String str2 = ");"; db.beginTransaction(); while ((line = buffer.readLine()) != null) { StringBuilder sb = new StringBuilder(str1); String[] str = line.split(","); sb.append("'" + str[0] + "',"); sb.append(str[1] + "',"); sb.append(str[2] + "',"); sb.append(str[3] + "'"); sb.append(str[4] + "'"); sb.append(str2); db.execSQL(sb.toString()); } db.setTransactionSuccessful(); db.endTransaction(); 

我build议使用ContentValues插入logging。 这是更容易,会逃避报价,而不是冗长。

像这样(它也会跳过坏行):

  ... BufferedReader buffer = new BufferedReader(new InputStreamReader(inStream)); String line = ""; db.beginTransaction(); try { while ((line = buffer.readLine()) != null) { String[] colums = line.split(","); if (colums.length != 4) { Log.d("CSVParser", "Skipping Bad CSV Row"); continue; } ContentValues cv = new ContentValues(3); cv.put(dbCol0, colums[0].trim()); cv.put(dbCol1, colums[1].trim()); cv.put(dbCol2, colums[2].trim()); cv.put(dbCol3, colums[3].trim()); cv.put(dbCol4, colums[4].trim()); db.insert(TABLE, null, cv); } } catch (IOException e) { e.printStackTrace(); } db.setTransactionSuccessful(); db.endTransaction(); 

dbCol0等是数据库的列名,例如_id, name, dt1, dt2, dt3

数据库是从public SQLiteDatabase getReadableDatabase ()获取的数据库

如何阅读CSV文件

file.csv复制到资产文件夹,然后像这样读取:

 String mCSVfile = "file.csv"; AssetManager manager = context.getAssets(); InputStream inStream = null; try { inStream = manager.open(mCSVfile); } catch (IOException e) { e.printStackTrace(); } BufferedReader buffer = new BufferedReader(new InputStreamReader(inStream)); ... 

我已经添加了一些使用这些类的类,您可以轻松地导入和导出文件或数据库

对于这些操作,您必须将这两个jar文件导入到您的项目中

(1)opencsv-1.7.jar http://www.java2s.com/Code/Jar/o/Downloadopencsv17jar.htm
(2)poi-3.8-20120326.jar http://code.google.com/p/mipgsmca12-108-126–online-library/downloads/detail?name=poi-3.8-20120326.jar&can=2&q=

并导入所有这四个类,并根据需要使用…

ExportFileModule`

 public class ExportDatabaseToCSV extends AsyncTask<Void, Boolean, Boolean>{ Context context; ProgressDialog dialog; public ExportDatabaseToCSV(Context context) { this.context=context; } @Override protected void onPreExecute() { dialog=new ProgressDialog(context); dialog.setTitle("Exporting SecureIt Data to CSV file"); dialog.setMessage("Please wait..."); dialog.setCancelable(false); dialog.setIcon(android.R.drawable.ic_dialog_info); dialog.show(); } @Override protected Boolean doInBackground(Void... params) { CredentialDb db = new CredentialDb(context);//here CredentialDb is my database. you can create your db object. File exportDir = new File(Environment.getExternalStorageDirectory(), ""); if (!exportDir.exists()) { exportDir.mkdirs(); } File file = new File(exportDir, "SecureItExportedFile.csv"); try { file.createNewFile(); CSVWriter csvWrite = new CSVWriter(new FileWriter(file)); SQLiteDatabase sql_db = db.getReadableDatabase();//returning sql Cursor curCSV = sql_db.rawQuery("SELECT * FROM "+CredentialDb.TABLE_NAME,null); csvWrite.writeNext(curCSV.getColumnNames()); while(curCSV.moveToNext()) { //Which column you want to export you can add over here... String arrStr[] ={curCSV.getString(0),curCSV.getString(1), curCSV.getString(2),curCSV.getString(3),curCSV.getString(4),curCSV.getString(5)}; csvWrite.writeNext(arrStr); } csvWrite.close(); curCSV.close(); return true; } catch(Exception sqlEx) { Log.e("Error:", sqlEx.getMessage(), sqlEx); } return false; } @Override protected void onPostExecute(Boolean result) { if (dialog.isShowing()) { dialog.dismiss(); } if(result) Toast.makeText(context, "SqLite Data has been Exported!", Toast.LENGTH_LONG).show(); else Toast.makeText(context, "SqLite Data has not Exported", Toast.LENGTH_LONG).show(); } } 

ImportModule

 import java.io.File; import android.app.Activity; import android.content.Context; import android.os.Environment; public class MyCSVFileReader { public static void openDialogToReadCSV(final Activity activity,final Context context) { File mPath = new File(Environment.getExternalStorageDirectory() + "//DIR//"); FileDialog fileDialog = new FileDialog(activity, mPath); fileDialog.setFileEndsWith(".txt"); fileDialog.addFileListener(new FileDialog.FileSelectedListener() { @Override public void fileSelected(File file) { new ImportCVSToSQLiteDataBase(context,activity,file).execute(); //execute asyncTask to import data into database from selected file. } }); fileDialog.showDialog(); } } 
 import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Environment; import android.util.Log; import com.export.importmodule.ListenerList.FireHandler; public class FileDialog { private static final String PARENT_DIR = ".."; private final String TAG = getClass().getName(); private String[] fileList; private File currentPath; public interface FileSelectedListener { void fileSelected(File file); } public interface DirectorySelectedListener { void directorySelected(File directory); } private ListenerList<FileSelectedListener> fileListenerList = new ListenerList<FileDialog.FileSelectedListener>(); private ListenerList<DirectorySelectedListener> dirListenerList = new ListenerList<FileDialog.DirectorySelectedListener>(); private final Activity activity; private boolean selectDirectoryOption; private String fileEndsWith; /** * @param activity * @param initialPath */ public FileDialog(Activity activity, File path) { this.activity = activity; if (!path.exists()) path = Environment.getExternalStorageDirectory(); loadFileList(path); } /** * @return file dialog */ public Dialog createFileDialog() { Dialog dialog = null; AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(currentPath.getPath()); if (selectDirectoryOption) { builder.setPositiveButton("Select directory", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { Log.d(TAG, currentPath.getPath()); fireDirectorySelectedEvent(currentPath); } }); } builder.setItems(fileList, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { String fileChosen = fileList[which]; File chosenFile = getChosenFile(fileChosen); if (chosenFile.isDirectory()) { loadFileList(chosenFile); dialog.cancel(); dialog.dismiss(); showDialog(); } else fireFileSelectedEvent(chosenFile); } }); dialog = builder.show(); return dialog; } public void addFileListener(FileSelectedListener listener) { fileListenerList.add(listener); } public void removeFileListener(FileSelectedListener listener) { fileListenerList.remove(listener); } public void setSelectDirectoryOption(boolean selectDirectoryOption) { this.selectDirectoryOption = selectDirectoryOption; } public void addDirectoryListener(DirectorySelectedListener listener) { dirListenerList.add(listener); } public void removeDirectoryListener(DirectorySelectedListener listener) { dirListenerList.remove(listener); } /** * Show file dialog */ public void showDialog() { createFileDialog().show(); } private void fireFileSelectedEvent(final File file) { fileListenerList.fireEvent(new FireHandler<FileDialog.FileSelectedListener>() { public void fireEvent(FileSelectedListener listener) { listener.fileSelected(file); } }); } private void fireDirectorySelectedEvent(final File directory) { dirListenerList.fireEvent(new FireHandler<FileDialog.DirectorySelectedListener>() { public void fireEvent(DirectorySelectedListener listener) { listener.directorySelected(directory); } }); } private void loadFileList(File path) { this.currentPath = path; List<String> r = new ArrayList<String>(); if (path.exists()) { if (path.getParentFile() != null) r.add(PARENT_DIR); FilenameFilter filter = new FilenameFilter() { public boolean accept(File dir, String filename) { File sel = new File(dir, filename); if (!sel.canRead()) return false; if (selectDirectoryOption) return sel.isDirectory(); else { boolean endsWith = fileEndsWith != null ? filename.toLowerCase().endsWith(fileEndsWith) : true; return endsWith || sel.isDirectory(); } } }; String[] fileList1 = path.list(filter); for (String file : fileList1) { r.add(file); } } fileList = (String[]) r.toArray(new String[]{}); } private File getChosenFile(String fileChosen) { if (fileChosen.equals(PARENT_DIR)) return currentPath.getParentFile(); else return new File(currentPath, fileChosen); } //-------------------------------------------------------------- public void setFileEndsWith(String fileEndsWith) { this.fileEndsWith = fileEndsWith != null ? fileEndsWith.toLowerCase() : fileEndsWith; } } class ListenerList<L> { private List<L> listenerList = new ArrayList<L>(); public interface FireHandler<L> { void fireEvent(L listener); } public void add(L listener) { listenerList.add(listener); } public void fireEvent(FireHandler<L> fireHandler) { List<L> copy = new ArrayList<L>(listenerList); for (L l : copy) { fireHandler.fireEvent(l); } } public void remove(L listener) { listenerList.remove(listener); } public List<L> getListenerList() { return listenerList; } } 
 import java.io.File; import java.io.FileReader; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; import android.util.Log; import android.widget.Toast; import au.com.bytecode.opencsv.CSVReader; public class ImportCVSToSQLiteDataBase extends AsyncTask<String, String, String> { Activity activity; Context context; File file=null; private ProgressDialog dialog; public ImportCVSToSQLiteDataBase(Context context, Activity activity,File file) { this.context=context; this.activity=activity; this.file=file; } @Override protected void onPreExecute() { dialog=new ProgressDialog(context); dialog.setTitle("Importing Data into SecureIt DataBase"); dialog.setMessage("Please wait..."); dialog.setCancelable(false); dialog.setIcon(android.R.drawable.ic_dialog_info); dialog.show(); } @Override protected String doInBackground(String... params) { String data=""; Log.d(getClass().getName(), file.toString()); try{ CSVReader reader = new CSVReader(new FileReader(file)); String [] nextLine; //here I am just displaying the CSV file contents, and you can store your file content into db from while loop... while ((nextLine = reader.readNext()) != null) { // nextLine[] is an array of values from the line String accId=nextLine[0]; String acc_name=nextLine[1]; data=data+"AccId:"+accId +" Account_name:"+acc_name+"\n"; } return data; } catch (Exception e) { Log.e("Error", "Error for importing file"); } return data=""; } protected void onPostExecute(String data) { if (dialog.isShowing()) { dialog.dismiss(); } if (data.length()!=0) { Toast.makeText(context, "File is built Successfully!"+"\n"+data, Toast.LENGTH_LONG).show(); }else{ Toast.makeText(context, "File fail to build", Toast.LENGTH_SHORT).show(); } } } 

步骤使用…
(1)对于导出SqLiteDb:
新ExportDatabaseToCSV(YourActivityClass.this).execute();
(2)从您select的文件导入SqLiteDb:
MyCSVFileReader.openDialogToReadCSV(this,YourActivityClass.this);

(3)并且不要忘记在AndroidManifest.xml中添加这些权限

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