最近实验室要做一个模仿墨迹天气的应用,所以研究了一下。

墨迹天气有一个功能是“添加城市”,通过测试我们可以知道这是通过一个数据库对各个城市进行存储的,同时,设置里还可以从网上更新城市列表。但是最开始的城市是一开始就存好的。中外的城市有2000多个,如何在程序中有效地初始化数据库成为了我主要关心的问题。

通过反编译墨迹天气的apk,看到初始化数据库主要使用了下面一段代码

public void initDBCity(){File localFile1 = this.context.getDatabasePath("mojicity.db");File localFile2 = new File(localFile1.toString().substring(0, localFile1.toString().lastIndexOf("/")));if (!localFile2.exists())localFile2.mkdir();InputStream localInputStream;FileOutputStream localFileOutputStream;try{if (!localFile1.exists()){ localInputStream = this.context.getResources().openRawResource(2131099648);localFileOutputStream = new FileOutputStream(localFile1);byte[] arrayOfByte = new byte[8192];while (true){int i = localInputStream.read(arrayOfByte);if (i <= 0)break;localFileOutputStream.write(arrayOfByte, 0, i);}}}catch (Exception localException){localException.printStackTrace();}return;localFileOutputStream.close();localInputStream.close();}

其中最重要的就是标红的这句话,这句话的意思是从res/raw这个文件夹下读取一个文件,也就是用来初始化数据库的文件。

根据代码查找了下Android如何导入已有的外部数据库及其原理。把查找的资料贴一部分过来。

蓝色部分转自  http://www.cnblogs.com/xiaowenji/archive/2011/01/03/1925014.html

我们平时见到的android数据库操作一般都是在程序开始时创建一个空的数据库,然后再进行相关操作。如果我们需要使用一个已有数据的数据库怎么办呢?
我们都知道android系统下数据库应该存放在 /data/data/com.*.*(package name)/ 目录下,所以我们需要做的是把已有的数据库传入那个目录下。操作方法是用FileInputStream读取原数据库,再用FileOutputStream把读取到的东西写入到那个目录。

操作方法:1. 把原数据库包括在项目源码的 res/raw 目录下,然后建立一个DBManager类,代码如下:

