最近实验室要做一个模仿墨迹天气的应用,所以研究了一下。
墨迹天气有一个功能是“添加城市”,通过测试我们可以知道这是通过一个数据库对各个城市进行存储的,同时,设置里还可以从网上更新城市列表。但是最开始的城市是一开始就存好的。中外的城市有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如何导入已有的外部数据库及其原理。把查找的资料贴一部分过来。