`
hzy3774
  • 浏览: 992355 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Android利用SQLite制作最简单成语小词典

 
阅读更多

UnzipAssets.java

package com.hu.andstar;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import android.content.Context;

public class UnzipAssets {

	/**
	 * 解压assets的zip压缩文件到指定目录
	 * @param context上下文对象
	 * @param assetName压缩文件名
	 * @param outputDirectory输出目录
	 * @param isReWrite是否覆盖
	 * @throws IOException
	 */
	public static void unZip(Context context, String assetName,
			String outputDirectory,boolean isReWrite) throws IOException {
		//创建解压目标目录
		File file = new File(outputDirectory);
		//如果目标目录不存在,则创建
		if (!file.exists()) {
			file.mkdirs();
		}
		//打开压缩文件
		InputStream inputStream = context.getAssets().open(assetName);
		ZipInputStream zipInputStream = new ZipInputStream(inputStream);
		//读取一个进入点
		ZipEntry zipEntry = zipInputStream.getNextEntry();
		//使用1Mbuffer
		byte[] buffer = new byte[1024 * 1024];
		//解压时字节计数
		int count = 0;
		//如果进入点为空说明已经遍历完所有压缩包中文件和目录
		while (zipEntry != null) {
			//如果是一个目录
			if (zipEntry.isDirectory()) {
				file = new File(outputDirectory + File.separator + zipEntry.getName());
				//文件需要覆盖或者是文件不存在
				if(isReWrite || !file.exists()){
					file.mkdir();
				}
			} else {
				//如果是文件
				file = new File(outputDirectory + File.separator
						+ zipEntry.getName());
				//文件需要覆盖或者文件不存在,则解压文件
				if(isReWrite || !file.exists()){
					file.createNewFile();
					FileOutputStream fileOutputStream = new FileOutputStream(file);
					while ((count = zipInputStream.read(buffer)) > 0) {
						fileOutputStream.write(buffer, 0, count);
					}
					fileOutputStream.close();
				}
			}
			//定位到下一个文件入口
			zipEntry = zipInputStream.getNextEntry();
		}
		zipInputStream.close();
	}
}

 用于第一次运行时解压数据文件到SD卡:

MainActivity.java:

package com.hu.andstar;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

	// 指定数据库文件所在目录
	private final String DATABASE_PATH = android.os.Environment
			.getExternalStorageDirectory().getAbsolutePath() + "/andstar";
	// 指定数据库文件名
	private final String DATABASE_FILENAME = "data.db";

	private SQLiteDatabase database = null;
	private EditText etInput = null;
	private ImageButton ibSearch = null;
	private ListView lvWords = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 找到控件
		etInput = (EditText) findViewById(R.id.editTextInput);
		ibSearch = (ImageButton) findViewById(R.id.imageButtonSearch);
		lvWords = (ListView) findViewById(R.id.listViewWords);
		initAll();
	}

	private void initAll() {
		// 获取并打开数据库
		database = openDatabase();
		// 设置ListView数据
		lvWords.setAdapter(getIndexs(""));
		// 当输入框文本改变时,让ListView现实的数据也随之改变
		etInput.addTextChangedListener(new TextWatcher() {
			public void onTextChanged(CharSequence s, int start, int before,
					int count) {
			}

			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
			}

			public void afterTextChanged(Editable s) {
				// 重新设置ListView的数据
				lvWords.setAdapter(getIndexs(etInput.getText().toString()));
			}
		});

		// 当ListView子项单击时,让文本框内容变成该项文本
		lvWords.setOnItemClickListener(new AdapterView.OnItemClickListener() {

			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				etInput.setText(((TextView) view).getText());
				etInput.selectAll();
			}
		});

		// 设置查询按钮事件
		ibSearch.setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				// 查询SQL语句
				String sql = "SELECT dContent FROM words WHERE dIndex = @arg";
				Cursor cursor = database.rawQuery(sql, new String[] { etInput
						.getText().toString() });
				// 如果查询有结果,将第一个结果传递给显示结果的Activity
				if (cursor.getCount() > 0) {
					cursor.moveToFirst();
					Intent intent = new Intent();
					intent.putExtra("word", etInput.getText().toString());
					intent.putExtra("explain", cursor.getString(0));
					cursor.close();
					intent.setClass(MainActivity.this, ExplainActivity.class);
					MainActivity.this.startActivity(intent);
				}
			}
		});
	}

	// 获取ListView所要显示的数据
	ArrayAdapter<String> getIndexs(String input) {
		List<String> list = new ArrayList<String>();
		// 获取32条大于等于该文本的数据
		String sql = "SELECT dIndex FROM words WHERE dIndex >= @arg limit 0,32";
		// 执行查询语句
		Cursor cursor = database.rawQuery(sql, new String[] { input });
		if (cursor.getCount() > 0) {
			while (cursor.moveToNext()) {
				list.add(cursor.getString(0));
			}
			cursor.close();
		} else {// 如果获取结果为空
			list.add(getString(R.string.no_match));
		}
		return new ArrayAdapter<String>(MainActivity.this,
				android.R.layout.simple_list_item_1, list);// 返回ArrayAdapter
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// 退出选项
		if (item.getItemId() == R.id.menu_exit) {
			Builder builder = new Builder(MainActivity.this);
			builder.setMessage("确认退出吗?");
			builder.setTitle("提示");
			builder.setPositiveButton(R.string.button_positive,
					new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int which) {
							System.exit(0);
						}
					});
			builder.setNegativeButton(R.string.button_cancle, null);
			builder.show();
		} else {

		}
		return super.onOptionsItemSelected(item);
	}

	private SQLiteDatabase openDatabase() {// 打开数据库函数
		try {
			String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
			File databaseFile = new File(databaseFilename);
			// 如果SD卡上数据库文件不存在,则解压数据库文件
			if (!databaseFile.exists()) {
				UnzipAssets.unZip(MainActivity.this, "data.zip", DATABASE_PATH,
						true);
			}
			// 返回打开的数据库
			return SQLiteDatabase.openOrCreateDatabase(databaseFilename, null);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

 

查词界面;

 

 

ExplainActivity.java

package com.hu.andstar;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.webkit.WebView;
import android.widget.TextView;

/*用于显示查询结果
 * 使用WebView显示
 */
public class ExplainActivity extends Activity{
	
	private TextView tvWord = null;
	private WebView tvExplain = null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_explain);
		tvWord = (TextView) findViewById(R.id.textViewWord);
		tvExplain = (WebView) findViewById(R.id.webViewExplain);
		Intent intent = getIntent();
		tvWord.setText(intent.getStringExtra("word"));
		String htmText = intent.getStringExtra("explain");
		tvExplain.loadDataWithBaseURL(null,htmText, "text/html",  "utf-8", null);
	}
}

 用于显示解释:

 

 

 

  • 大小: 44.5 KB
  • 大小: 67.6 KB
分享到:
评论

相关推荐

    Android应用源码简单的云词典

    【Android应用源码简单的云词典】是一款基于Android平台的开源项目,旨在为用户提供便捷的在线词汇查询功能,实现类似云服务的词典应用。这个项目对于学习Android开发,特别是对移动应用中的网络数据交互、UI设计...

    Android实现简单的电子词典

    在Android平台上实现一个简单的电子词典,涉及到的关键技术主要包括Android应用开发基础、SQLite数据库管理和用户界面设计。下面将详细介绍这些知识点。 首先,Android应用开发基础是实现电子词典的基石。这包括...

    基于android的移动应用中英文电子词典源码(so easy).zip

    本项目"基于Android的移动应用中英文电子词典源码(so easy)"提供了一个简单易懂的源码示例,帮助开发者快速理解和实践Android应用开发。 首先,这个应用的核心功能是词典查询。它可能包含以下几个关键组件: 1. ...

    Android源码——中英文电子词典源码(so easy).7z

    【标题】"Android源码——中英文电子词典源码(so easy).7z" 涉及的是一个Android应用程序开发项目,该项目旨在创建一个功能完善的中英文电子词典。开发者通过这个源码可以深入理解Android应用的构建过程,特别是...

    Android实现汉字转拼音(支持多音)

    如果只是简单地将单个汉字转换为拼音,使用开源库通常是最快速和简便的方式。而如果涉及到大量的汉字处理,可能需要考虑自建词典或使用网络服务。在实现过程中,需要注意性能优化,避免因大量拼音转换导致的内存消耗...

    基于Android的中华有词手机应用设计.pdf

    此应用的设计充分利用了Android的优势,提供了移动端的便捷性,操作简单,内容更新迅速。测试表明,系统运行稳定,能有效帮助用户识字,对学习汉语具有实用性价值。综合来看,这个基于Android的中华有词手机应用为...

    安卓源码包 UI布局 textView SQLSEVER&安卓 Tab选项卡Android例子源码 33个合集.zip

    安卓源码包 UI布局 textView SQLSEVER&安卓 Tab选项卡Android例子源码 33个合集: [四次元]Android ViewPager Fragment实现选项卡.rar [四次元]Android 操作数据库实例.zip [四次元]android 通过jdts.jar 连接SQL...

    安卓开发-WiktionarySimple.zip

    在项目中,"WiktionarySimple"暗示了应用的目标是实现一个简单的词典功能,可能包括搜索、浏览和解释单词。这就需要开发者对Wiktionary API有深入理解,了解如何发起HTTP请求,以及解析JSON数据。Android提供了一...

    安卓入门经典ch04

    在这个章节,可能会使用SQLite数据库创建一个简单的词汇表,包含单词和对应的翻译。你需要创建数据库帮助类,实现数据的插入、查询和删除操作。 5. **查询与显示结果**:当用户输入单词并触发查询后,应用将使用...

Global site tag (gtag.js) - Google Analytics