package com.android.ImportDatabase;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
import android.util.Log;public class DBManager {private final int BUFFER_SIZE = 400000;public static final String DB_NAME = "countries.db"; //保存的数据库文件名public static final String PACKAGE_NAME = "com.android.ImportDatabase";public static final String DB_PATH = "/data"+ Environment.getDataDirectory().getAbsolutePath() + "/"+ PACKAGE_NAME;  //在手机里存放数据库的位置private SQLiteDatabase database;private Context context;DBManager(Context context) {this.context = context;}public void openDatabase() {this.database = this.openDatabase(DB_PATH + "/" + DB_NAME);}private SQLiteDatabase openDatabase(String dbfile) {try {if (!(new File(dbfile).exists())) {  //判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库InputStream is = this.context.getResources().openRawResource(R.raw.countries); //欲导入的数据库FileOutputStream fos = new FileOutputStream(dbfile);byte[] buffer = new byte[BUFFER_SIZE];int count = 0;while ((count = is.read(buffer)) > 0) {fos.write(buffer, 0, count);}fos.close();is.close();}SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile,null);return db;} catch (FileNotFoundException e) {Log.e("Database", "File not found");e.printStackTrace();} catch (IOException e) {Log.e("Database", "IO exception");e.printStackTrace();}return null;}
然后在程序的首个Activity中示例化一个DBManager对象,然后对其执行openDatabase方法就可以完成导入了,可以把一些要对数据库进行的操作写在DBManager类里,然后通过DBManager类的对象调用;也可以在完成导入之后通过一个SQliteDatabase类的对象打开数据库,并执行操作。

其实跟我们反编译出来的代码是一样的,只不过由反编译保护生成的 2131099648 可以对应到了 R.raw.countries

由于之前用到数据库都是轻量型的数据库,而且进行操作的时候都是先建表,然后再插入内容,而不是这种预先就存好了内容的数据库,所以第一次接触导入外部数据库的知识。

另外还有一点要学习的是墨迹天气建表的方式,从反编译之后查找城市的SQL语句

select cityname,provincename from city c inner join province p on c.provinceid=p.provinceid where c.cityname like '" + paramString + "%' or c.pycityname like '" + paramString + "%' or c.pyshort like '" + paramString + "%' or c.alias like '" + paramString + "%' or p.provincename like '" + paramString + "%'

首先city和provice是两个表,通过provinceid进行连接,其次city中还保存了拼音和拼音简写这样的内容,更方便查找。

学习墨迹天气札记之一 —— 城市数据库相关推荐

  1. 墨迹天气: 更重视商业数据的公共价值

    [在中国,墨迹天气所涉及的天气数据细化到了城市行政区域.县级.村.街道的级别,也就是说,在同一个城市的不同位置不同时间,用户也可以看到跟自己更贴近的天气情况,准确率超过80%.] 当你推着满满一车物品 ...

  2. 墨迹天气android,墨迹天气Android产品分析

    墨迹天气官网宣传图 一.产品概况 1.产品简介 墨迹天气是一款免费天气预报工具,提供日出日落信息,六小时天气预报 2.主要竞品 天气通.最美天气.91黄历天气.知趣天气.懒人天气.琥珀天气 二.体验环 ...

  3. 爬虫笔记1--爬取墨迹天气

    爬虫笔记1--爬取墨迹天气 最近由于需要写了一个简单的墨迹天气爬取脚本,主要功能为爬取墨迹天气,然后将其存到MySQL数据库中. 1.功能 本代码主要功能为:爬取墨迹天气数据,将数据保存到MySQL数 ...

  4. PP助手联手墨迹天气 未来用大数据服务用户

    近日,在阿里移动事业群 PP助手举办的"Find Her·大数据分发时代"战略发布会上,阿里旗下UC浏览器.阿里云以及墨迹天气等多个重量级产品亮相为PP助手站台.PP助手宣布开启开 ...

  5. 墨迹天气接口html,moji_weather_spider.py

    #coding = utf-8 ''' 程 序 名:墨迹天气爬虫 编 写 人:bxgj 运行环境:win7x64 Python3.6.4 修改日志:2018.09.09 新建 2018.09.10 ...

  6. 云场景实践研究第85期:墨迹天气

    更多云场景实践研究案例,点击这里:[云场景实践研究合集]联合不是简单的加法,而是无限的生态,谁会是下一个独角兽 墨迹运营团队每天最关心的是用户正在如何使用墨迹,在他们操作中透露了哪些个性化需求.这些数 ...

  7. 用户6.5亿 墨迹天气难舍现金贷广告:合作方仅小米贷款

    用户6.5亿 墨迹天气难舍现金贷广告:合作方仅小米贷款 作者 | 夜明 来源 | 金融观察团 作为一家知名的天气信息软件,墨迹天气去年10月次曾因IPO被否事件备受关注.彼时,证监会直指墨迹天气四大问 ...

  8. 上市心不死:墨迹天气急需新故事

    配图来自Canva 在首次冲击IPO被拒近一年多之后,梦碎"APP第一股"的墨迹天气又传出将要重新启动上市的消息.9月22日,墨迹天气与中信证券签订上市辅导协议,将在近日拟在创业板 ...

  9. python爬虫之墨迹天气

    墨迹天气获取时间信息 import requests from lxml.html import etree import json import time # 导入模块 class MoJiWeat ...

最新文章

  1. mysql修改主键属性_mysql如何改变主键属性
  2. vue脚手架搭建配置试调地址和端口号_全栈的自我修养: 002使用@vue/cli进行vue环境搭建 (使用Vue,SpringBoot,Flask完成前后端分离)...
  3. Java黑皮书课后题第10章:10.24(实现Character类)在Java库中提供了Character类,给出你自己对这个类的实现(将新类命名为MyCharacter)
  4. ZOJ - 3228 Searching the String(AC自动机求不重复子串出现次数)
  5. Axure教程 axure新手入门基础(3) 简单易上手
  6. jsp java session_JSP中Session的使用
  7. 计算机网络自上而下影印版_《计算机网络(影印版)》 影印 【正版电子纸书阅读_PDF下载】- 书问...
  8. java xml文件无法打开,java – 无法打开beans.xml(配置文件)因为不存在
  9. SQLi LABS Less-8
  10. iOS中的Runloop
  11. c语言输出英文字母表,菜鸟求助,写一个随机输出26个英文字母的程序
  12. java架构实践_Java架构实践-关于IO流
  13. 蓝阔无线打印服务器设置,蓝阔打印服务器远程打印
  14. termux如何下载metasploit(msf)
  15. 同样是学编程,为什么别人十几岁就成了黑客,而你还在做码农
  16. 如何从零开始解读什么叫产品经理
  17. java中config是什么意思_在计算机的命令中Config是什么意思啊?
  18. 我是这样被电麻的:电容降压电路使用和注意事项
  19. java error while loading shared libraries: libjli.so: cannot open shared object file
  20. 图片识别——均值哈希算法

热门文章

  1. [心情]分手以后我要记得这10句话
  2. Canvas阴影绘制
  3. 一、软件卸载不干净怎么办?
  4. 如何加速 Web 应用程序并提高网站性能
  5. 【目标检测】DetectoRS算法学习笔记
  6. Unity动态编辑Terrain地形(四)植被编辑
  7. 仿百度文库、豆丁文档网站源码在线文档分享系统最新版+带全套工具
  8. 我们的心情,你能体会吗,Ms. Phoebe?
  9. 淮海工学院计算机考试报名,淮海工学院-江苏计算机等级考试网.DOC
  10. 高阶ScrumMaster认证 (A-CSM) 课程能学到什么?