我在前年做了个查询手机号和邮编地理位置的小程序,已经放到mm和天翼空间上卖了,应这次CU征文我就介绍一下这个项目的详细内幕。

首先最终上效果图

程序代码结构

1.开发准备

1)开发过程首先从网络上找手机号数据库,我找到的是mdb(微软的access),越新越好

2)android的数据库是sqlite,因此我们必须在电脑上创建好数据库,导入到程序里,到sqlite.org上下载windows版的sqlite3,创建好数据库mobile.db:

全国的城市列表名称,使用id作为唯一标识,可以减少数据库大小,因为android程序中文件大小不能超过1MB

点击(此处)折叠或打开

  1. CREATE TABLE city(id int,name text);

--运营商列表

  1. CREATE TABLE isp(id int,name text);

---所有城市的邮政编码

  1. CREATE TABLE code_city(code text,city_id integer);

--所有手机号段对应的运营商和城市列表,这个表公有44400条数据,若是把isp和city的id作为两个字段的话,会超过1MB,我把isp和city的id进行合并成一个字段(最高位为ispid(isp只有3个),后三位为city(357个)的id)能够省下200kb的大小,最终整个库为806KB

  1. CREATE TABLE mobile (start_num integer, end_num integer, isp_city_id integer);--所有手机号段对应的运营商和城市列表

2.开始开发

新建工程,我选择的是1.6,只是两年前的最新版本,我目前也懒得更新了

2.1 AndroidManifest.xml 这个是android里最重要的文件,这个文件类似于ssh里的applicationContext.xml之类的定义了活动和权限等等信息,我基本上没有改这个文件,因为是单机的不需要调用网络蓝牙和文件写入之类的权限

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="yifangyou.mobile_query"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <application android:icon="@drawable/icon" android:label="@string/app_name">
  7. <activity android:label="@string/app_name" android:name=".mobile_query">
  8. <intent-filter>
  9. <action android:name="android.intent.action.MAIN" />
  10. <category android:name="android.intent.category.LAUNCHER" />
  11. </intent-filter>
  12. </activity>
  13. </application>
  14. <uses-sdk android:minSdkVersion="2" />
  15. </manifest>

2.2,在res目录下建立raw目录把mobile.db放入

2.3,在res/values/strings.xml是保存程序中用到的中文字,代码里最好不要写中文,便于实现多语言版本

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string name="app_name">手机号区号归属</string>
  4. <string name="searching_txt">请稍后,查询中...</string>
  5. <string name="search_complete_txt">查询完毕</string>
  6. <string name="search_txt">查询</string>
  7. <string name="result_txt">查询结果</string>
  8. <string name="enter_txt">手机号或者区号</string>
  9. <string name="id_empty_txt">手机号或者区号为空!</string>
  10. <string name="id_error_txt">手机号或者区号错误</string>
  11. <string name="enter_again_txt">请输入手机号或者区号</string>
  12. <string name="mobile_error_txt">手机号必须是11位的数字串</string>
  13. <string name="telphone_error_txt">区号必须是大于等于3位的数字串</string>
  14. <string name="location_txt">所属地区:</string>
  15. <string name="unknown_txt">未知</string>
  16. <string name="about_line_txt">开发者:yifangyou\n发布时间:2010年07月\nCopyright?2010 yifangyou\n</string>
  17. <string name="help_line_txt">本程序实现查询手机号或者区号对应的地理位置信息,精确到省市和运营商,信息库2010年07月01日整理完成,共18万条数据,包含最新的152、186、188、189号码段的归属地数据。\n使用方法:在输入框内输入11位手机号或者3、4位区号,点击搜索即可</string>
  18. <string name="about_txt">关于</string>
  19. <string name="exit_txt">退出</string>
  20. <string name="help_txt">帮助</string>
  21. <string name="exit_info_txt">已经退出,谢谢使用</string>
  22. <string name="clean_txt">清空</string>
  23. <string name="ok_txt">确定</string>
  24. </resources>

2.4建立菜单,如下面的@+id/help表示菜单项的id,在程序代码中需要响应这个菜单时用到

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item android:id="@+id/help"
  4. android:alphabeticShortcut="h"
  5. android:title="帮助" />
  6. <item android:id="@+id/about"
  7. android:alphabeticShortcut="a"
  8. android:title="关于" />
  9. <item android:id="@+id/exit"
  10. android:alphabeticShortcut="e"
  11. android:title="退出" />
  12. </menu>

2.4页面布局,我这个程序界面比较简单用线性竖向布局

