最近策劃提了個需求,但是已有的數據不能滿足需要,於是內容資源部製作了份excel表格補充。So,任務來了,讀取並使用excel數據。由於感覺excel表格裏的數據使用頻率較高,那麼就不能等到需要了纔去讀取excel,所以決定採用先把excel讀取出來寫進數據庫然後再讀取數據庫的方式。Just do it !
首先,根據excel表格創建對象:
package com.eebbk.englishpointread.extravoice;
public class ExtraVoiceInfo {
private int id;
/**
* 單詞內容
*/
private String content;
/**
* 音標
*/
private String phonetic;
/**
* 詞性
*/
private String property;
/**
* 釋義
*/
private String paraphrase;
/**
* 美式發音名稱
*/
private String usVoiceName;
/**
* 英式發音名稱
*/
private String ukVoiceName;
public ExtraVoiceInfo() {
}
public ExtraVoiceInfo(int id, String content, String phonetic, String property, String paraphrase,
String usVoiceName, String ukVoiceName) {
super();
this.id = id;
this.content = content;
this.phonetic = phonetic;
this.property = property;
this.paraphrase = paraphrase;
this.usVoiceName = usVoiceName;
this.ukVoiceName = ukVoiceName;
}
public ExtraVoiceInfo(String content, String phonetic, String property, String paraphrase, String usVoiceName,
String ukVoiceName) {
super();
this.content = content;
this.phonetic = phonetic;
this.property = property;
this.paraphrase = paraphrase;
this.usVoiceName = usVoiceName;
this.ukVoiceName = ukVoiceName;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getPhonetic() {
return phonetic;
}
public void setPhonetic(String phonetic) {
this.phonetic = phonetic;
}
public String getProperty() {
return property;
}
public void setProperty(String property) {
this.property = property;
}
public String getParaphrase() {
return paraphrase;
}
public void setParaphrase(String paraphrase) {
this.paraphrase = paraphrase;
}
public String getUsVoiceName() {
return usVoiceName;
}
public void setUsVoiceName(String usVoiceName) {
this.usVoiceName = usVoiceName;
}
public String getUkVoiceName() {
return ukVoiceName;
}
public void setUkVoiceName(String ukVoiceName) {
this.ukVoiceName = ukVoiceName;
}
@Override
public String toString() {
return "content:" + content + " phonetic:" + phonetic + " property:" + property + " paraphrase:"
+ paraphrase + " usVoiceName:" + usVoiceName + " ukVoiceName:" + ukVoiceName;
}
}
然後,創建數據庫:
package com.eebbk.englishpointread.extravoice;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* 配置數據庫操作幫助類
*
* */
public class ExtraVoiceDBHelper extends SQLiteOpenHelper {
public static final String TABLE_EXTRA_VOICE_INFO = "ExtraVoiceInfo";
public static String DATA_BASE_NAME = "ExtraVoiceCfg.db";
private static final int VERSION = 1;
private static ExtraVoiceDBHelper instance;
public static ExtraVoiceDBHelper getInstance( Context context ) {
if (instance == null) {
instance = new ExtraVoiceDBHelper( context );
}
return instance;
}
public ExtraVoiceDBHelper(Context context){
super(context, DATA_BASE_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
createTableUser(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
updateTableUser(db, oldVersion, newVersion);
}
/**
* 創建用戶表
*
* */
public void createTableUser(SQLiteDatabase db){
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_EXTRA_VOICE_INFO + " (_id INTEGER PRIMARY KEY AUTOINCREMENT"
+ ",content TEXT NOT NULL, phonetic TEXT ,property TEXT, paraphrase TEXT ,usVoiceName TEXT NOT NULL, ukVoiceName TEXT NOT NULL)" );
}
/**
* 更新用戶表
*
* */
public void updateTableUser(SQLiteDatabase db, int oldVersion, int newVersion){
if ( oldVersion != newVersion ){
db.execSQL( "DROP TABLE IF EXISTS " + TABLE_EXTRA_VOICE_INFO );
createTableUser(db);
}
}
}
接着就開始讀取excel數據了:
package com.eebbk.englishpointread.extravoice;
import java.io.InputStream;
import com.eebbk.englishwords.reader.util.ConstData;
import com.eebbk.open.common.util.PreferencesUtils;
import jxl.Sheet;
import jxl.Workbook;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.util.Log;
public class ExtraVoiceDBManager {
private static final String TAG = "ExtraVoiceDBManager";
private static final String EXCEPTION = "exception";
private ExtraVoiceDBHelper mDBHelper = null;
private static ExtraVoiceDBManager instance = null;
public static ExtraVoiceDBManager getInstance(Context context) {
if (instance == null) {
instance = new ExtraVoiceDBManager(context.getApplicationContext());
}
return instance;
}
private ExtraVoiceDBManager(Context context) {
mDBHelper = ExtraVoiceDBHelper.getInstance(context);
if (PreferencesUtils.getBoolean(context, ConstData.IS_READED_EXTRA_SOUND_DATA, true)) {
readExcelToDB(context);
}
}
/**
* 讀取excel數據到數據庫裏
* @param context
*/
private void readExcelToDB(Context context) {
try {
InputStream is = context.getAssets().open("syncenglish_extra_voice_data.xls");
Workbook book = Workbook.getWorkbook(is);
book.getNumberOfSheets();
// 獲得第一個工作表對象
Sheet sheet = book.getSheet(0);
int Rows = sheet.getRows();
ExtraVoiceInfo info = null;
for (int i = 1; i < Rows; ++i) {
String content = (sheet.getCell(0, i)).getContents();
String phonetic = (sheet.getCell(1, i)).getContents();
String property = (sheet.getCell(2, i)).getContents();
String paraphrase = (sheet.getCell(3, i)).getContents();
String usVoiceName = (sheet.getCell(4, i)).getContents();
String ukVoiceName = (sheet.getCell(5, i)).getContents();
info = new ExtraVoiceInfo(content, phonetic, property, paraphrase, usVoiceName, ukVoiceName);
saveInfoToDataBase(info);
}
book.close();
PreferencesUtils.putBoolean(context, ConstData.IS_READED_EXTRA_SOUND_DATA, false);
} catch (Exception e) {
PreferencesUtils.putBoolean(context, ConstData.IS_READED_EXTRA_SOUND_DATA, true);
Log.e(TAG, EXCEPTION, e);
}
}
/**
* 保存該條數據到數據庫
* @param info excel中的某條數據
*/
private void saveInfoToDataBase(ExtraVoiceInfo info) {
if (mDBHelper == null) {
return;
}
SQLiteDatabase db = mDBHelper.getWritableDatabase();
try {
ContentValues values = new ContentValues();
values.put("content", info.getContent());
values.put("phonetic", info.getPhonetic());
values.put("property", info.getProperty());
values.put("paraphrase", info.getParaphrase());
values.put("usVoiceName", info.getUsVoiceName());
values.put("ukVoiceName", info.getUkVoiceName());
db.insert(ExtraVoiceDBHelper.TABLE_EXTRA_VOICE_INFO, null, values);
} catch (SQLiteException e) {
Log.e(TAG, EXCEPTION, e);
} catch (Exception e){
Log.e(TAG, EXCEPTION, e);
} finally {
if (db != null) {
db.close();
}
}
}
/**
* 根據內容獲取 整條數據(ExtraVoiceInfo)
* @param contentStr
* @return
*/
public ExtraVoiceInfo getExtraVoiceInfo(String contentStr) {
ExtraVoiceInfo info = null;
if (mDBHelper == null) {
return info;
}
SQLiteDatabase db = mDBHelper.getReadableDatabase();
if (db == null) {
return info;
}
Cursor cursor = db.rawQuery("select * from ExtraVoiceInfo where content = ?", new String[] { contentStr });
try {
if (cursor != null && cursor.moveToFirst()) {
do {
String content = cursor.getString(cursor.getColumnIndex("content"));
String phonetic = cursor.getString(cursor.getColumnIndex("phonetic"));
String property = cursor.getString(cursor.getColumnIndex("property"));
String paraphrase = cursor.getString(cursor.getColumnIndex("paraphrase"));
String usVoiceName = cursor.getString(cursor.getColumnIndex("usVoiceName"));
String ukVoiceName = cursor.getString(cursor.getColumnIndex("ukVoiceName"));
info = new ExtraVoiceInfo(content, phonetic, property, paraphrase, usVoiceName, ukVoiceName);
} while (cursor.moveToNext());
}
} catch (SQLiteException e) {
Log.e(TAG, EXCEPTION, e);
} catch (Exception e){
Log.e(TAG, EXCEPTION, e);
} finally {
if (cursor != null) {
cursor.close();
cursor = null;
}
if (db != null) {
db.close();
}
}
return info;
}
}
最後我採用AsyncTask來進行excel讀取保存到數據庫:
package com.eebbk.englishpointread.extravoice;
import android.content.Context;
import android.os.AsyncTask;
public class ExtraVoiceAsynTask extends AsyncTask<Void, Void, Void> {
private Context mContext = null;
private ExtraVoiceDBManager dbManager = null;
public ExtraVoiceAsynTask(Context context) {
this.mContext = context;
}
@Override
protected Void doInBackground(Void... params) {
dbManager = ExtraVoiceDBManager.getInstance(mContext);
return null;
}
}
在需要使用excel中的數據時,通過調用
ExtraVoiceInfo info = mDbManager.getExtraVoiceInfo(clickTextStr);
獲取到ExtraVoiceInfo 對象,然後對ExtraVoiceInfo 對象進行相應操作處理。
注意事項:
讀取excel表格保存到數據裏,需要再AndroidManifest.xml中添加相應權限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
因爲是異步讀取,而異步是不可靠的任務序列,所以無法保證讀取的正確性。後來我改爲在demo裏讀取excel,然後把生成的.db文件拷貝到需要用到的工程的Asset文件中,然後再從Asset讀取db文件,這樣會靠譜點。