sqlite存儲大數據量數據之淺見

老貓最近剛開始學習android,android中對於數據存儲的方式有好幾種,經過兩天的學習,對於sqlite存儲數據的性能和用法做一淺顯的說明:
     老貓從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卡有1G的容量,也可用K做單位(1M=1024K),K,M必須大寫。目前Android支持8M~128GSD

運行帶有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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章