= new String[provinces.length];
String[][] childs = new String[provinces.length][];
String[][] cityCode = new String[provinces.length][];
// 开始遍历
for (int i = 0; i < provinces.length; i++) {
// 得到省份名称
groups[i] = provinces[i][1];
// 由省份码得到城市码的URL ----> m.weather/data5/city + 01 +.xml
StringBuffer urlBuilder = new StringBuffer(urlPre);
urlBuilder.append(provinces[i][0]);
urlBuilder.append(".xml");
// 得到指定省份或直辖市信息内容
webContent = GetInfo.getInfo(urlBuilder.toString());
// 一个省份内的城市信息
String[][] citys = WeaterInfoParser.parseCity(webContent);
String[][][] towns = new String[citys.length][][];
// 计算总的城镇数
int sum = 0;
for (int j = 0; j < citys.length; j++) {
// 由城市码来得到地方码URL ----> m.weather/data5/city + 0102 +.xml
urlBuilder = new StringBuffer(urlPre);
urlBuilder.append(citys[j][0]);
urlBuilder.append(".xml");
// 得到地方信息
webContent = GetInfo.getInfo(urlBuilder.toString());
// towns[] 是一个二维数组 ,因为town是三维数组
towns[j] = WeaterInfoParser.parseCity(webContent);
sum = sum + towns[j].length;
}
childs[i] = new String[sum];
cityCode[i] = new String[sum];
sum = 0;
for (int j = 0; j < citys.length; j++) {
// town[j].length 是一个省份内有多少个城市信息
for (int n = 0; n < towns[j].length; n++) {
childs[i][sum] = towns[j][n][1];
// m.weather/data5/city + 010203 + .xml
urlBuilder = new StringBuffer(urlPre);
urlBuilder.append(towns[j][n][0]);
urlBuilder.append(".xml");
webContent = GetInfo.getInfo(urlBuilder.toString());
String[][] code = WeaterInfoParser.parseCity(webContent);
cityCode[i][sum] = code[0][1];
sum = sum + 1;
}
}
init = init + sum;
urlBuilder = null;
}
System.out.println("中国一共有多少个地方: " + init);
// 这里得到的groups数组记录的是得到的34个一级地区字符串,
// childs记录的是与groups数组对应的一级地区对应的市级别的字符串名
int g = 0;
StringBuffer str = new StringBuffer();
for (int j = 0; j < childs.length; j++) {
for (int k = 0; k < childs[j].length; k++) {
// info[g][0] = childs[j][k];
str.append(childs[j][k] + ",");
System.out.println(childs[j][k]);
g++;
}
}
File file = new File("city.txt");
try {
FileOperation.writeTxtFile(str.toString(), file);
} catch (Exception e) {
e.printStackTrace();
}
g = 0;
str = new StringBuffer();
System.out.println("g2 ==== " + g);
for (int j = 0; j < cityCode.length; j++) {
for (int i = 0; i < cityCode[j].length; i++) {
str.append(cityCode[j][i] + ",");
System.out.print(cityCode[j][i]);
g++;
}
System.out.println();
}
File file2 = new File("cityCode.txt");
try {
FileOperation.writeTxtFile(str.toString(), file2);
} catch (Exception e) {
e.printStackTrace();
}
}
遍历后将得到的数据分别存放在 city.txt 和 cityCode.txt两个文件中。在 city.txt 中存放的是所有的城市名,城市名之间用“,”分隔,在cityCode.txt中存放的是所有城市的城市码,之间也用“,”隔开,在存放的时候,将城市名和城市码的次序一一对应。写入函数如下:
public static boolean writeTxtFile(String content, File fileName)
throws Exception {
RandomAccessFile mm = null;
boolean flag = false;
FileOutputStream o = null;
try {
o = new FileOutputStream(fileName);
o.write(content.getBytes("UTF-8"));
o.close();
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (mm != null) {
mm.close();
}
}
return flag;
}
这样,整个数据的获取就完成了,得到的城市名和城市码分别保存在 city.txt 和 cityCode.txt 两个文件中。
5.4 数据库实现
5.4.1 数据库存储
在数据库的设计中将数据内容设计为两张表:cities和city,cities用于存储城市名和城市码,city用于存储默认的城市码。
首先来实现cities这张表,也就是将上面获取数据后得到的两个文件中的内容存储到这张表中来。经过分析可以知道,应该先将文件中的内容读入到内存中,然后创建表,再把数据插入到表中。在前面已经说过,在两个文件存储的时候,城市名和城市名之间、城市码和城市码之间用“,”作为间隔,所以读入后,应以它作为分隔符来进行解析,解析函数如下:
public static String[] parseCity(String content){
if(content!=null && content.trim().length()!=0){
StringTokenizer st = new StringTokenizer(content, ",");
String[] it = new String[2564];
int i = 0;
while(st.hasMoreTokens()){
String city = st.nextToken();
it[i] = city;
i = i + 1;
}
return it;
}
return null;
}
将两个文件分别解析后,得到的是两个字符串数组,这里需要注意的是,两个数组中的城市名和城市码之间是一一对应的。所以接下来要将它们组合起来,得到一个二维数组,一个城市名对应一个城市码,共2564个城市,代码如下:
public static String[][] range(String[] city, String[] code){
String[][] str = new String[2564][2];
for (int i = 0; i < str.length; i++) {
str[i][0] = code[i];
str[i][1] = city[i];
}
return str;
}
这样,就得到了一个包含着城市名和城市码的二维数组,然后就是创建数据库,创建表,将数据插入到表中。
在SQLite中对数据库操作要首先获得一个 SQLiteOpenHelper 对象,但是这个类是一个抽象类,需要创建一个类去实现它,然后继承它的方法,这里给出一个简单的实现类:
public class DatabaseHelper extends SQLiteOpenHelper {
private static final int VERSION = 1;
public DatabaseHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
public DatabaseHelper(Context context, String name, int version){
this(context, name, null, version);
}
public DatabaseHelper(Context context, String name){
this(context, name, VERSION);
}
public void onCreate(SQLiteDatabase db) {
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
继承后要实现的有 onCreate 和 onUpgrade 两个方法。得到SQLiteOpenHelper 对象后就可以创建数据库了。这里介绍两个方法: getReadableDatabase 和getWritableDatabase ,由字面意思我们就可以理解他们的含义:获得一个可读的数据库和获得一个可写的数据库。针对不同的操作选用不同的方法,当数据库不存在的时候,直接创建这个数据库。所以,要创建一个数据库的时候直接调用它们即可,代码如下:
class CreateDatabaseListener implements OnClickListener {
public void onClick(View arg0) {
DatabaseHelper dbHelper = new DatabaseHelper(SqliteActivity.this,
"panda_weather");
dbHelper.getReadableDatabase();
上一篇:
关于android手机的论文
下一篇:
试论APP广告在手机中的应用