main.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_;fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <LinearLayout
  8. android:orientation="horizontal"
  9. android:layout_;fill_parent"
  10. android:layout_height="wrap_content"
  11. >
  12. <TextView
  13. android:layout_;wrap_content"
  14. android:layout_height="wrap_content"
  15. android:text="@string/enter_txt"
  16. />
  17. <EditText android:id="@+id/search"
  18. android:layout_;wrap_content"
  19. android:layout_height="wrap_content"
  20. android:text=""
  21. android:layout_weight="1.0"
  22. />
  23. <Button android:id="@+id/submit"
  24. android:layout_;wrap_content"
  25. android:layout_height="wrap_content"
  26. android:layout_alignParentRight="true"
  27. android:text="@string/search_txt">
  28. </Button>
  29. </LinearLayout>
  30. <TextView
  31. android:layout_;fill_parent"
  32. android:layout_height="wrap_content"
  33. android:textColor="#99FF0000"
  34. android:text="@string/result_txt"
  35. />
  36. <TextView android:id="@+id/result"
  37. android:layout_;fill_parent"
  38. android:layout_height="wrap_content"
  39. android:textColor="#9900FF00"
  40. android:text=""
  41. />
  42. <Button android:id="@+id/clean"
  43. android:layout_;wrap_content"
  44. android:layout_height="wrap_content"
  45. android:layout_alignParentRight="true"
  46. android:text="@string/clean_txt"/>
  47. </LinearLayout>

2.5主程序

1)首先对各个按钮进行设置监听事件,里面的R.id.xxx是对应main.xml

  1. public void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.main);//加载布局文件main.xml
  4. dbm = new DBManager(this);//这是初始化数据库操作类
  5. search_et = (EditText) findViewById(R.id.search);
  6. result_et = (TextView) findViewById(R.id.result);
  7. Button btn = (Button) findViewById(R.id.submit);//定义查询按钮的事件
  8. btn.setOnClickListener(new OnClickListener() {
  9. public void onClick(View v) {
  10. result_et.setText(getString(R.string.searching_txt)); //读取输入框的数据库
  11. search();
  12. }
  13. });
  14. Button clean_btn=(Button)findViewById(R.id.clean);
  15. clean_btn.setOnClickListener(new OnClickListener(){
  16. public void onClick(View v){
  17. search_et.setText("");
  18. }
  19. });
  20. isp_names=dbm.get_isp_name();
  21. city_names=dbm.get_city_name();
  22. }

菜单显示菜单和设置菜单事件

  1. public boolean onCreateOptionsMenu(Menu menu) {
  2. super.onCreateOptionsMenu(menu);
  3. try {
  4. MenuInflater inflater = getMenuInflater();
  5. inflater.inflate(R.menu.index, menu);
  6. } catch (Exception e) {
  7. }
  8. return true;
  9. }
  10. public boolean onOptionsItemSelected(MenuItem item) {
  11. super.onOptionsItemSelected(item);
  12. int id = item.getItemId();
  13. switch (id) {
  14. case R.id.help:
  15. showHelp();
  16. break;
  17. case R.id.about:
  18. showAbout();
  19. break;
  20. default:
  21. alert(getString(R.string.app_name)
  22. + getString(R.string.exit_info_txt));
  23. finish();
  24. break;
  25. }
  26. return true;
  27. }

剩下的就是查询数据库了

注意由于我使用的库是放在raw下,android无法把这个文件作为数据库(不知道为什么),我的解决是把这个文件写到android的数据库库能够读到的地方(一般是程序的安装目录下的files下即可)去

  1. public DBManager(Context context) {
  2. this.context = context;
  3. try {
  4. dbpath = context.getPackageManager().getApplicationInfo(
  5. context.getPackageName(), 0).dataDir
  6. + "/files/" + DB_NAME;
  7. initDB();
  8. db = SQLiteDatabase.openOrCreateDatabase(dbpath, null);
  9. } catch (NameNotFoundException e) {
  10. e.printStackTrace();
  11. }
  12. }
  13. public boolean initDB() {
  14. java.io.File f = new java.io.File(dbpath);
  15. if (f.exists()) {
  16. return true;
  17. }
  18. FileOutputStream stream;
  19. try {
  20. stream = context.openFileOutput(DB_NAME, Context.MODE_PRIVATE);
  21. fp = context.getResources().openRawResource(R.raw.mobile);
  22. try {
  23. int size = fp.available();
  24. byte[] buffer = new byte[size];
  25. fp.read(buffer);
  26. stream.write(buffer);
  27. fp.close();
  28. stream.close();
  29. } catch (IOException e1) {
  30. e1.printStackTrace();
  31. return false;
  32. }
  33. } catch (FileNotFoundException e) {
  34. // TODO Auto-generated catch block
  35. e.printStackTrace();
  36. }
  37. return false;
  38. }

更多相关文章

  1. 关于android真机访问本地电脑服务器以及访问数据库的那点事
  2. Android(安卓)sqlite数据库操作通用框架AHibernate(一)-CRUD示例
  3. 带你一步步破解Android微信聊天记录解决方案
  4. android 完整地操作数据库--日记本实例
  5. Android中个人推崇的数据库使用方式
  6. Unity3D链接Android手机端数据库
  7. Android将数据库保存到SD卡的实现
  8. Android(安卓)数据持久化(一)之简单数据持久化
  9. Android(安卓)数据库更新 onupgrade

随机推荐

  1. Android(安卓)TTS 实战五:摇一摇输入
  2. 写了个android gif显示控件,很简单很方便
  3. Android(安卓)ListView中notifyDataSetCh
  4. Android中播放GIF动画
  5. android执行远程地址,就会报android.os.Ne
  6. Android编译系统入门(一)
  7. Android实现圆形圆角图片
  8. Android Hook 机制 简单实战
  9. Android软件权限知识普及
  10. 【Android 开发入门】使用Android模拟器