酷乐天气开发记录总结2 创建数据库和表

数据库设计:

建立三张表:Province、city、county

1、province

Id:自增主键

Province_name:省级名称

Province_code:省级代码

2、city

Id:自增主键

City_name:城市名称a

City_code:城市代码

Province_id:city表关联province表的外键

3、county

Id:自增主键

Id:自增主键

County_name:县级名称

County_code:县级代码

City_id:county表关联city表的外键

新建CoolWeatherOpenHelper,将创建表定义为常量,方便使用:

CREATE_PROVINCE,CREATE_CITY,CREATE_COUNTY,以CREATE_PROVINCE为例

public static final String CREATE_PROVINCE= "create table Province ("

+ "id integer primary keyautoincrement, "//自增主键

+ "province_name text, "

+ "province_code text)";

定义完常量之后,创建SQLiteOpenHelper方法(Android为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper 帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。SQLiteOpenHelper 是一个抽象类,这意味着如果我们想要使用它的话,

就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper 中有两个抽象方法,分别是

onCreate()和 onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两

个方法中去实现创建、升级数据库的逻辑。)

public CoolWeatherOpenHelper(Contextcontext, String name, CursorFactory factory,
                            intversion) {
                   super(context,name, factory, version);
         }

其中第一个参数是context,上下文对象很多方法需要通过Context才能识别调用者的实例,比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替,代表调用者的实例为Activity,而到了一个buttononClick(View view)等方法时,我们用this时就会报错,所以我们可能使用ActivityName.this来解决,主要原因是因为实现Context的类主要有Android特有的几个模型,ActivityService以及BroadcastReceiver

第二个参数是数据库名。

第三个参数是允许我们在查询数据的时候返回一个自定义的cursor。

第四个参数是表示当前数据库的版本号,可用于对数据库进行升级操作。

public void onCreate(SQLiteDatabase db) {
                   db.execSQL(CREATE_PROVINCE);  // 创建Province表
                   db.execSQL(CREATE_CITY);  // 创建City表
                   db.execSQL(CREATE_COUNTY);  // 创建County表
         }
public void onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion) {
         }

其中在onCreate方法中调用execSQL方法,创建表。

然后在model包里创建实体类province,city,county类,方便我们之后的数据操作。有关于实体类的定义和意义参照网站:

http://zhan.renren.com/xinsiwei?gid=3602888498039286456&checked=true

例如:province类

public class Province {
         privateint id;
         privateString provinceName;
         privateString provinceCode;
         publicint getId() {
                   returnid;
         }
         publicvoid setId(int id) {
                   this.id= id;
         }
         publicString getProvinceName() {
                   returnprovinceName;
         }
         publicvoid setProvinceName(String provinceName) {
                   this.provinceName= provinceName;
         }
         publicString getProvinceCode() {
                   returnprovinceCode;
         }
         publicvoid setProvinceCode(String provinceCode) {
                   this.provinceCode= provinceCode;
         }
}

可以看到,创建实体类的方法非常简单,只需要创建get,set方法即可。

创建CoolWeatherDb类,用于将一些常用的数据库操作封装起来,方便之后使用。

创建常量:

public static final String DB_NAME ="cool_weather";//数据库名称
public static final int VERSION = 1;//数据库版本
private static CoolWeatherDB coolWeatherDB;
private SQLiteDatabase db;

将构造方法私有化:

private CoolWeatherDB(Context context) {
                   CoolWeatherOpenHelperdbHelper = new CoolWeatherOpenHelper(context,
                                     DB_NAME,null, VERSION);
                   db= dbHelper.getWritableDatabase();
         }

构造函数:http://segmentfault.com/q/1010000000117838

private CoolWeatherDB(Context context) {
                   CoolWeatherOpenHelperdbHelper = new CoolWeatherOpenHelper(context,
                                     DB_NAME,null, VERSION);
                   db= dbHelper.getWritableDatabase();
         }

获取单实例:http://www.cnblogs.com/whgw/archive/2011/10/05/2199535.html

public synchronized static CoolWeatherDBgetInstance(Context context) {
                   if(coolWeatherDB == null) {
                            coolWeatherDB= new CoolWeatherDB(context);
                   }
                   returncoolWeatherDB;
         }

Synchronized:当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

http://www.cnblogs.com/gnagwang/archive/2011/02/27/1966606.html

getInstance:是一个函数,可以使用这种方式使用单例模式创建类的实例,所谓单例模式就是一个类有且只有一个实例,

http://xiaodiandian.iteye.com/blog/665104

http://bbs.csdn.net/topics/190163233

将province,city,county实例存储到数据库中

public void saveProvince(Province province){
                   if(province != null) {
                            ContentValuesvalues = new ContentValues();
                            values.put("province_name",province.getProvinceName());
                            values.put("province_code",province.getProvinceCode());
                            db.insert("Province",null, values);
                   }
         }

利用ContentValues方法进行赋值。

从数据库中读取province,city,county信息

public List<Province> loadProvinces(){
                   List<Province>list = new ArrayList<Province>();
                   Cursorcursor = db
                                     .query("Province",null, null, null, null, null, null);
                   if(cursor.moveToFirst()) {
                            do{
                                     Provinceprovince = new Province();
                                     province.setId(cursor.getInt(cursor.getColumnIndex("id")));
                                     province.setProvinceName(cursor.getString(cursor
                                                        .getColumnIndex("province_name")));
                                     province.setProvinceCode(cursor.getString(cursor
                                                        .getColumnIndex("province_code")));
                                     list.add(province);
                            }while (cursor.moveToNext());
                   }
                   returnlist;
         }

首先定义一个集合,并将其初始化,然后定义游标,用于遍历查询。

Cursor 是每行的集合。

cursor.moveToFirst()定位第一行

cursor.moveToNext()光标移动到下一行

cursor.getColumnIndex返回指定列的名称

http://www.cnblogs.com/terryblog/archive/2010/07/05/1771459.html

先找到表的列是province_name的列,然后将数据提取出来,给province赋值。

List.add(province)将数据添加到集合中

loadProvinces方法返回值是list