最近项目中要实现android读取sqlite数据库文件,在这里先做一个英汉字典的例子。主要是输入英语到数据库中查询相应的汉语意思,将其答案输出。数据库采用sqlite3.
如图:
实现过程完全是按照参考文章中所述。其中要说明的是,程序在第一次启动的时候,会把数据库安装到内存卡上面,从而可以读却数据库。
相关的代码:
- packagecom.easymorse;
- importjava.io.File;
- importjava.io.FileOutputStream;
- importjava.io.InputStream;
- importandroid.app.Activity;
- importandroid.app.AlertDialog;
- importandroid.database.Cursor;
- importandroid.database.sqlite.SQLiteDatabase;
- importandroid.os.Bundle;
- importandroid.text.Editable;
- importandroid.text.TextWatcher;
- importandroid.util.Log;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.AutoCompleteTextView;
- importandroid.widget.Button;
- publicclassDictionaryextendsActivityimplementsOnClickListener,TextWatcher{
- privatefinalStringDATABASE_PATH=android.os.Environment
- .getExternalStorageDirectory().getAbsolutePath()
- +"/dictionary";
- privatefinalStringDATABASE_FILENAME="dictionary.db3";
- SQLiteDatabasedatabase;
- ButtonbtnSelectWord;
- AutoCompleteTextViewactvWord;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- 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);
- }
- publicvoidonClick(Viewview)
- {
- //查找单词的SQL语句
- Stringsql="selectchinesefromt_wordswhereenglish=?";
- Cursorcursor=database.rawQuery(sql,newString[]
- {actvWord.getText().toString()});
- Stringresult="未找到该单词.";
- //如果查找单词,显示其中文信息
- if(cursor.getCount()>0)
- {
- //必须使用moveToFirst方法将记录指针移动到第1条记录的位置
- cursor.moveToFirst();
- result=cursor.getString(cursor.getColumnIndex("chinese"));
- Log.i("tran","success"+result);
- }
- //显示查询结果对话框
- newAlertDialog.Builder(this).setTitle("查询结果").setMessage(result)
- .setPositiveButton("关闭",null).show();
- }
- privateSQLiteDatabaseopenDatabase(){
- try{
- //获得dictionary.db文件的绝对路径
- StringdatabaseFilename=DATABASE_PATH+"/"+DATABASE_FILENAME;
- Filedir=newFile(DATABASE_PATH);
- //如果/sdcard/dictionary目录中存在,创建这个目录
- if(!dir.exists())
- dir.mkdir();
- //如果在/sdcard/dictionary目录中不存在
- //dictionary.db文件,则从res\raw目录中复制这个文件到
- //SD卡的目录(/sdcard/dictionary)
- if(!(newFile(databaseFilename)).exists()){
- //获得封装dictionary.db文件的InputStream对象
- InputStreamis=getResources().openRawResource(
- R.raw.dictionary);
- FileOutputStreamfos=newFileOutputStream(databaseFilename);
- byte[]buffer=newbyte[8192];
- intcount=0;
- //开始复制dictionary.db文件
- while((count=is.read(buffer))>0){
- fos.write(buffer,0,count);
- }
- fos.close();
- is.close();
- }
- //打开/sdcard/dictionary目录中的dictionary.db文件
- SQLiteDatabasedatabase=SQLiteDatabase.openOrCreateDatabase(
- databaseFilename,null);
- returndatabase;
- }catch(Exceptione){
- }
- returnnull;
- }
- @Override
- publicvoidafterTextChanged(Editables){
- }
- @Override
- publicvoidbeforeTextChanged(CharSequences,intstart,intcount,
- intafter){
- }
- @Override
- publicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){
- }
- }