老貓從j2me開發一路走來,對於sqlite真是喜憂參半,囍的是在一個單機PDA環境下內嵌sqlite可以利用關係型數據庫對數據進行操作,開發人員無須爲以文本文件形式存儲的數據進行查詢,修改(定位而頭疼),想當初三萬條數據在j2me弱弱的文本操作環境下我用了將近60個文件進行存儲並進行定位查詢,修改操作,想當然速度不會很快,一條數據的查詢時間將近3到4秒。憂的是:sqlite畢竟是個內嵌的關係型數據庫,它存儲數據是有限的,在j2me環境下老貓曾測試存儲一萬條數據就開始內存溢出了,鬧心呀。
從j2me轉向android,可以看到API中對sqlite專門提供了操作的接口,於是我在考慮android環境下我如果給了它足夠大的存儲空間,他是否還會對我視而不見,(老貓一直認爲sqlite存儲較大量數據還是可以實現的,至於制約他的因素可能就是存儲空間)。
這裏我拋開真機或模擬器自帶的內存,通過sd卡大容量的空間來存放我們的sqlite數據庫。
第一:模擬器環境下:
去網站下載SQLite Expert Professiona工具,此工具是一個可視化創建sqlite數據庫的工具很好用,下載地址:
安裝完成後,界面如下圖所示:
1、創建數據庫:
在工具條欄選擇File---new database,此時會彈出數據庫添加界面,這裏我們添加data file爲dictionary,給database alias(sqlite是文本數據庫)添加爲c:\ dictionary 添加完成後點擊 Ok 按鈕,此時在左側的列表中會看到你剛剛新創建的數據庫 dictionary。
2、創建表
選中dictionary右鍵可以看到NEW TABLE,點擊它,這裏我們創建的表名爲:t_wods,方式和你創建mysql表一樣,填寫字段,類型,字段大小等等,這裏我們創建兩個字段:english,chinese,都爲varchar類型長度爲20。
3.錄入信息,爲了測試方便,我直接將兩萬條的數據導入到該表中,現在dictionary文件的大小爲5M.
此時我們的數據庫就創建完成。對於c盤下的dictionary文件,我們先放下,下面開始給模擬器創建sd卡鏡像。
3、(sd卡鏡像文件的創建轉載於別處,謝謝原作者)
創建一個SD卡鏡像文件。
打開cmd,輸入如下命令:mksdcard 1024M sdcard.img
該命令會在當前目錄下生成一個sdcard.img文件,該文件就是Android模擬器的SD卡鏡像文件。1024M表示1024兆,即該SD卡有1個G的容量,也可用K做單位(1M=1024K),K,M必須大寫。目前Android支持8M~128G的SD卡。
運行帶有SD卡的模擬器
創建了SD卡鏡像文件,只是創建了一個文件,還不能在模擬器中直接用,要在模擬器中可看到該SD卡,方法有兩種,如下:
◆在cmd中,命令如下:emulator -sdcard e:sdcard.img
◆在Eclipse中,在Run->Run Configurations...菜單裏面的Target標籤頁裏面,輸入啓動參數
以上工作完成,我們可以開始寫代碼了:
爲了測試,我只寫了一個小demo,大家能看懂即可:
public class Dictionary extends Activity implements OnClickListener, TextWatcher{
private final String DATABASE_PATH = android.os.Environment
.getExternalStorageDirectory().getAbsolutePath()
+ "/dictionary";
private final String DATABASE_FILENAME = "dictionary.db3";
SQLiteDatabase database;
Button btnSelectWord;
AutoCompleteTextView actvWord;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 打開數據庫,database是在Main類中定義的一個SQLiteDatabase類型的變量
database = openDatabase();
// 下面的代碼裝載了相關組件,並設置了相應的事件
btnSelectWord = (Button) findViewById(R.id.btnSelectWord);
actvWord = (AutoCompleteTextView) findViewById(R.id.actvWord);
btnSelectWord.setOnClickListener(this);
actvWord.addTextChangedListener(this);
}
public void onClick(View view)
{
String sql = "select chinese from t_words where english=?";
Cursor cursor = database.rawQuery(sql, new String[]
{ actvWord.getText().toString() });
String result = "未找到該信息.";
// 如果查找english信息,顯示其chinese信息
if (cursor.getCount() > 0)
{
// 必須使用moveToFirst方法將記錄指針移動到第1條記錄的位置
cursor.moveToFirst();
result = cursor.getString(cursor.getColumnIndex("chinese"));
Log.i("tran", "success"+result);
}
// 顯示查詢結果對話框
new AlertDialog.Builder(this).setTitle("查詢結果").setMessage(result)
.setPositiveButton("關閉", null).show();
}
private SQLiteDatabase openDatabase() {
try {
// 獲得dictionary.db文件的絕對路徑
String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
File dir = new File(DATABASE_PATH);
// 如果/sdcard/dictionary目錄中存在,創建這個目錄
if (!dir.exists())
dir.mkdir();
// 如果在/sdcard/dictionary目錄中不存在
// dictionary.db文件,則從res\raw目錄中複製這個文件到
// SD卡的目錄(/sdcard/dictionary)
if (!(new File(databaseFilename)).exists()) {
// 獲得封裝dictionary.db文件的InputStream對象
InputStream is = getResources().openRawResource(
R.raw.dictionary);
FileOutputStream fos = new FileOutputStream(databaseFilename);
byte[] buffer = new byte[8192];
int count = 0;
// 開始複製dictionary.db文件
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
}
// 打開/sdcard/dictionary目錄中的dictionary.db文件
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(
databaseFilename, null);
return database;
} catch (Exception e) {
}
return null;
}
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
}
運行程序效果如下(該數據在庫中的第20004條):
示例二(該數據在19259行)
第二、真機環境下
模擬器上測試通過,下面在真機上進行測試:
首先將,本人用的是 華爲c8500 真機sd卡下新建dictionary文件夾,然後將dictionary文件拷貝到裏面,從項目目錄bin文件夾下降dictionary.apk文件也拷貝到sd卡下,安裝測試,由於不好切圖,就不上了,總之數據也能夠正常查詢出來。
以上過程只是個人對中型數據量的數據做的測試觀點,當然如果硬是要存儲幾十萬上百萬的數據,估計夠嗆,對於上面的過程有想法的朋友可以留言交流,老貓也是新手一個,謝謝大家。
原文地址:http://blog.csdn.net/chenhuijie666/article/details/7091283